うまくいけば私はこれを間違って読んでいますが、XGBoostライブラリでは documentation に、sklearnのランダムフォレストのようにfeature_importances_
を使用して機能の重要度属性を抽出するメモがあります。
ただし、何らかの理由で、次のエラーが表示され続けます: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_
get_fscore
属性を呼び出すことにより、Booster
オブジェクトを使用して機能の重要度を計算できるようです。 XGBClassifier
をBooster
で使用している唯一の理由は、sklearnパイプラインでラップできるからです。特徴抽出に関する考えはありますか?他の誰かがこれを経験していますか?
コメントが示すように、あなたの問題はバージョン管理の問題だと思います。ただし、更新したくない/更新できない場合は、次の機能が動作するはずです。
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}
答えを見つけました。バージョン0.4a30
にはfeature_importance_
属性がないようです。したがって、pip install xgboost
を使用してxgboostパッケージをインストールすると、XGBClassifier
オブジェクトから機能抽出を実行できなくなります。回避策が必要な場合は、@ Davidの回答を参照できます。
ただし、レポジトリのクローンを作成して. ./build.sh
を実行してソースからビルドし、0.4
属性が機能するバージョンfeature_importance_
をインストールします。
これが他の人に役立つことを願っています!
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, )
フィーチャーの重要度をソートされたデータフレームとして取得する
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)
LuísBianchin 、 "TypeError: 'str' object is callable"と同じ問題を抱えている人のために、私は解決策を見つけました(少なくとも私には有効です) here 。
要するに、 David のコードを変更しているのが見つかりました
imp_vals = xgb.booster().get_fscore()
に
imp_vals = xgb.get_fscore()
私のために働いた。
詳細については、上記のリンクをご覧になることをお勧めします。
David および ianozsvald に大きな感謝