はじめに
過去2本立ての記事で、「東証1部の銘柄コードに対して翌日の株価トレンド(上昇/下降)を予測する」を紹介しました。
本稿は、そのこぼれ話のTips紹介です。
lightgbm.plot_importance1を利用して特徴量重要度を可視化していましたが、図だと特徴量名や重要度スコアが正直見づらい。。。
というわけで、自身の備忘を兼ねて、表データとして特徴量重要度の情報を確認する方法を紹介します。
時間のない方は、Notebookだけパパっと参照あれ。
結論を言うと、lightgbm.Booster.trees_to_dataframe2を利用します。
本稿で紹介すること
- 特徴量重要度の確認(可視化)
本稿で紹介しないこと
- データの収集および整形
- 特徴量設計
- 予測モデルの作成(含むハイパーパラメータのチューニング)
- 予測精度の確認
Notebook(Pythonコード)
githubで公開しました。
ポイントを簡単に説明
ざっくり言うと、以下3ステップです。
- 決定木の情報をDataFrame形式で取得
- DataFrameを集計して特徴量重要度を算出
- DataFrameを重要度スコアでソートして表示
1. 決定木の情報をDataFrame形式で取得
lightgbm.Booster.trees_to_dataframe2を利用します。
下記CodeではCSVファイルにそのまま一旦出力していますが、CSVファイルへの出力は任意です。
import csv
# 決定木をDataFrameに変換
clf.booster_.trees_to_dataframe().to_csv('predStockPrice-LightGBM-dicisiontrees.csv', encoding='utf-8', index=False, header=True, quotechar='"', sep=',', quoting=csv.QUOTE_ALL)
df_tree = pd.read_csv('predStockPrice-LightGBM-dicisiontrees.csv')
中身を確認すると、こんな感じ。
df_tree.head(10)
2. DataFrameを集計して特徴量重要度を算出
DataFrameは決定木を形成する情報が全て詰まっていますが、特徴量重要度に関係するのはNode(条件分岐式)です。
Nodeの情報を対象に、集計関数で特徴量重要度を算出します。
# 特徴量重要の集計に不要なLeafを除去する
df_tree = df_tree[df_tree['split_feature'].notnull()]
# 特徴量重要を集計する
#df_tree.groupby('split_feature').agg({'split_gain':'sum', 'tree_index':'count'}).sort_values('split_gain', ascending=False)
df_tree = df_tree.groupby('split_feature').agg({'split_gain':'sum', 'tree_index':'count'})
df_tree.rename(columns={'split_gain':'gain', 'tree_index':'split'}, inplace=True)
中身を確認すると、こんな感じ。
df_tree.head(10)
3. DataFrameを重要度スコアでソートして表示
あとは、表示するだけです。
importance_type='split'ないしimportance_type='gain'に相当する列をKeyとして、降順にソートして表示します。
# 特徴量重要度(importance_type='split')を降順で表示する
df_tree.sort_values('split', ascending=False)
# 特徴量重要度(importance_type='gain')を降順で表示する
df_tree.sort_values('gain', ascending=False)
まとめ
LightGBMで作った予測モデルの特徴量重要度を表形式で表示する方法をご紹介。
さらに正規化するともっと見やすくなるかもしれませんが、Code紹介は割愛します。
-
lightgbm.plot_importance | https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.plot_importance.html ↩
-
lightgbm.Booster.trees_to_dataframe | https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.Booster.html#lightgbm.Booster.trees_to_dataframe ↩ ↩2