我用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
答案 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>