【データサイエンティストへの道⑴】lightGBMの軽ーい実装とまとめ
こんにちは。医学生のすりふとです。
現在、東大松尾研が主催しているGCIデータサイエンティスト育成講座とやらに参加していて、専ら機械学習について勉強中です。
備忘録も兼ねて、追加で調べたことなどを書いていこうと思います。
lightGBMとは
Kaggleとかのデータコンペで優秀な成績をめっちゃ残しているらしいlightGBMを使ってみました。
lightGBMは決定木アルゴリズムに基づいた勾配ブースティングの機械学習フレームワークらしいです。
決定木は良いとして、勾配ブースティングだけ解説します。
(ちなみに決定木は、正規化とかしなくて良いらしいです。)
勾配ブースティングとは、アンサンブル学習するときに弱学習器の結果をただ合わせるのではなく、前の弱学習器の結果を次に反映させるもので、前の弱学習器では弱かったところを次で重点的におさえて、全体を網羅していくみたいなイメージだと思います。
また、LightGBMは計量値をヒストグラムとして扱うらしく、それによって計算が高速化しているらしい。
他にもいろいろすげーところがあるけど置いといて、次は軽い実装です。
(補足:condaからインストールするのが楽だと思います。)
軽く実装してみる
データセットとかは自分で用意してみてください。
今回はほんとに軽く書いてみます。
シチュエーションとしては、評価をMAEで行う回帰って感じです。
import lightgbm as lgb
lgb = lgb.LGBMClassifier()
#データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
#LGB用のデータに変形
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test)
#パラメータを指定
params = {'metric': {'mae'},'max_depth' : 9}
#学習させる。スコアも同時に表示してくれる
gbm = lgb.train(params,
lgb_train,
valid_sets=(lgb_train, lgb_eval),
num_boost_round=10000,
early_stopping_rounds=100,
verbose_eval=50)
#特徴量の重要度を表示
lgb.plot_importance(gbm, height=0.5, figsize=(8,16))
こんな感じだと思います。
重要なパラメータは以下の通り。
・num_leaves
決定木の複雑度。num_leavesの値が高すぎると過学習となり、低すぎると未学習になる。max_depthと一緒に調整すると良いらしい。
・min_data_in_leaf
決定木のノード(葉)の最小データ数。値が高いと決定木が深く育つのを抑えるため過学習防ぐが、逆に未学習となる場合もある。min_data_in_leafは訓練データのレコード数とnum_leavesに大きく影響されるらしい。
・max_depth
決定木の深さを指定するハイパーパラメータ。他のハイパーパラメータとの兼ね合いが重要らしい。
アーリーストッピングなどに関しては参考したサイトの二つ目に詳しく載っています。
参考にしたサイト(ありがとうございます)
まとめ
機械学習は奥が深いですね。特徴量とかずっと考えちゃいます。
今後も、こういう記事を書いていきたいと思います!
♡を押して頂くと、筆者の本日の体調と抱負が見れます。
それではまた明日!
この記事が気に入ったらサポートをしてみませんか?