Python 从XGBoost模型中获取实际要素名称

Python 从XGBoost模型中获取实际要素名称,python,pandas,plot,xgboost,Python,Pandas,Plot,Xgboost,我知道这个问题已经被问过好几次了,我也读过了,但仍然没有弄明白。 像其他人一样,我的功能名称在末尾显示为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)

我知道这个问题已经被问过好几次了,我也读过了,但仍然没有弄明白。 像其他人一样,我的功能名称在末尾显示为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。我真的很感激任何帮助


我现在要做的是从f234中获取fs末尾的数字,比如234,然后在X_train.columns[234]中使用它来查看实际名称。然而,我有第二个想法,因为我用这种方式得到的名称是f234所代表的实际功能。

首先从原始功能制作一个字典,并将它们映射回功能名称

创建dict以供以后使用 myfeatures=X\u列\u缩放列 dict_功能=dict功能 使用名称f1、f2、,。。。 axsub=xgb.plot\u importancefinal\u gb 找回原来的名字 Text\u yticklabels=listaxsub.get\u yticklabels dict_功能=dict功能 lst_yticklabels=[Text_yticklabels[i]。在rangelenText_yticklabels中为i获取_Text.lstrip'f] lst_yticklabels=[lst_yticklabels中i的dict_功能[inti] axsub.set_yticklabelslt_yticklabels printdict_特征 节目 以下是其工作原理的示例:

首先从原始要素制作一个词典,并将它们映射回要素名称

创建dict以供以后使用 myfeatures=X\u列\u缩放列 dict_功能=dict功能 使用名称f1、f2、,。。。 axsub=xgb.plot\u importancefinal\u gb 找回原来的名字 Text\u yticklabels=listaxsub.get\u yticklabels dict_功能=dict功能 lst_yticklabels=[Text_yticklabels[i]。在rangelenText_yticklabels中为i获取_Text.lstrip'f] lst_yticklabels=[lst_yticklabels中i的dict_功能[inti] axsub.set_yticklabelslt_yticklabels printdict_特征 节目 以下是其工作原理的示例:

在创建xgb.DMatrix时,使用feature_names参数可以解决此问题


xgdmat=xgb.DMatrix\u train\u scaled,y\u train\u scaled,feature\u names=feature\u names

创建xgb.DMatrix时使用feature\u names参数可以解决此问题


xgdmat=xgb.DMatrixX\u train\u scaled,y\u train\u scaled,feature\u names=feature\u names

非常值得赞赏的是,只有X\u train\u scaled是一个数组,因此没有列。我用X_火车替换了它,它工作了。我还能够验证我的老方法,即在X_train.columns[number]中使用数字,显然这也给出了正确的答案。非常感谢,只有X_train_scaled是一个数组,所以没有列。我用X_火车替换了它,它工作了。我还能够验证我的老方法,即在X_train.columns[number]中使用数字,显然这也给出了正确的答案。谢谢