機械学習の基礎を学ぶための「機械学習入門」。以下のページを参考にして、日本語解説を加えました。ソースコードも以下にあります。
前回、決定木ベースの機械学習宇モデルを作成しました。では、その予測精度はどうでしょうか。
今回は、モデル検証を使用してモデルの品質を測定する方法を学習します。 モデルの品質を測定することは、モデルを繰り返し改善するための鍵です。
モデル検証とは
これまでに作成したほぼすべてのモデルを評価する必要があります。ほとんどの(すべてではありませんが)アプリケーションでは、モデル品質の関連する尺度は予測精度です。言い換えれば、モデルの予測は実際に起こることに近いのでしょうか。
注意すべきなのは、学習データと検証データは分けるべき、ということです。
たとえば、 10,000戸の住宅の予測値と実際の住宅値を比較すると、制度の高い予測と低い予測が混在しているとします。ただ、10,000の予測値と実際の値のリストを確認しても、人間の目にはよくわからないので、平均絶対誤差(MAEとも呼ばれる)に代表される評価指標(メトリック)を使います。
では、前回作った決定木モデルを復習しましょう。以下のようなコードで書けます。データは下記からダウンロードできます。
import pandas as pd
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
filtered_melbourne_data = melbourne_data.dropna(axis=0)
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
melbourne_model = DecisionTreeRegressor()
melbourne_model.fit(X, y)
モデルの誤差の計算
平均絶対誤差を計算するために、次のコードを実行します。
from sklearn.metrics import mean_absolute_error
predicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)
ここで計算している予測誤差は単純で、次ようなイメージです。
error=actual−predicted
つまり、実際の価格が1500万円で、モデルが1000万円だと予測した場合、誤差は50万円です。
MAEを使用して、各エラーの絶対値を取得し、これらの絶対誤差の平均を取ります。MEA=Xであるとするならば、
「平均して、私たちの予測は約Xずれている」
ということです。
「サンプル内」スコアの問題
モデルの作成に使用したデータのサンプルでは、緑のドアのあるすべての家は非常に高価だったとします。少し考えれば、不動産市場ではドアの色が住宅価格とは無関係であるとわかります。
ただ、モデルは住宅価格を予測するパターンを見つけにいくため、このデータを用いれば、緑のドアのある住宅の価格が常に高く予測されてしまいます。モデルとしては正しい動きをしているのですが、このモデルで新しいデータを予測すると、正しい予測ができません。
モデルの真の目的は、新しいデータを予測することです。
そのため、モデルの構築に使用されなかったデータのパフォーマンスを測定するためには、モデル構築プロセスから一部のデータを除外する必要があります。除外したデータは、モデルからするとこれまでに見たことのないデータですので、モデルにとって未知のデータで精度をテストすることができます。このように除外されるデータは検証(バリデーション)データと呼ばれます。
バリデーションをコーディングする
scikit-learnライブラリには、データを2つに分割する関数train_test_splitがあります。 そのデータの一部をモデルに適合させるためのトレーニングデータとして使用し、他のデータを検証データとして使用してmean_absolute_errorを計算します。
コードは次のとおりです。
from sklearn.model_selection import train_test_split
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
melbourne_model = DecisionTreeRegressor()
melbourne_model.fit(train_X, train_y)
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))
まとめ
学習データの平均絶対誤差(MEA)は約50万円でした。 一方で、検証データのMEAは250万円以上です。
検証データの平均住宅価格は1100万円ですので、誤差は平均住宅価格の約4分の1となり、小さいとは言えないですね。
より良い特徴量を見つけたり、ほかのモデルを試すなど、このモデルを改善する方法はたくさんあります。
次回は、オーバーフィッティング(過学習)について説明します。
コメント