ゲームAI備忘録

ゲームAIに使えそうな知識を備忘録として書き留める

人助けと思って何卒インストールをば! 詰碁/ アルコネ/ 五目並べ

XgboostのFeature Imporanceをラベル付きで表示する方法

特定の変数や上位N件だけ表示など,plot_importance関数を使わずにFeature Importanceを表示する方法.

# plot_feature_importance_with_label.py
import operator
from sklearn.datasets import load_iris
import pandas as pd
import matplotlib.pyplot as plt
import xgboost as xgb

def create_feature_map(features):
    with open('xgb.fmap', 'w') as fp:
        for i, feat in enumerate(features):
            fp.write('%d\t%s\tq\n' % (i, feat))

def run():
    iris = load_iris()
    dtrain = xgb.DMatrix(data = iris.data, label=iris.target)
    params = {'objective': 'multi:softprob', 'num_class': len(iris.feature_names)}
    model = xgb.train(params, dtrain)
    create_feature_map([_.replace(" ", "") for _ in iris.feature_names])
    importance = model.get_fscore(fmap='xgb.fmap')
    importance = sorted(importance.items(), key=operator.itemgetter(1))
    df = pd.DataFrame(importance, columns=['feature', 'fscore'])
    df['fscore'] = df['fscore'] / df['fscore'].sum()
    plt.rcParams['font.size'] = 9
    df.plot(kind='barh', x='feature', y='fscore', legend=False)
    plt.title('XGBoost Feature Importance')
    plt.xlabel('relative importance')
    plt.show()

if __name__ == "__main__":
    run()

結果

$python plot_feature_importance_with_label.py 

f:id:namakemono_srm:20160506162257p:plain

$ cat xgb.fmap
0	sepallength(cm)	q
1	sepalwidth(cm)	q
2	petallength(cm)	q
3	petalwidth(cm)	q