プログラミングの用語一覧へ
このページの目次
プログラミング中級図解あり

過学習とは?

最終更新:2026/08/18

3秒でわかる

学習データに合わせ込みすぎて、未知のデータでは当たらなくなる状態。訓練の成績だけが良く、本番で急に精度が落ちる原因のほとんどがこれです。

30秒図解

モデル深さ2、5、20、Noneで訓練精度と未知データ精度を比べ、深さ5付近が最適で深さ20以降は過学習になる図
過学習では訓練データへの精度だけが上がり、未知データへの精度が下がります。検証データの曲線が下がる地点が合図です。

もう少し詳しく

どういうものか

過学習(オーバーフィッティング)は、機械学習のモデルが訓練データの細かい癖やノイズまで覚え込んでしまい、初めて見るデータに対する予測が悪くなる状態です。訓練データでの正解率は上がり続けるのに、検証データでの正解率が途中から下がり始める、という形で現れます。

過去問の答えを丸暗記した状態に近く、同じ問題なら満点でも、少し数字を変えられると解けなくなります。

なぜ必要か

この言葉を知らないと、モデルの良し悪しを訓練データの成績で判断してしまいます。精度 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

深さを増やすほど訓練の成績は上がりますが、テストの成績は途中から下がります。この折り返し点の手前が使いどころです。

つまずきやすいところ

分割の仕方を間違えると、過学習に気づけません。時系列データを無作為に分割すると、未来のデータで学習して過去を当てることになり、テストの成績が不自然に良く出ます。同じ人物や同じ店舗のデータが訓練と検証の両方に入る場合も同様です。

対策としてよく挙がるのは、データを増やす、特徴量を減らす、正則化を効かせる、木の深さのような複雑さの上限を下げる、早期終了する、といったものです。逆に、訓練の成績も検証の成績もどちらも低いなら、それは過学習ではなく学習不足(未学習)なので、対処は反対向きになります。

覚え方

訓練の点数と検証の点数が離れていくなら過学習、両方低いなら未学習です。

知識のつながり

サイドバーと同じ推奨ルート・関連語を、まとめて確認できます。

現在地過学習プログラミング

LEARN BY DOING

この用語を、教材で使ってみる

直接関連する編と、その編を含むコースです。用語だけで終わらず、ブラウザ上で実際に手を動かせます。

AI活用コースの全編を見る