web-dev-qa-db-ja.com

xgboostで機能の重要性を取得する方法は?

Xgboostを使用してモデルを構築し、get_fscore()を使用して各機能の重要性を見つけようとしていますが、{}

私の列車コードは次のとおりです。

dtrain = xgb.DMatrix(X, label=Y)
watchlist = [(dtrain, 'train')]
param = {'max_depth': 6, 'learning_rate': 0.03}
num_round = 200
bst = xgb.train(param, dtrain, num_round, watchlist)

それで私の電車に何か間違いはありますか? xgboostで機能の重要性を取得する方法は?

14
modkzs

コードでは、各機能の機能の重要度をdict形式で取得できます。

bst.get_score(importance_type='gain')

>>{'ftr_col1': 77.21064539577829,
   'ftr_col2': 10.28690566363971,
   'ftr_col3': 24.225014841466294,
   'ftr_col4': 11.234086283060112}

説明:train()APIのメソッドget_score()は次のように定義されています:

get_score(fmap = ''、important_type = 'weight')

  • fmap(str(オプション))–機能マップファイルの名前。
  • importance_type
    • 「重み」-フィーチャがすべてのツリーにデータを分割するために使用される回数。
    • 「ゲイン」-機能が使用されるすべての分割にわたる平均ゲイン。
    • 「カバー」-機能が使用されるすべての分割にわたる平均カバレッジ。
    • 「total_gain」-機能が使用されるすべてのスプリットの合計ゲイン。
    • 「total_cover」-機能が使用されるすべての分割にわたるカバレッジの合計。

https://xgboost.readthedocs.io/en/latest/python/python_api.html

17
MLKing

Sklearn APIとXGBoost> = 0.81を使用:

clf.get_booster().get_score(importance_type="gain")

または

regr.get_booster().get_score(importance_type="gain")

これが正しく機能するためには、regr.fit(またはclf.fit)を呼び出すとき、Xpandas.DataFrameでなければなりません。

8
Sesquipedalism

確かに値を取得する方法はわかりませんが、特徴の重要度をプロットする良い方法があります。

model = xgb.train(params, d_train, 1000, watchlist)
fig, ax = plt.subplots(figsize=(12,18))
xgb.plot_importance(model, max_num_features=50, height=0.8, ax=ax)
plt.show()
7
Kirill Dolmatov

これを試して

fscore = clf.best_estimator_.booster().get_fscore()
7
koalagreener

機能の重要性については、これを試してください:

分類:

pd.DataFrame(bst.get_fscore().items(), columns=['feature','importance']).sort_values('importance', ascending=False)

回帰:

xgb.plot_importance(bst)
5
Roozbeh

最初にXGboostからモデルを構築します

from xgboost import XGBClassifier, plot_importance
model = XGBClassifier()
model.fit(train, label)

これは配列になります。降順でソートできます

sorted_idx = np.argsort(model.feature_importances_)[::-1]

次に、ソートされたすべての重要度と列の名前をリストとして一緒に印刷します(パンダでロードされたデータを想定しています)

for index in sorted_idx:
    print([train.columns[index], model.feature_importances_[index]]) 

さらに、XGboost組み込み関数を使用して重要度をプロットできます

plot_importance(model, max_num_features = 15)
pyplot.show()

つかいます max_num_features in plot_importance必要に応じて機能の数を制限します。

5
Steven Hu

scoresおよびfeature namesを含むテーブルを取得し、プロットします。

feature_important = model.get_score(importance_type='weight')
keys = list(feature_important.keys())
values = list(feature_important.values())

data = pd.DataFrame(data=values, index=keys, columns=["score"]).sort_values(by = "score", ascending=False)
data.plot(kind='barh')

例えば:

enter image description here

3
Catbuilts

xgb.XGBRegressor()を使用中にこの問題に遭遇した人にとって、私が使用している回避策は、データをpandas.DataFrame()またはnumpy.array()に保持し、データを変換しないことです。 dmatrix()に。また、gammaパラメーターがXGBRegressorに指定されていないことを確認する必要がありました。

fit = alg.fit(dtrain[ft_cols].values, dtrain['y'].values)
ft_weights = pd.DataFrame(fit.feature_importances_, columns=['weights'], index=ft_cols)

リグレッサを適合させた後fit.feature_importances_は、pandasデータフレームの機能列と同じ順序である仮定である重みの配列を返します。

私の現在の設定は、Ubuntu 16.04、Anaconda distro、python 3.6、xgboost 0.6、sklearn 18.1です。

3
BCR
print(model.feature_importances_)

plt.bar(range(len(model.feature_importances_)), model.feature_importances_)
0