XGBoost plot_importance无法显示功能名称

时间:2018-06-06 21:59:01

标签: machine-learning xib xgboost

我用plot_importance向我展示了重要变量。但是有些变量是绝对的,所以我做了一些改造。在我转换变量的类型后,当我绘制重要性特征时,绘图不会显示我的特征名称。我附上了我的代码和情节。     dataset = data.values     X =数据集[1:100,0:-2]

predictors=dataset[1:100,-1]

X = X.astype(str)
encoded_x = None
for i in range(0, X.shape[1]):
    label_encoder = LabelEncoder()
    feature = label_encoder.fit_transform(X[:,i])
    feature = feature.reshape(X.shape[0], 1)
    onehot_encoder = OneHotEncoder(sparse=False)
    feature = onehot_encoder.fit_transform(feature)
    if encoded_x is None:
        encoded_x = feature
    else:
        encoded_x = np.concatenate((encoded_x, feature), axis=1)
print("X shape: : ", encoded_x.shape)


response='Default'
#predictors=list(data.columns.values[:-1])



# Randomly split indexes
X_train, X_test, y_train, y_test = train_test_split(encoded_x,predictors,train_size=0.7, random_state=5)



model = XGBClassifier()
model.fit(X_train, y_train)


plot_importance(model)
plt.show()

[enter image description here][1]


  [1]: https://i.stack.imgur.com/M9qgY.png

1 个答案:

答案 0 :(得分:1)

这是预期的行为 - sklearn.OneHotEncoder.transform()返回一个numpy 2d数组而不是输入pd.DataFrame(我假设你的dataset的类型)。所以它不是一个bug,而是一个功能。看起来没有办法在sklearn API中手动传递功能名称(可以在原生训练API中的xgb.Dmatrix创建中设置这些功能名称。)

但是,使用pd.get_dummies()代替您实施的LabelEncoder + OneHotEncoder组合,您的问题很容易解决。我不知道你为什么选择使用它(它可能很有用,如果你还需要处理一个测试集但是你需要玩额外的技巧),但我会建议赞成pd.get_dummies() < / p>