КАК МАРКИРОВАТЬ ОСОБЕННОСТИ ЗНАЧЕНИЯ с лесами деревьев?

Я использую 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)

Я вижу, что это старый, но для потомков, если вы хотите получить feature_name из решения @bakkal в правильном порядке, вы можете использовать

feature_names = [features_names[i] for i in indices]

Вы можете использовать xgboost в вашей модели для простого отображения важности объектов с помощью метода plot_importance(модель)

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()

Этот код дает вам такой график:

график с помеченными именами объектов по оси y, отсортированный по важности и их важности по оси x

Другие вопросы по тегам