Kaggle learnで学ぶ機械学習の基礎（初級編）

[Kaggleで始める機械学習入門](https://qiita.com/k-ysd/items/9f8edeb6c22e8ec69e0e)でKaggleのアカウントを作成して、一通りの操作ができました。次はKaggle learnの以下の初級講座を使って機械学習の基礎を学習します。

https://www.kaggle.com/learn/intro-to-machine-learning

この初級講座は７回のレッスンで構成されており、各回は解説パート(tutorial)と実践パート(exercise)に分かれています。実践パートでは、コンペと同様のNotebookでコードを動かす形になります。

実際にやってみた感想です。

＜良かった点＞
・１回１時間程度でサクッとできる
・１回あたりの内容は比較的かんたんで理解しやすい
・解説パートで学んだコードを実践パートで入力し、答え合わせできるので達成感がある

＜悪かった点＞
・すべて英語…

英語なのは仕方ないですね。DeepLに頼りながら読み進めました。

内容としては、まず決定木を使ってシンプルなモデルを構築します。次にその結果を評価する方法を学び、良いモデルとそうではないモデルについて学習します。最後にランダムフォレストに挑戦し、住宅価格コンペに投稿して完了です。

　モデル作成　→　評価　→　モデル修正　→　再評価　→　･･･
という一連の流れを体験できたのがとてもよかったです。

以下、要点のメモです。

## 1. How Models Work（モデルの仕組み）

今回の講座で主に取り上げる決定木に関する説明です。この回は解説パートのみで、実践パートはありません。

これは寝室が多い住宅のほうが高くなる、という決定木モデルの例です。実際のモデルではものすごい数の分岐に枝分かれします。

```mermaid
flowchart TD
    BED[Bed > 2]-->|no|$178000
    BED-->|yes|$188000
```

## 2. Basic Data Exploration（基本的なデータ探索）

pandasを使ってデータを取り込み、データの特徴を確認する方法を学びます。

```python
import pandas as pd
data = pd.read_csv('path_to_data_file.csv')
data.describe()
```
```python
data.head()
```


## 3. Your First Machine Learning Model（最初の機械学習モデル）

まずは最もシンプルなモデルである決定木を使い、とりあえず直感でやってみよう、という回です。

訓練データの中から、最終的に予測したい値（コンペではyと呼ばれます）と、解析で使う値（コンペではxと呼ばれ、複数の項目を含みます）を選択します。今回使うデータは住宅価格なので、yはpriceになります。配列だからでしょうか、Xは大文字になってます。

```python
y = data.Price
X = data['col','for','predict']
```

scikit-learnを使ってモデルを構築し、次の流れで解析します。
1. define: どのようなモデルにするか定義します
1. fit: データからパターンを捉えます。これが一番重要
1. predict: 予測します
1. evaluate: モデルがどのくらい正確なのか評価します

この回ではpredictまでで、evaluateは次回行います。

```python
from sklearn.tree import DecisionTreeRegressor
model = DecisionTreeRegressor(random_state=1)
model.fit(X, y)
model.predict(X.head())
```

# 4. Model Validation（モデルを検証する）

mean absolute error（平均絶対誤差、MAE）という指標を使って予測精度を検証します。

このとき注意すべきこととして、訓練データで評価してはいけません。モデルは訓練データから作っているので当然高精度になりますが、もし訓練データが偏っていたら他のデータには役に立たないモデルです。

scikit-learnのtrain_data_split関数を使って、あらかじめデータを訓練データと検証データに分けておき、検証データで評価します。

```python
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)

# 訓練データでモデルを構築
model = DecisionTreeRegressor()
model.fit(train_X, train_y)

# 検証データで予測と評価
pred = model.predict(val_X)
mean_absolute_error(val_y, pred)
```

訓練データでMAEを評価すると（やってはいけないやつです）、434.7というとても小さな誤差になります。一方、検証データで評価すると265806.9でした。ぜんぜん違いますね。265806.9がこのモデルの実力、ということになります。

## 5. Underfitting and Overfitting（アンダーフィッティングとオーバーフィッティング）

決定木の重要なパラメータとしてツリーの深さがあります。
ツリーが深すぎると１つの葉に含まれる要素が少なくなり精度が落ちます。これをオーバーフィッティングと言います。逆にツリーが浅すぎると１つの葉に含まれる要素が多すぎて外れる可能性が高まります。これをアンダーフィッティングと言います。オーバーフィッティングとアンダーフィッティングの間にあるスイートスポットを見つけましょう。

ツリーの深さは、モデル構築時にmax_leaf_nodesパラメータとして制御できます。いくつかの深さに対して、forループでMAEスコアを比較します。

```python
from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressor

# MAEを求める関数
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)
    pred = model.predict(val_X)
    mae = mean_absolute_error(val_y, pred)
    return(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

となったので、ツリー深さは500がよさそうです。

## 6. Random Forests（ランダムフォレスト）

次に、もっと洗練されたモデルであるランダムフォレストを学びます。決定木では１つのツリーを構築しますが、ランダムフォレストでは複数のツリーを使い、それらを平均化します。決定木ではツリーの深さをチューニングしましたが、一般にランダムフォレストでチューニング不要です。

ランダムフォレストを実行するコードはとてもかんたんです。

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

model = RandomForestRegressor(random_state=1)
model.fit(train_X, train_y)
pred = model.predict(val_X)
print(mean_absolute_error(val_y, pred))
```
MAE 191669.7という今までより高いスコアが出ました。

## 7. Machine Learning Competitions（機械学習コンペ）

最後は住宅価格という練習用のコンペに参加してみよう、という内容です。
といっても、今まで学んだ内容の復習だけですので、特に身構える必要はありません。

ここまで学習すると修了証明書がもらえます。ちょっとうれしいですね。
![mosaic_20240107120534.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/36f8dffe-d3ee-0b04-6d9a-968860fae8c2.png)


## まとめ

以上で機械学習モデルを構築して評価する、そしてモデルを修正して再度評価する、という基本的なフローを学習しました。実際にコードを作って動かしているので納得感がありますね。

さらにモデルを改良する方法やもっと高度なモデルについては[中級編](https://qiita.com/k-ysd/items/b2db233bb7ac2969f18c)で学習します。お疲れ様でした。