はじめに
当記事はkaggleのLearnのIntro to Machine LearningのUnderfitting and Overfittingを翻訳して備忘としたものです。
拙い英語力なので間違い等あればご指摘いただけたらと思います。
まとめ:【kaggle】翻訳記事まとめ【備忘翻訳】
前:【kaggle】機械学習イントロ - モデルの検証【備忘翻訳】
次:【kaggle】機械学習イントロ - ランダムフォレスト【備忘翻訳】
当記事に含まれるコードはkaggle内のnotebook内で正常に動作します。動作を試したい場合はkaggleのnotebookで試してください。
過少学習と過剰学習
パフォーマンスを向上させるためにモデルを微調整します。
このステップの最後には、過少学習と過剰学習の概念を理解し、これらのアイデアを適用してモデルの精度を高めることができるようになります。
様々なモデルを実験する
モデルの精度を測定する方法を手に入れたので、代替モデルを試して、どのモデルが最良の予測を出すかを確認できます。しかし、モデルにはどのような代替手段があるのでしょうか?
scikit-learnのドキュメントを見ると、決定木モデルには多くのオプションがあることがわかります。最も重要なオプションはツリーに深さを決定するオプションです。このコースの最初のレッスンで学んだように、ツリーの深さは、予測に到達するまでに何回の分割が行われるかの尺度です。
実際には、ツリーの最上位レベル(すべての住宅)と葉の間に10個の分岐が存在することは珍しくありません。ツリーが深くなるにつれて、データセットは家の数が少ない葉に分割されます。ツリーに1つの分割しかない場合、データは2つのグループに分割されます。各グループをさらに分割すると、4つの住宅のグループが得られます。これらを再分割すると、8つのグループが作成されます。各レベルでさらに分割を追加してグループの数を倍増し続けると、10番目のレベルに到達するまでに、2^10個の家のグループが作成されます。つまり、1024個の葉になります。
家をたくさんの葉に分けると、葉ごとの家の数も減ります。非常に少ない住宅を含む葉は、それらの住宅の実際の価値に非常に近い予測を行いますが、新しいデータに対しては非常に信頼性の低い予測を行う可能性があります(各予測は少数の住宅のみに基づいているため)。
これはモデルの過剰学習と呼ばれる現象で、モデルはトレーニングデータにほぼ完全に一致しますが、検証データやその他の新しいデータではうまく一致しません。逆に、ツリーを非常に浅くすると、家を明確にグループ分割できなくなります。
極端な場合、ツリーが家を2つまたは4つにのみ分割したとしても、各グループには多種多様な家が含まれます。結果として得られる予測は、トレーニングデータであっても、ほとんどの住宅では大きく外れる場合があります(同じ理由で検証データでも悪い結果になります)。モデルがデータ内の重要な違いやパターンを捉えられず、トレーニングデータでもパフォーマンスが低下する場合、これを過少学習と呼びます。
検証データから推測した新しいデータの精度が重要なので、過少学習と過剰学習の間の最適なポイントを見つけたいです。視覚的に表すと、下図の赤い検証データの曲線の低い点が目的のポイントです。
例
ツリーの深さを制御する方法はいくつかあり、その多くはツリー内の一部のルートの深さを他のルートよりも深くすることができます。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)
データは以前書いたコードを使用して、train_X、val_X、train_y、val_yを用います。
以前のコード
# Data Loading Code Runs At This Point
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 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.model_selection import train_test_split
# split data into training and validation data, for both features and target
train_X, val_X, train_y, val_y = train_test_split(X, y,random_state = 0)
forループを使用してmax_leaf_nodesに異なる値を指定して構築されたモデルの精度を比較できます。
# 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
出力されているオプションのうち、500が最適な葉の数です。
まとめ
要点は次の通りです: モデルは次のいずれかのパターンに陥る可能性があります。
- 過剰学習: 将来に再現しない誤ったパターンを捉え、予測精度が低下する、または
- 過少学習: 関連するパターンを補足できず、予測のせいどが低下します。
モデルのトレーニングでは使用されない検証データを使用して、候補モデルの精度を測定します。これにより、多くの候補モデルを試して、最適なモデルを選択しましょう。