Kaggle Courses 学習メモ(機械学習イントロダクション編 2/2) 

[前回](https://qiita.com/mossycat/items/b6840ed43609721a6e54)の続きです．
2分木の基礎を学び，データを切り出し，モデルを作ることには成功しました．
しかし，MAEを用いてモデルを評価した所，バリデーションデータに対する分類精度が💩になってしまいましたね．
この原因について考察していきます．

#未学習と過学習

やはり2分木で考える．

葉にたどり着くまでに分岐をn回行うと，葉の数は$2^n$のオーダーになる．歯の数が増えれば増えるほど，各葉に分類される家の数は少なくなる．

この場合，たしかにデータセットに対してはいい感じの予測をするが，新規データに対しては信頼性の低い予測をする可能性がある(過学習，Overfitting)

逆に木を小さく（shallow）しすぎると分割が足りなすぎて精度が上がらない(未学習，Underfitting)


![スクリーンショット 2021-03-05 14.26.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269213/772ebe2a-cd3f-fc26-b806-5dcd008f2804.png)

scikit-learnでは`max_leaf_nodes`引数で葉の深さを設定することで木のサイズ全体を調整することが出来る．
木を大きくすればするほど，モデルはUnderfittingしてる領域からOverfittingしてる領域に移るわけだが，今回Coursesで取り扱う例では，どれくらいの深さが良いのか？検証してみよう．

```Python
def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
    model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
    model.fit(train_X, train_y)
    preds_val = model.predict(val_X)
    mae = mean_absolute_error(val_y, preds_val)
    return(mae)

# 木の深さを変えながらMAEでモデルを評価
for max_leaf_nodes in [5, 50, 500, 5000]:
    my_mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y)
    print("Max leaf nodes: %d  \t\t Mean Absolute Error:  %d" %(max_leaf_nodes, my_mae))
    
#Max leaf nodes: 5  		 Mean Absolute Error:  347380
#Max leaf nodes: 50  		 Mean Absolute Error:  258171
#Max leaf nodes: 500  		 Mean Absolute Error:  243495
#Max leaf nodes: 5000  		 Mean Absolute Error:  254983
```

`[5,50,500,5000]`の中だと，500くらいの分割が一番いい感じ．

# モデルを改善する
次はモデルの改善です．今回はRandomForestという手法があるのでそれを使っていきます．

```Python
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error

forest_model = RandomForestRegressor(random_state=1)
forest_model.fit(train_X, train_y)
melb_preds = forest_model.predict(val_X)
print(mean_absolute_error(val_y, melb_preds))
#191669.7536453626
```
RandomForestという神モデルを使うと，
250000から190000へ，損失を約60000程度下げることが出来ました．やったね！

...
......
.........

このように，イントロダクション編ではRandomForestの説明が一切ないんですよね......
それではちょっとだめというか，学びがなさすぎるので，RandomForestの仕組みについて軽く自分でまとめてみました．

[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%83%95%E3%82%A9%E3%83%AC%E3%82%B9%E3%83%88)によると，RandomForestは2001年にLeo Breimanによって提唱されたアルゴリズムで，決定木を**弱学習木**として用いる**アンサンブル学習**です．

具体的な学習手順は以下の通り．

 1. まず学習に用いる観測データをブートストラップ法を用いてランダムに分割し，B組のサブセットを作成します．
 2. B組のデータそれぞれからB組の決定木を作成します．
 3. 指定されたノード数$n_{min}$に達するまで以下の方法でノードを増やします．
     1.  トレーニングデータの説明変数のうち，m個をランダムに選択する．
     2.  ランダムに選ばれた説明変数のうち，トレーニングデータを最もよく分類するものと，最もよく分類する閾値をもとに分割関数を設定する

このように作成した決定木群の多数決によって分類・回帰を行います．**弱学習木によるアンサンブル学習**とは，このように，1本1本の決定木を弱い学習器，それら全体の多数決をとった結果を強い学習器としてみなして学習を行うことを差しています・

手順内で，トレーニングデータ・説明変数をランダムに選択することで，比較的相関が低い決定木群ができる...とのことです．

説明変数が多くても上手く働く，データが欠損していても出力が良い，パラメタチューニングがほとんどいらないなど，利点まみれなモデルとなっています．

[先駆者様のQiita記事](https://qiita.com/Hawaii/items/5831e667723b66b46fba)もあります．

ブートストラップ法についてはまだ理解できていませんが，とりあえずの学びとしては充分でしょう．

#提出

ここまで来ると，後は提出するだけです．(メモることもないので省略)
KaggleはNotebookから直に提出が出来るのでメチャクチャスムーズですよね．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269213/6f6533ab-f4b7-f1eb-c188-6db5b900481f.png)

私の順位は60000人中，50000位ぐらいでした．
びみょい！こんなところで満足していられませんよね．

という事で，次回は機械学習中級編として，データの前処理やクロス・バリデーションなどについて学んでいきます．

#認定証

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269213/ae8e9028-d0e6-afe9-685b-95e579ad59b2.png)


やったぜ．