3秒でわかる
学習データに合わせ込みすぎて、未知のデータでは当たらなくなる状態。訓練の成績だけが良く、本番で急に精度が落ちる原因のほとんどがこれです。
30秒図解
もう少し詳しく
どういうものか
過学習(オーバーフィッティング)は、機械学習のモデルが訓練データの細かい癖やノイズまで覚え込んでしまい、初めて見るデータに対する予測が悪くなる状態です。訓練データでの正解率は上がり続けるのに、検証データでの正解率が途中から下がり始める、という形で現れます。
過去問の答えを丸暗記した状態に近く、同じ問題なら満点でも、少し数字を変えられると解けなくなります。
なぜ必要か
この言葉を知らないと、モデルの良し悪しを訓練データの成績で判断してしまいます。精度 99% と報告されたモデルが本番で半分も当たらない、という事故はここから起きます。だからこそ、データを訓練用と検証用に分けて、見せていないデータでの成績を評価に使います。
具体例
from sklearn.model_selection import train_test_split
from sklearn.<a href="/glossary/tree" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">tree</a> import DecisionTreeClassifier
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=0
)
for depth in [2, 5, 20, <a href="/glossary/none" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">None</a>]:
model = DecisionTreeClassifier(max_depth=depth, random_state=0)
model.fit(X_train, y_train)
print(depth,
round(model.score(X_train, y_train), 3), # 訓練の成績
round(model.score(X_test, y_test), 3)) # 未知データの成績
# 2 0.81 0.79
# 5 0.92 0.88
# 20 1.00 0.76 訓練だけ満点 ここが過学習
# None 1.00 0.74深さを増やすほど訓練の成績は上がりますが、テストの成績は途中から下がります。この折り返し点の手前が使いどころです。
つまずきやすいところ
分割の仕方を間違えると、過学習に気づけません。時系列データを無作為に分割すると、未来のデータで学習して過去を当てることになり、テストの成績が不自然に良く出ます。同じ人物や同じ店舗のデータが訓練と検証の両方に入る場合も同様です。
対策としてよく挙がるのは、データを増やす、特徴量を減らす、正則化を効かせる、木の深さのような複雑さの上限を下げる、早期終了する、といったものです。逆に、訓練の成績も検証の成績もどちらも低いなら、それは過学習ではなく学習不足(未学習)なので、対処は反対向きになります。
覚え方
訓練の点数と検証の点数が離れていくなら過学習、両方低いなら未学習です。