【sklearn】mean_absolute_errorとtrain_test_splitの使い方が分かる【Kaggle Course – Intro to Machine Learning 4-5】機械学習モデルの評価

Kaggle

アメリカのデータ分析コンペKaggleでは、世界中の優秀なデータサイエンティストによって作成された様々なeラーニング教材が無料で公開されています。

その中でも、この記事では以下の講座について解説します。

ただ、全編英語ですし、ところどころ説明を省略しているところもあるので、私なりにかみ砕いて解説していきます。

この記事で取り扱うクラスは以下の通りです。

sklearn.metrics.mean_absolute_error
sklearn.model_selection.train_test_split

Model Validation(モデルの評価)

What is Model Validation(モデルの評価とは)

この講座では、モデルの品質を測定する方法を学びます。モデルの品質を測定することは、モデルを徐々に改良していくために欠かせません

モデルの品質を表す指標は数多くありますが、ここでは「平均絶対誤差(MAE)」という指標を取りあげます。

MAE(Mean Absolute Error)では、各誤差の絶対値を取ったあと、その絶対誤差の平均値を取ります。

下記のコードは、実際にMAEを算出する方法です。predicted_home_pricesは予測値、yは正解値です。

from sklearn.metrics import mean_absolute_error

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

The Problem with “In-Sample” Scores(「インサンプル」スコアの問題点)

さきほど計算したMAEは、モデルの構築と評価とで同じデータを使用したため、「インサンプル」スコアと呼ぶことができます。

「インサンプル」スコアの問題点は、本来評価するべき、未知のデータに対する指標になっていないことです。

モデルの実用的な価値は、新しいデータに対する予測にあるため、モデルの構築に使用されなかったデータのパフォーマンスを測定するとよいでしょう。

最も簡単なのは、データを訓練データと検証データに分け、検証データを使ってモデルの精度をテストすることです。

Coding It(コーディングする)

scikit-learnライブラリには、データを2つに分割するtrain_test_splitという関数があります。

データの一部を学習データ(train_X, train_y)として分割しモデルを学習(fit)させ、もう一方のデータを検証データ(val_X, val_y)としてMAE(mean_absolute_error)を計算します。

このように出したスコアを「アウトオブサンプル」スコアと呼びます。

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))
268075.31504196255

Wow!

「インサンプル」スコアは$500だったのに対して、「アウトオブサンプル」スコアは$260,000以上になりました。

参考までに、検証データの平均的な住宅価格は$1,100,000です。つまり、今回作成したモデルの誤差は平均住宅価格の約4分の1ということになります。

これほど誤差が大きいと、実用的なモデルとは言えません。

このモデルを改善するには、より良い特徴量を見つけたり、別の機械学習モデルを試す実験を行うなど、様々な方法があります。

Your Turn(練習問題)

最後に、Kaggle notebook上で実際のコードを使った練習問題があるので、知識の定着のためにトライしてみてください。

Underfitting and Overfitting(アンダーフィットとオーバーフィット)

Experimenting With Different Models(異なるモデルで実験する)

これまで用いてきた決定木というモデルでは、気の深さを指定するパラメータがあります。

木の深さが1の時は家のグループは2種類に、木の深さが10の時は家のグループは1024種類(2の10乗)になります。

気の深さのパラメータが少ないと、アンダーフィットという状態に陥り、未知のデータに対する予測精度が悪くなります。

逆に気の深さのパラメータが多いと、オーバーフィットという状態に陥り、これまた未知のデータに対する予測精度が悪くなります。

Example(例)

学習不足や過学習を防ぐのに、決定木の葉の数を表すmax_leaf_nodesを調整するのは賢明と言えます。

関数を使って、max_leaf_nodesの値が異なる場合のMAEスコアを比較してみましょう。

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

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)

この関数では、max_leaf_nodes, train_X, val_X, train_y, val_yを読み込んで、 MAEの値を返します。試しに、max_leaf_nodesが5, 50, 500, 5000の場合のMAEを計算してみます。

# compare MAE with differing values of max_leaf_nodes
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

max_leaf_nodesは500のときに最もMAEが低く、最適と分かりました。

Conclusion(結論)

機械学習モデルの構築には次のような問題があります。

  • オーバーフィット:未知のデータに関係のない偽のパターンを捉えてしまい、予測の精度が低下する
  • アンダーフィット:関連性のあるパターンを捕捉できず、やはり予測の精度が低下する。

オーバーフィットもアンダーフィットも避けるために、学習データとは別に検証データを使用し、多くのモデル候補を試して、最適なモデルを見つけることが大切です。

Your Turn(練習問題)

最後に、Kaggle notebook上で実際のコードを使った練習問題があるので、知識の定着にいいかと思います。

今回はモデルの評価や、オーバーフィット、アンダーフィットについて学びました。予測の精度を上げるためには非常に大切な内容だったかと思います。次回はランダムフォレストについて学んでいきます。

以上、最後までお読みいただきありがとうございました。

コメント

タイトルとURLをコピーしました