Значение важности с помощью XGBClassifier
Надеюсь, что я читаю это неправильно, но в библиотеке XGBoost документации, обратите внимание на извлечение атрибутов важности функции с помощью feature_importances_
much как случайный лес sklearn.
Однако по какой-то причине я продолжаю получать эту ошибку: AttributeError: 'XGBClassifier' object has no attribute 'feature_importances_'
Мой фрагмент кода ниже:
from sklearn import datasets
import xgboost as xg
iris = datasets.load_iris()
X = iris.data
Y = iris.target
Y = iris.target[ Y < 2] # arbitrarily removing class 2 so it can be 0 and 1
X = X[range(1,len(Y)+1)] # cutting the dataframe to match the rows in Y
xgb = xg.XGBClassifier()
fit = xgb.fit(X, Y)
fit.feature_importances_
Кажется, что вы можете вычислить значение функции с помощью объекта Booster
, вызвав атрибут get_fscore
. Единственная причина, по которой я использую XGBClassifier
over Booster
, - это то, что она может быть завернута в конвейер sklearn. Любые мысли о выделении функций? Кто-нибудь еще испытывает это?
Ответы
Ответ 1
Как видно из комментариев, я подозреваю, что ваша проблема является версией. Однако, если вы не хотите/не можете обновить, то для вас будет работать следующая функция.
def get_xgb_imp(xgb, feat_names):
from numpy import array
imp_vals = xgb.booster().get_fscore()
imp_dict = {feat_names[i]:float(imp_vals.get('f'+str(i),0.)) for i in range(len(feat_names))}
total = array(imp_dict.values()).sum()
return {k:v/total for k,v in imp_dict.items()}
>>> import numpy as np
>>> from xgboost import XGBClassifier
>>>
>>> feat_names = ['var1','var2','var3','var4','var5']
>>> np.random.seed(1)
>>> X = np.random.rand(100,5)
>>> y = np.random.rand(100).round()
>>> xgb = XGBClassifier(n_estimators=10)
>>> xgb = xgb.fit(X,y)
>>>
>>> get_xgb_imp(xgb,feat_names)
{'var5': 0.0, 'var4': 0.20408163265306123, 'var1': 0.34693877551020408, 'var3': 0.22448979591836735, 'var2': 0.22448979591836735}
Ответ 2
Я узнал ответ. Похоже, что версия 0.4a30
не имеет атрибута feature_importance_
. Поэтому, если вы устанавливаете пакет xgboost с помощью pip install xgboost
, вы не сможете выполнить извлечение функции из объекта XGBClassifier
, вы можете обратиться к ответу @David, если вы хотите обходной путь.
Однако я создал его из источника, клонируя репо и запуская . ./build.sh
, который установит версию 0.4
, где работает атрибут feature_importance_
.
Надеюсь, это поможет другим!
Ответ 3
Для xgboost
, если вы используете xgb.fit()
, вы можете использовать следующий метод для получения важности функции.
import pandas as pd
xgb_model=xgb.fit(x,y)
xgb_fea_imp=pd.DataFrame(list(xgb_model.get_booster().get_fscore().items()),
columns=['feature','importance']).sort_values('importance', ascending=False)
print('',xgb_fea_imp)
xgb_fea_imp.to_csv('xgb_fea_imp.csv')
from xgboost import plot_importance
plot_importance(xgb_model, )
Ответ 4
Получить значение важности в качестве упорядоченного кадра данных
import pandas as pd
import numpy as np
def get_xgb_imp(xgb, feat_names):
imp_vals = xgb.booster().get_fscore()
feats_imp = pd.DataFrame(imp_vals,index=np.arange(2)).T
feats_imp.iloc[:,0]= feats_imp.index
feats_imp.columns=['feature','importance']
feats_imp.sort_values('importance',inplace=True,ascending=False)
feats_imp.reset_index(drop=True,inplace=True)
return feats_imp
feature_importance_df = get_xgb_imp(xgb, feat_names)
Ответ 5
Для тех, у кого та же проблема, что и у Луи Бианчина: "объект TypeError: 'str' не вызывается", я нашел решение (которое работает, по крайней мере, для меня) здесь.
Короче говоря, я нашел модифицирующий код Дэвида из
imp_vals = xgb.booster().get_fscore()
в
imp_vals = xgb.get_fscore()
работал на меня.
Для более подробной информации я бы рекомендовал посетить ссылку выше.
Большое спасибо Давиду и Янозсвальду
Ответ 6
Обновление принятого ответа, так как он больше не работает:
def get_xgb_imp(xgb, feat_names):
imp_vals = rgrs.get_fscore()
imp_dict = {feat: float(imp_vals.get(feat, 0.)) for feat in feat_names}
total = sum(list(imp_dict.values()))
return {k: round(v/total, 5) for k,v in imp_dict.items()}