我正在使用XGBoost和Python,并使用名为train()
数据的XGBoost DMatrix
函数成功训练了一个模型。矩阵是从Pandas数据框创建的,该数据框具有列的特征名称。
Xtrain, Xval, ytrain, yval = train_test_split(df[feature_names], y, \
test_size=0.2, random_state=42)
dtrain = xgb.DMatrix(Xtrain, label=ytrain)
model = xgb.train(xgb_params, dtrain, num_boost_round=60, \
early_stopping_rounds=50, maximize=False, verbose_eval=10)
fig, ax = plt.subplots(1,1,figsize=(10,10))
xgb.plot_importance(model, max_num_features=5, ax=ax)
我现在想要使用xgboost.plot_importance()
函数查看功能重要性,但结果图不会显示功能名称。相反,这些功能会列为f1
,f2
,f3
等,如下所示。
我认为问题在于我将原来的Pandas数据帧转换为DMatrix。如何正确关联要素名称以使特征重要性图显示它们?
答案 0 :(得分:17)
您希望在创建return this.store.findAll('panelist');
feature_names
参数
xgb.DMatrix
答案 1 :(得分:7)
train_test_split
会将数据帧转换为numpy数组,不再有列信息。
您可以执行@piRSquared建议的操作,并将这些功能作为参数传递给DMatrix构造函数。或者,您可以将从train_test_split
返回的numpy数组转换为Dataframe,然后使用您的代码。
Xtrain, Xval, ytrain, yval = train_test_split(df[feature_names], y, \
test_size=0.2, random_state=42)
# See below two lines
X_train = pd.DataFrame(data=Xtrain, columns=feature_names)
Xval = pd.DataFrame(data=Xval, columns=feature_names)
dtrain = xgb.DMatrix(Xtrain, label=ytrain)
答案 2 :(得分:3)
如果您使用scikit-learn包装器,则需要访问基础XGBoost Booster并在其上设置功能名称,而不是scikit模型,如下所示:
False
答案 3 :(得分:1)
我在和feature_names
一起玩时发现了另一种方法。在玩游戏时,我编写了此代码,该代码可在我当前正在运行的XGBoost v0.80上运行。
## Saving the model to disk
model.save_model('foo.model')
with open('foo_fnames.txt', 'w') as f:
f.write('\n'.join(model.feature_names))
## Later, when you want to retrieve the model...
model2 = xgb.Booster({"nthread": nThreads})
model2.load_model("foo.model")
with open("foo_fnames.txt", "r") as f:
feature_names2 = f.read().split("\n")
model2.feature_names = feature_names2
model2.feature_types = None
fig, ax = plt.subplots(1,1,figsize=(10,10))
xgb.plot_importance(model2, max_num_features = 5, ax=ax)
因此,这将分别保存feature_names
并在以后将其重新添加。由于某些原因,feature_types
也需要初始化,即使该值为None
。
答案 4 :(得分:0)
使用Scikit-Learn包装器接口“ XGBClassifier”,plot_importance会返回类“ matplotlib轴”。因此,我们可以使用axes.set_yticklabels。
plot_importance(model).set_yticklabels(['feature1','feature2'])
答案 5 :(得分:0)
如果接受过培训
model = XGBClassifier(
max_depth = 8,
learning_rate = 0.25,
n_estimators = 50,
objective = "binary:logistic",
n_jobs = 4
)
# x, y are pandas DataFrame
model.fit(train_data_x, train_data_y)
您可以执行model.get_booster().get_fscore()
以将功能名称和功能重要性作为python字典获取
答案 6 :(得分:0)
在实例化XGBoost分类器时,应指定feature_names:
s2
请注意,如果将xgb分类器包装在对列执行任何选择的sklearn管道中(例如,VarianceThreshold),则在尝试拟合或变换时,xgb分类器将失败。