web-dev-qa-db-ja.com

Python3でxgboostモデルから決定ルール(機能分割)を抽出する方法は?

Pythonでフィッティングしたxgboostモデルから決定ルールを抽出する必要があります。 xgboostライブラリの0.6a2バージョンを使用していますが、pythonバージョンは3.5.2です。

私の最終的な目標は、それらのスプリットを使用して変数をビンに入れることです(スプリットに従って)。

私はこのバージョンのモデルの特性に出くわすことはありませんでした。

plot_treeは私に似たようなものを与えています。ただし、ツリーの視覚化です。

私は https://stackoverflow.com/a/39772170/455907 のようなものが必要ですxgboostモデル

10
Artiga

それは可能ですが、簡単ではありません。 GradientBoostingClassifierに似ていますが、構築されたツリーにネイティブにアクセスできるscikit-learnxgboostを使用することをお勧めします。

ただし、xgboostを使用すると、モデルのテキスト表現を取得して解析できます。

from sklearn.datasets import load_iris
from xgboost import XGBClassifier
# build a very simple model
X, y = load_iris(return_X_y=True)
model = XGBClassifier(max_depth=2, n_estimators=2)
model.fit(X, y);
# dump it to a text file
model.get_booster().dump_model('xgb_model.txt', with_stats=True)
# read the contents of the file
with open('xgb_model.txt', 'r') as f:
    txt_model = f.read()
print(txt_model)

次のように、6つのツリーのテキストによる説明が出力されます(2つの推定量、それぞれがクラスごとに3つのツリーで構成されます)。

booster[0]:
0:[f2<2.45] yes=1,no=2,missing=1,gain=72.2968,cover=66.6667
    1:leaf=0.143541,cover=22.2222
    2:leaf=-0.0733496,cover=44.4444
booster[1]:
0:[f2<2.45] yes=1,no=2,missing=1,gain=18.0742,cover=66.6667
    1:leaf=-0.0717703,cover=22.2222
    2:[f3<1.75] yes=3,no=4,missing=3,gain=41.9078,cover=44.4444
        3:leaf=0.124,cover=24
        4:leaf=-0.0668394,cover=20.4444
...

たとえば、この説明からすべてのスプリットを抽出できます。

import re
# trying to extract all patterns like "[f2<2.45]"
splits = re.findall('\[f([0-9]+)<([0-9]+.[0-9]+)\]', txt_model)
splits

次のようなタプル(feature_id、split_value)のリストを出力します

[('2', '2.45'),
 ('2', '2.45'),
 ('3', '1.75'),
 ('3', '1.65'),
 ('2', '4.95'),
 ('2', '2.45'),
 ('2', '2.45'),
 ('3', '1.75'),
 ('3', '1.65'),
 ('2', '4.95')]

このリストは、必要に応じてさらに処理できます。

13
David Dale