前回は、使用する特徴量を4通りで変化させたときの予測性能(kaggleスコア)を比較してみました。

今回は、機械学習アルゴリズムも変化させて、同様に比較してみます。

 

教材はこちら。

https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Data-Science%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BKaggle%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E7%A5%A5%E5%A4%AA%E9%83%8E/dp/4065190061

 

こちらの内容を参考に行いました。

 

第2章 Titanicに取り組む

    2.5 勾配ブースティングが最強?! いろいろな機械学習アルゴリズムを使ってみよう

 

まず一つ目が、ランダムフォレスト。

ランダムフォレストの概要についてはこちら。

https://mathwords.net/randomforest

 

簡単に言えば、訓練データから複数パターンでグループを抽出して、それを元に作ったそれぞれの決定木の予測を元に多数決で予測を決めるというもの。

コードはこんな感じ。

 

n_estimatorsは、作成する木の数。

max_depthは、木の深さの最大数。

例えばこの図の場合だと、3になる。

max_depthをデフォルトにしてしまうと過学習が起こってしまうので、ここは指定することが望ましい。

 

random_stateは、木を作成するためのデータ分割の際に用いる乱数要素。常に0として乱数要素を固定している。

 

こんな感じでできた結果をkaggleに上げてみたところ、スコアは0.74641という結果でした!

今のところ最高スコアは、こちらのブログの2つ目の決定木(使用する特徴量を増やして、max_depthやmin_sample_splitを指定したとき)が一番良いですが、それに次ぐスコアとなりました。

https://ameblo.jp/namacha2020/entry-12585588783.html

 

このときは、max_depthを10にしているから、そこら辺が効いているのかも?

同じ条件でランダムフォレストにしたらもっと良くなるかも・・・?

 

このように、パラメーターを変更させたときの結果も気になりますが、そちらについては次回のブログで取り上げる予定です。

 

さて、今回はもう一つ別の機械学習アルゴリズムを用いて性能を比較します。

LightGBMという、決定木アルゴリズムに基づいた勾配ブースティングの機械学習フレームワークです。

勾配ブースティングのフレームワークは他にもXGBoostもありますが、両方ともkaggleで上位ランキングを取った人たちがよく使っているということ。

これは、学ばなくては!

 

LightGBMの仕組みについてはこちらを参照。

https://www.codexa.net/lightgbm-beginner/

 

このサイトにあった図がわかりやすかったので引用。

 

 

シングルとは、決定木を1つだけ作る、いわゆる決定木。

バギングとは、決定木を複数作って並列的に学習を行う、ランダムフォレストのようなもの。

そして、ブースティングとは、前の弱学習器(決定木)の結果を次の学習データに反映させるもので、LightGBMはこれに該当します。

うん、これだけでも性能が高そうな匂いがする!

 

まず先に、訓練データを学習用と検証用に分けます。

データを分割するときに用いるのが、train_test_split関数。

詳細はこちら。

https://note.nkmk.me/python-sklearn-train-test-split/

 

これ、なかなか便利!

これがなかったら結構面倒なプログラムを作らなければならない。

 

やっぱpythonってすごいなぁ。。

 

X_trainをX_trainとX_validへ、

y_trainをy_trainとy_validへ、分割。

test_size=0.3とすることで、前者を7割、後者を3割で分割。

random_stateは分割するための乱数要素を指定。

stratifyは、均等に分割させたいデータ(多くの場合は正解ラベル)を指定すると、そのデータの値の比率が一致するように分割される。←すごい!

 

というわけで、7:3で分割されていることを確認してみてみた。

 

 

うん、問題なし!

 

準備ができたので学習・予測を行います。

はじめにlightgbmをインストールするために、pip install lightgbmをして、その後こちらのコードを実行したのですがエラーがでてしまってうまくいかなかった。

 

色々調べたら、

conda install -c conda-forge lightgbm 

をするといいと書いてあったので試してみたらきちんと実行されました!

 

 

3行目は、カテゴリ変数として扱って欲しい列を指定している。

 

5,6行目については、説明変数と目的変数を「LightGBM用のデータセット」に加工している。

5行目が学習用、6行目が検証用。

 

9行目でobjective(目的変数)がbinary(0,1値)であることを指定。

 

13〜17行目の各パラメータについて。

valid_setsは、モデル評価用データを指定。ここでは、lgb_trainとlgb_evalの両方を与えている・・lgb_evalだけではないのか?と疑問が残る・・・

verbose_evalは、学習過程をいくつずつ表示させるか。

num_boost_roundは、ブーストさせる回数。

early_stopping_roundsは、過学習になる前にストップさせるためのパラメータで、10回ぐらいは様子をみて過学習しているようであれば学習をやめさせる、ということ。

・・うーん、これについては色々調べてみたけど詳細について十分に理解できたとは言い難い(今後の課題とする!)

 

19行目、作ったモデルで実際に予測。

num_iteration=model.best_iterationのところがよくわからん・・。何を基準にbest_iterationなのか。

ここ理解も今後の課題だなぁ。

 

結果と、後処理はこちら。

 

 

[0,1]の値ででた予測値を0or1の値に直し、ファイルへ保存。

kaggleに提出してみたところ、0.76555と、過去最高スコアとなりました!

 

やっぱり性能がいいようですね。

同じ勾配ブースティングのXGBoostよりも計算時間が速いというメリットもある。

 

今回は、細かい部分でよくわからないところが残ってしまったけど、

立ち止まりすぎずに、作業を続けながら理解を深めていこうと思います。

 

ということで今日はここまで!