Переменные важности графика xgboost Python

Когда я рисую важность функции, я получаю этот беспорядочный график. У меня более 7000 переменных. Я понимаю, что встроенная функция выбирает только самые важные, хотя окончательный график не читается. Это полный код:

import numpy as np
import pandas as pd
df = pd.read_csv('ricerice.csv')
array=df.values
X = array[:,0:7803]
Y = array[:,7804]
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
seed=0
test_size=0.30
X_train, X_test, y_train, y_test = train_test_split(X,Y,test_size=test_size, random_state=seed)
from xgboost import XGBClassifier
model = XGBClassifier()
model.fit(X, Y)
import matplotlib.pyplot as plt
from matplotlib import pyplot
from xgboost import plot_importance
fig1=plt.gcf()
plot_importance(model)
plt.draw()
fig1.savefig('xgboost.png', figsize=(50, 40), dpi=1000)

Хотя размер рисунка, на графике неразборчиво. График важности функции xgboost


person Roxana Noelia    schedule 18.08.2018    source источник


Ответы (2)


Есть пара моментов:

  1. Чтобы соответствовать модели, вы хотите использовать набор данных для обучения (X_train, y_train), а не весь набор данных (X, y).
  2. Вы можете использовать параметр max_num_features функции plot_importance(), чтобы отображать только первые max_num_features функции (например, 10 лучших).

С указанными выше модификациями вашего кода, с некоторыми случайно сгенерированными данными, код и выходные данные выглядят следующим образом:

import numpy as np

# generate some random data for demonstration purpose, use your original dataset here
X = np.random.rand(1000,100)     # 1000 x 100 data
y = np.random.rand(1000).round() # 0, 1 labels

from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
seed=0
test_size=0.30
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=test_size, random_state=seed)
from xgboost import XGBClassifier
model = XGBClassifier()
model.fit(X_train, y_train)
import matplotlib.pylab as plt
from matplotlib import pyplot
from xgboost import plot_importance
plot_importance(model, max_num_features=10) # top 10 most important features
plt.show()

введите описание изображения здесь

person Sandipan Dey    schedule 18.08.2018
comment
Огромное спасибо! Я поправлю код и расскажу об этом! - person Roxana Noelia; 18.08.2018
comment
У меня были проблемы со средой conda, но после этого я смог получить четкий график. БЛАГОДАРЮ ВАС! - person Roxana Noelia; 18.08.2018
comment
как мне узнать, что такое f39? - person Maths12; 27.05.2020
comment
используйте model.get_booster().get_score(importance_type='weight'), чтобы узнать важность всех функций. - person Sandipan Dey; 27.05.2020

Вы можете получить важность функции из модели Xgboost с атрибутом feature_importances_. В вашем случае это будет:

model.feature_imortances_

Этот атрибут представляет собой массив с gain важностью для каждой функции. Затем вы можете построить его:

from matplotlib import pyplot as plt
plt.barh(feature_names, model.feature_importances_)

(feature_names - это список с названиями функций)

Вы можете отсортировать массив и выбрать необходимое количество функций (например, 10):

sorted_idx = model.feature_importances_.argsort()
plt.barh(feature_names[sorted_idx][:10], model.feature_importances_[sorted_idx][:10])
plt.xlabel("Xgboost Feature Importance")

Есть еще два метода определения важности функции:

  • можно использовать permutation_importance от scikit-learn (с версии 0.22)
  • вы можете использовать значения SHAP

Вы можете прочитать больше в этом моем сообщении в блоге.

person pplonski    schedule 17.08.2020