Update 2023.12.21 2021.04.14

機械学習 ベストプラクティス Kaggleの『Titanic』
LightGBM.tarin, LightGBM.cv, LightGBM.LGBMClassifierの使い分け
パラメータチューニングをどうやるか?GridSearchCVを使うには?
前処理はKaggleにある『Titanic Data Science Solutions』をそのまま流用


◆◆「LightGBM」は3種類ある◆◆

Kaggleで上位に入るためには,前処理もモデリングもある決まったスタイルがあります。Kaggleで上位を狙えるLightGBMはサンプルコードが多いわりには上手な使い方が知られていません。

LightGBMは3種類あるのですが(分類に限れば。回帰は別),実は単独では性能が期待できません。使い分けのベストプラクティスを紹介します。Kaggleについては本サイトの別記事を参照してください。


(2023-12-21 Python3.10.9(CPUマシン)で動作確認済み)


◆◆「LightGBM」のインストール◆◆

https://anaconda.org
『ANACONDA ORG』

で調べたところ,LightGBMのダウングレードの方法も書いてあるのだが,最新のバージョン4.1.0を強く勧められていて,実際にダウングレードのインストールもバグったので,Webに書いてあるとおり,

$ conda install -c conda-forge lightgbm

で最新バージョンをインストールしました。バージョン3.と大きく変わり,学習曲線が出力するのが難しくなった(Webにサンプルがない)ので本記事を大幅に改造しました。


◆◆Kaggleのコンペ『Titanic』で「LightGBM」を使うときの注意点◆◆

『Titanic』で使うアプリ(アルゴリズム)は「LightGBM」か「ニューラルネットワーク」の二択であることは異論がないであろう。二つとも「scikit-learn」にはないものです。

「scikit-learn」の教科書にある「ホールドアウト法」「交差検証」「グリッドサーチ」などの手法を検討もしないで用いるのはたいへんもったいないです。下に添付の「Jupyter Notebook」はそれらの使い分けを紹介しています。


ポイントをまとめます。

① 「ホールドアウト法」か「クロスバリデーション交差検証」か

② 過学習オーバーフィッティングをどう止めるか

③ パラメータチューニングをどうするか


◆◆① 「ホールドアウト法」か「クロスバリデーション交差検証」か◆◆

「scikit-learn」の教科書には「ホールドアウト法」が一番多く書かれているのでこれに慣れてしまっているが,コンペでは絶対に使いません(サンプルではよく見る)。与えられたデータをtrainとtestに分けて,trainを学習に使いtestを評価に使うのですが,よく考えてみてください。与えられたtestは提出用であり学習の評価には使えませんので,与えられたtrainを2つに分けて新たにtest(validation dataのこと)をつくるはめになります。trainが減りますので正解率が下がります。

与えられたtrain全部を使って学習する方が正解率が上がります。つまり交差検証するしかないのです。


◆◆② 過学習オーバーフィッティングをどう止めるか◆◆

「early stopping」という手法があります。が,train を,test, validation, train の3つに分ける必要があります(アルゴリズムによっては2つに分ける)。

学習用は内部パラメータの精度を決め,検証用はearly stoppingの精度を決め,評価用はモデルの選択を決めます。それぞれが多い方が良いのですが,トレードオフの関係になっています。


◆◆③ パラメータチューニングをどうするか◆◆

もう一つ検討するのがパラメータです。内部パラメータは学習の結果で決まるものですが,外部パラメータ(ハイパーパラメータ)は事前に設定するものであり,学習しながらチューニングしていきます。「LightGBM」はパラメータチューニングを上手くやらないと正解率が上がらないといわれています。


◆◆具体的にどうすればよいのか◆◆

LightGBM.tarinとLightGBM.LGBMClassifierは単独で使う場合はほとんど同じ使い方です。前者はTraining APIのコードであり,後者はScikit-learn APIのコードで,Scikit-learnの他のモデルと同じ使い方ができます。

従って,後者は,学習曲線が描画できます。cross_val_score を使えばクロスバリデーション交差検証ができます。GridSearchCV を使えばパラメータチューニング・クロスバリデーションができます。

この2つを単独で使う場合はハイパーパラメータは固定になります。そして,多くのハイパーパラメータはデフォルトのままになります。

ちなみに,ハイパーパラメータは外で設定できるもので,内部パラメータは学習により獲得します。学習のラウンド数が適切でない場合,少ないとバイアスが高くなり学習不足,多いとバリアンスが高くなり過学習になります。


◆◆LightGBM.cv と LightGBM.tarin を組み合わせて使う◆◆

2021年には,LightGBM.cv で学習曲線が描画できました。なので,最適ラウンド数が読み取ることができ,それを使って LightGBM.tarin で全データを使ったholdout法で学習することができました。今は学習曲線の描画が難しくなりましたので,LightGBM.cv の early stopping のラウンド数を LightGBM.tarin に流用して全データを使うようにします。

train を3つに分け LightGBM.tarin 単独で early stopping をかける方法は,教科書では一番多いサンプルです。


◆◆LightGBM.LGBMClassifier で学習曲線とROC曲線を描画する◆◆

LightGBM.LGBMClassifier はScikit-learn APIのコードなので,Scikit-learnの他のモデルと同じ使い方ができ,学習曲線が描画でき,cross_val_score を使えばクロスバリデーション交差検証ができ,GridSearchCV を使えばパラメータチューニング・クロスバリデーションができます。

cross_val_score のサンプルは添付しませんでしたが,GridSearchCV のサンプルは添付して,ほぼすべてのハイパーパラメータを設定しました。そのうちの一部をグリッドパラメータにしています。添付サンプルの最後ですが,この方法が一番正解率が上がり,未来データに対する汎化性能が良いと考えます。



実際に動作するJupyter Notebookのhtmlを下に添付します。Jupyter Notebookと下のhtmlを左上隅からダウンロードできます。ファイルinputとoutputのディレクトリを正しくしてください。.ipynbファイルがあるフォルダと同列です。「../input/」「../output/」がフォルダの位置を示しています。

Python3 on Jupyter Notebook(拡張子.ipynb)on CPU 『Titanic_LightGBM_cv_train_classifier.ipynb』


トップページに戻る
inserted by FC2 system