【kaggle】機械学習イントロ - モデルの検証【備忘翻訳】

# はじめに
当記事はkaggleのLearnの[Intro to Machine Learning](https://www.kaggle.com/learn/intro-to-machine-learning)の[Model Validation](https://www.kaggle.com/code/dansbecker/model-validation)を翻訳して備忘としたものです。
拙い英語力なので間違い等あればご指摘いただけたらと思います。

まとめ:[【kaggle】翻訳記事まとめ【備忘翻訳】](https://qiita.com/leafeon00000/items/71e57af5b2d9b0b7c846)
前:[【kaggle】機械学習イントロ - 初めての機械学習モデル【備忘翻訳】](https://qiita.com/leafeon00000/private/bb99d554f573d629d215)
次:[【kaggle】機械学習イントロ - 過少学習と過剰学習【備忘翻訳】](https://qiita.com/leafeon00000/private/bd6ab62c785306ed1357)

:::note warn
当記事に含まれるコードはkaggle内のnotebook内で正常に動作します。動作を試したい場合はkaggleのnotebookで試してください。
:::

---

# モデルの検証
モデルのパフォーマンスを測定して、代替案をテストおよび比較できるようにします。

前回のレッスンでモデルを構築しました。しかし、それはどの程度の精度なのでしょうか？

このレッスンではモデル検証を使用してモデルの品質を測定する方法を学習します。モデルの品質を測定することは、モデルを反復的に改善するためのカギとなります。

## モデル検証とは
構築したモデルを評価する必要があります。ほとんどの(全てではないが)アプリケーションでは、モデル品質の良いな尺度は予測精度です。言い換えれば、モデルの予測は実際に起こることに近いものになるかどうかです。

多くの人は予測精度を測定する際に大きな間違いを犯します。**トレーニングデータ**を使用して予測を行い、その予測を**トレーニングデータ**内の目的の値と比較します。このアプローチの問題点とその解決方法はすぐにわかりますが、まずはこれをどのように行うかを考えてみましょう。

まず、モデルの品質を分かりやすい形で要約する必要があります。10,000件の住宅の予測価格と実際の価格を比較すると、良い予測と悪い予測が混在していることがわかるだろう。10,000個の予測値と実際の値のリストを調べるのは無意味です。これを1つのメトリックにまとめる必要があります。

モデルの品質を要約する指数は多数ありますが、まずは**平均絶対値誤差(Mean Absolute Error)**(**MAE**とも呼ばれます)から始めます。最後の単語である「誤差(Error)」からこのメトリックを分析してみましょう。

各住宅の予測誤差は次の通りです:

> error=actual−predicted 
> 誤差 = 実際の価格 - 予測された価格


つまり、価格が\\$150,000の住宅の予測が\\$100,000であると予測した場合、誤差は\\$50,000になります。

MAEメトリックでは、各誤差の絶対値を取得します。これにより、各誤差が正の数に変換されます。次にそれらの絶対誤差の平均を取ります。これはモデルの品質を測る基準です。簡潔に言うと

> 平均すると、私たちの予測は約Xほど外れます。

MAEを計算するには、まずモデルが必要です。これは下の非表示部分に記載しています。

<details><summary>モデルのコード</summary>

```python
# Data Loading Code Hidden Here
import pandas as pd

# Load data
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 
# Filter rows with missing price values
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# Choose target and features
y = filtered_melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 
                        'YearBuilt', 'Lattitude', 'Longtitude']
X = filtered_melbourne_data[melbourne_features]

from sklearn.tree import DecisionTreeRegressor
# Define model
melbourne_model = DecisionTreeRegressor()
# Fit model
melbourne_model.fit(X, y)
```

```console:console
DecisionTreeRegressor()
```

</details>

モデルができたら、平均絶対誤差を計算する方法は次のようになります。

```python
from sklearn.metrics import mean_absolute_error

predicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)
```

```console:console
434.71594577146544
```

## 「in-sample」スコアの問題
今計算した値は「in-sample」スコアと呼ぶことができます。モデルの構築と評価の両方に、単一の「sample」の住宅を使用しました。これがなぜ悪いのか、以下に説明します。

大規模な不動産市場では、ドアの色は住宅価格とは無関係であると想像してください。

しかし、モデルの構築に使用したデータのサンプルでは、緑色のドアを備えた住宅はすべて非常に高価でした。モデルの役割は住宅価格を予想するパターンを見つけることなので、このパターンを認識し、緑のドアのある住宅の価格が非常に高くなると予想します。

このパターンはトレーニングデータから派生したものであるため、モデルはトレーニングデータ内で正確であるように見えます。

しかし、モデルが新しいデータを検出したときにこのパターンが当てはまらない場合、モデルは実際に使用したときに非常に不正確になります。

モデルの実用的な価値は新しいデータに基づいて予測を行うことから生まれるため、モデルの構築に使用されなかったデータでパフォーマンスを測定します。これを行う最も簡単な方法は、モデル構築プロセスから一部のデータを除外し、それらを使用して、これまで見たことのないデータに対するモデルの精度をテストすることです。このデータは**検証データ(validation data)**と呼びます。

### コーディング
scikit-learnライブラリには、データを2つに分割する関数``train_test_split ``があります。そのデータの一部をモデルに適合させるためのトレーニングデータとして使用し、残りのデータを検証データとして使用して``mean_absolute_error ``を計算します。

以下のコードです:

```python
from sklearn.model_selection import train_test_split

# split data into training and validation data, for both features and target
# The split is based on a random number generator. Supplying a numeric value to
# the random_state argument guarantees we get the same split every time we
# run this script.
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
# Define model
melbourne_model = DecisionTreeRegressor()
# Fit model
melbourne_model.fit(train_X, train_y)

# get predicted prices on validation data
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))
```

```console:console
265806.91478373145
```

### Waw!
in-sampleデータの平均絶対誤差は約500ドルでした。out-of-sampleでは250,000ドルを超えます。

これは、ほぼ正確なモデルと、ほとんど実用的な目的には使用できないモデルの違いです。参考までに、検証データ内の平均住宅価格は110万ドルです。したがって、新しいデータの誤差は平均住宅価格の役4分の1になります。

より優れた機能や異なるタイプのモデルなど、モデルを改善する方法は多数あります。