我知道这个问题已经被问过好几次了,我已经阅读过它们,但仍然无法弄清楚。 和其他人一样,我的功能名称最后显示为 f56、f234、f12 等,我想要实际的名称而不是 f-something!这是与模型相关的代码部分:
optimized_params, xgb_model = find_best_parameters() #where fitting and GridSearchCV happens
xgdmat = xgb.DMatrix(X_train_scaled, y_train_scaled)
feature_names=xgdmat.feature_names
final_gb = xgb.train(optimized_params, xgdmat, num_boost_round =
find_optimal_num_trees(optimized_params,xgdmat))
final_gb.get_fscore()
mapper = {'f{0}'.format(i): v for i, v in enumerate(xgdmat.feature_names)}
mapped = {mapper[k]: v for k, v in final_gb.get_fscore().items()}
mapped
xgb.plot_importance(mapped, color='red')
我也尝试过这个:
feature_important = final_gb.get_score(importance_type='weight')
keys = list(feature_important.keys())
values = list(feature_important.values())
data = pd.DataFrame(data=values, index=keys, columns=["score"]).sort_values(by = "score", ascending=False)
data.plot(kind='barh')
但特征仍然显示为 f+number。我真的很感激任何帮助。
我现在正在做的是获取 fs 末尾的数字,例如 f234 中的 234 并在 X_train.columns[234] 中使用它来查看实际名称是什么。但是,我重新考虑了,因为我通过这种方式得到的名称是 f234 所代表的实际功能。
最佳答案
首先根据原始特征创建一个字典,并将它们映射回特征名称。
# create dict to use later
myfeatures = X_train_scaled.columns
dict_features = dict(enumerate(myfeatures))
# feat importance with names f1,f2,...
axsub = xgb.plot_importance(final_gb )
# get the original names back
Text_yticklabels = list(axsub.get_yticklabels())
dict_features = dict(enumerate(myfeatures))
lst_yticklabels = [ Text_yticklabels[i].get_text().lstrip('f') for i in range(len(Text_yticklabels))]
lst_yticklabels = [ dict_features[int(i)] for i in lst_yticklabels]
axsub.set_yticklabels(lst_yticklabels)
print(dict_features)
plt.show()
关于python - 从 XGBoost 模型中获取实际特征名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59341289/