Как обозначить важность признака лесами деревьев?
Я использую sklearn для построения важности функции для лесов деревьев. Фрейм данных называется "Сердце". Вот код для извлечения списка отсортированных функций:
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)
и я получаю такой сюжет:
мой вопрос: как я могу заменить номер объекта именем объекта, чтобы сделать сюжет более понятным? Я пытался преобразовать строку, содержащую имя объекта (имя каждого столбца в кадр данных), но я не могу достичь своей цели.
спасибо
3 ответов
проблема:
plt.xticks(range(heart_train.shape[1]), indices)
indices
- это массив индексов, возвращаемых из вашего np.argsort(importances)[::-1]
, у него нет имена вы хотите появиться как тики на вашей оси X.
вам нужно что-то вроде этого, предполагая, что df
Это ваш фрейм данных панды
feature_names = df.columns # e.g. ['A', 'B', 'C', 'D', 'E']
plt.xticks(range(heart_train.shape[1]), feature_names)
вы можете использовать xgboost в своей модели для простого построения важности объектов с помощью метода-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()
этот код дает вам такой сюжет:
Я вижу, что это старый, но для потомков, если вы хотите получить feature_name
из решения @bakkal в правильном порядке вы можете использовать
feature_names = [features_names[i] for i in indices]