如何用树木的森林来标记特征的重要性?
HOW TO LABEL the FEATURE IMPORTANCE with forests of trees?
我使用 sklearn 来绘制森林的特征重要性。数据框名为 'heart'。这里是提取排序特征列表的代码:
importances = extc.feature_importances_
indices = np.argsort(importances)[::-1]
print("Feature ranking:")
for f in range(heart_train.shape[1]):
print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))
然后我以这种方式绘制列表:
f, ax = plt.subplots(figsize=(11, 9))
plt.title("Feature ranking", fontsize = 20)
plt.bar(range(heart_train.shape[1]), importances[indices],
color="b",
align="center")
plt.xticks(range(heart_train.shape[1]), indices)
plt.xlim([-1, heart_train.shape[1]])
plt.ylabel("importance", fontsize = 18)
plt.xlabel("index of the feature", fontsize = 18)
我得到这样的情节:
我的问题是:如何用要素的名称替换要素的编号以使情节更易于理解?
我试图转换包含特征名称的字符串(这是数据框每一列的名称),但我无法达到目的。
谢谢
问题出在这里:
plt.xticks(range(heart_train.shape[1]), indices)
indices
是从您的 np.argsort(importances)[::-1]
返回的索引数组,它没有您想在X轴.
你需要这样的东西,假设 df
是你的 Pandas DataFrame
feature_names = df.columns # e.g. ['A', 'B', 'C', 'D', 'E']
plt.xticks(range(heart_train.shape[1]), feature_names)
我看到这是旧的,但为了后代,如果你想以正确的顺序从@bakkal 的解决方案中获得 feature_name
,你可以使用
feature_names = [features_names[i] for i in indices]
您可以在模型中使用 xgboost,通过使用 method-plot_importance(model)
以简单的方式绘制特征的重要性
from xgboost import plot_importance,XGBClassifier
model=XGBClassifier(n_estimators=1000,learning_rate=0.5)
x_train,x_test,y_train,y_test=model_selection.train_test_split(features,label,test_size=0.2)
model.fit(x_train,y_train,early_stopping_rounds=5,eval_set=[(x_test,y_test)])
plot_importance(model)
plt.show()
此代码为您提供如下图:
我使用 sklearn 来绘制森林的特征重要性。数据框名为 'heart'。这里是提取排序特征列表的代码:
importances = extc.feature_importances_
indices = np.argsort(importances)[::-1]
print("Feature ranking:")
for f in range(heart_train.shape[1]):
print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))
然后我以这种方式绘制列表:
f, ax = plt.subplots(figsize=(11, 9))
plt.title("Feature ranking", fontsize = 20)
plt.bar(range(heart_train.shape[1]), importances[indices],
color="b",
align="center")
plt.xticks(range(heart_train.shape[1]), indices)
plt.xlim([-1, heart_train.shape[1]])
plt.ylabel("importance", fontsize = 18)
plt.xlabel("index of the feature", fontsize = 18)
我得到这样的情节:
我的问题是:如何用要素的名称替换要素的编号以使情节更易于理解? 我试图转换包含特征名称的字符串(这是数据框每一列的名称),但我无法达到目的。
谢谢
问题出在这里:
plt.xticks(range(heart_train.shape[1]), indices)
indices
是从您的 np.argsort(importances)[::-1]
返回的索引数组,它没有您想在X轴.
你需要这样的东西,假设 df
是你的 Pandas DataFrame
feature_names = df.columns # e.g. ['A', 'B', 'C', 'D', 'E']
plt.xticks(range(heart_train.shape[1]), feature_names)
我看到这是旧的,但为了后代,如果你想以正确的顺序从@bakkal 的解决方案中获得 feature_name
,你可以使用
feature_names = [features_names[i] for i in indices]
您可以在模型中使用 xgboost,通过使用 method-plot_importance(model)
以简单的方式绘制特征的重要性from xgboost import plot_importance,XGBClassifier
model=XGBClassifier(n_estimators=1000,learning_rate=0.5)
x_train,x_test,y_train,y_test=model_selection.train_test_split(features,label,test_size=0.2)
model.fit(x_train,y_train,early_stopping_rounds=5,eval_set=[(x_test,y_test)])
plot_importance(model)
plt.show()
此代码为您提供如下图: