如何获取XGBoost模型实际使用的特征列表?
查看XGBoost模型实际使用的特征
有几种直接的方法可以获取模型实际用到的特征:
方法1:使用get_score()方法
XGBoost的模型实例提供了get_score()方法,它会返回一个字典,键是实际被模型用于分裂的特征名,值是该特征在所有树中被用作分裂节点的次数。示例代码:
# 假设model是训练好的XGBoost模型 used_features = model.get_score(importance_type='weight') # 提取所有实际使用的特征名 used_feature_names = list(used_features.keys())
这里importance_type='weight'是默认值,统计的是特征被用作分裂节点的次数,你也可以根据需要选择其他类型(比如gain表示总增益,cover表示覆盖的样本数)。
方法2:解析Booster的树结构
如果你需要更细致的信息,可以直接解析每棵树的结构,提取所有出现的特征:
booster = model.get_booster() used_features = set() # 遍历每棵树 for tree_idx in range(booster.num_trees()): # 获取树的文本表示 tree_str = booster.get_dump(dump_format='text')[tree_idx] # 逐行解析,提取特征名 for line in tree_str.split('\n'): if '[' in line: # 特征名在[和<之间,比如"f0<0.5"中的f0 feature = line.split('[')[1].split('<')[0] # 如果你的特征名不是默认的f0/f1格式,可能需要调整分割逻辑 used_features.add(feature) # 转换为列表 used_feature_names = list(used_features)
这种方法可以精准获取所有在树分裂中出现的特征,适合需要深入分析树结构的场景。
补充说明
你之前的猜测是对的:model.get_booster().feature_names确实返回的是训练数据的所有特征名,不管模型有没有用到它们。
内容的提问来源于stack exchange,提问作者Watchung
相关产品推荐
相关产品推荐

