Courses
学習データでは正解率99%なのに、本番環境ではまったく当たらないのはなぜでしょうか?
暗記したモデルと学習したモデルには違いがあります。機械学習の目的は汎化にあります——学習に使ったデータだけでなく、モデルが未見のデータでも通用する予測を得ることです。そうなっていない場合、問題はたいてい次のどちらかに振れています。
その2つの方向性が、過学習と未学習です。解決に取りかかる前に、どちらに直面しているのかを見極める必要があります。
この記事では、過学習と未学習の見分け方、起こる理由、そしてバランスを取るための実践的な手順を解説します。
未学習とは?
未学習は、モデルが実際のデータの構造を表現するには単純すぎるときに起こります。
たとえば住宅価格を「すべての家は30万ドル」という単一のルールで予測しようとする状況を想像してください。そのルールはほとんどの場所で外れます。地域、延床面積、寝室数、ガレージ、築年数などが見えていません。パターンに追随する柔軟性がまったく足りていないのです。
未学習は毎回同じように見つけられます。学習時の精度が低く、テスト時の精度も低い。どちらの数値も悪いのですが、重要なのは両方とも悪いという点です。
典型例は、曲線的なデータに直線を当てはめるケースです。直線は中央を横切り、形状を捉え損ねます。モデル自体が関係性を表現できないため、どれだけ学習データを増やしても改善しません。

未学習の例
過学習とは?
過学習は反対の問題で、モデルが複雑すぎる状態です。
一般的なパターンを学ぶのではなく、学習データを丸暗記します。ノイズの点、奇妙な外れ値、ピークや谷、偶然の相関まですべてを本物のパターンのように扱います。結果として、学習に用いたデータに対してはほぼ完璧になります。
過学習の良い点は、見分けやすいことです。学習時の精度は非常に高いのに、テスト時の精度はひどい。
教材の答えを丸暗記して本質を理解していない学生を思い浮かべてください。模試では良い点を取れても、本番では失敗します。

過学習の例
過学習と未学習:主な違い
両方を見た今なら、違いはより明確です。未学習のモデルは、見たことのあるデータでも性能が出ません。過学習のモデルは、見たことのないデータで性能が出ません。
学習中の挙動も異なります。
- 未学習は全体に平坦で凡庸な性能として現れます——モデルが何からも大して学べていません
- 過学習はギャップとして現れます。学習スコアは上がり続ける一方で、テストスコアは頭打ちになるか、時間とともに悪化します
原因も鏡映的です。未学習はやることが少なすぎる(単純なモデル、欠けた特徴量)ことで起こり、過学習はやることが多すぎる(複雑すぎるモデル、過剰な特徴量)ことで起こります。
2つの要点を振り返ります。

未学習と過学習の比較
過学習と未学習の見分け方
理論としての見た目を知るのと、自分のモデルで検知するのとは別問題です。
最も簡単なのは、学習誤差とテスト誤差を比較し、学習曲線を見ることです。
学習誤差とテスト誤差
最速の確認手順は、データを学習用とテスト用に分割し、モデルを学習して、それぞれの誤差を見ることです。
未学習では、両方の誤差が高くなります。学習データをうまく学べておらず、未見データでも良くなりません。両方で同じ悪い結果になります。
過学習では、学習誤差は非常に低いのに、テスト誤差は高いままです。学習データは暗記しましたが、その知識は転移しません。

学習誤差とテスト誤差の可視化
2つの数値のギャップを分析します。小さなギャップで誤差が高いなら未学習。大きなギャップで学習誤差が低くテスト誤差が高いなら過学習。両方の誤差が低くギャップも小さいのが理想で、実際のデータ表現を学べていることを意味します。
学習曲線
学習曲線は、学習用データのサイズや学習反復数に対する学習誤差と検証誤差をプロットし、学習の進行に伴う挙動を示します。
未学習モデルでは、両方の曲線が高い誤差で早々に横ばいになります。モデル自体がパターンを表現できないため、データを増やしても効果がありません。両方の曲線が高止まりします。

未学習モデルの曲線
過学習モデルでは、学習曲線がほぼゼロまで下がる一方で、検証曲線は高いままです。学習を続けるほど両者のギャップが広がります。拡大するギャップが、グラフ上の過学習のサインです。

過学習モデルの曲線
健全なモデルでは、両方の曲線が低い誤差へと下がり、両者が小さなギャップで収束します。
過学習と未学習が起こる理由
見分け方が分かったら、次はなぜ起こるのかです。どちらも、モデルと問題設定のミスマッチに起因しますが、方向性が逆です。
未学習の原因
未学習はほぼ必ず次の3つのいずれかに行き着きます。
- モデルが単純すぎる: 線形モデルでは曲線的な関係を表現できません。問題が実際に必要とする容量にモデルが達していません。
- 特徴量が不十分: 有能なモデルでも、入力が不適切なら未学習になります。郵便番号だけで住宅価格を予測するのは無理があり、延床面積、寝室数、状態、築年数、敷地面積などを見落とします。モデルには有益な材料がありません。
- 学習が不十分: 深さ、反復回数、エポック数、学習率の調整などが不足して、良い解に到達していない可能性があります。学習を早く止めすぎました。
過学習の原因
過学習は、データが必要とする以上の自由度をモデルに与えることで起こります。
- モデルが複雑すぎる: パラメータが何百万もあるディープニューラルネットを小さなデータセットに学習させれば、暗記できる余地が十分にあります。容量が問題のニーズを超えています。
- 特徴量が多すぎる: データに含まれる有意なパターン以上に特徴量があると、学習サンプル内にたまたま存在する相関を学んでしまい、汎化しません。
- データセットが小さすぎる: 学習データが限られていると、ほどほどの複雑さでも全データを暗記してしまいます。汎化のための事例が足りません。
- 学習が長すぎる: 実際のパターンを学んだ後も重みの調整を続け、ノイズに当てはまり始めます。そこから先は、学習を続けるほど悪化します。
バイアス–バリアンスのトレードオフ
バイアス–バリアンスのトレードオフは、モデル性能の肝が、問題を過度に単純化もせず、学習データに過適合もしない「ちょうどよい」点を見つけることにある理由を説明します。
高バイアス
バイアスは、モデルがデータについて置く仮定によって生じる誤差です。高バイアスのモデルは強い単純化を前提にしており、データ内の実際の複雑さを表現できません。
これはまさに未学習です。モデルが硬直的でパターンに適合できず、どれだけデータを与えても予測が外れます。
高バイアスのモデルを異なるサンプルで100回学習しても、100個すべてが似たような誤りを犯します。予測は誤った答えの周りに群がります。
高バリアンス
バリアンスは、モデルが学習に使った特定のデータに過敏であることから生じる誤差です。高バリアンスのモデルは、たいていノイズである細かなパターンまで拾います。
これが過学習です。学習データにはぴったり合う一方で、学習データが少し変わるだけで予測が大きく変わります。
高バリアンスのモデルを異なるサンプルで100回学習すると、100通りの非常に異なるモデルが得られます。同じ入力に対しても予測がバラバラになります。
トレードオフ
バイアスとバリアンスを完全に消すことはできず、両者の間でバランスを取るしかありません。
モデルを複雑にしてバイアスを下げれば、バリアンスは上がります。モデルを単純にしてバリアンスを下げれば、バイアスは上がります。目標は、その中間で総誤差が最小になる点を見つけることです。

バイアス–バリアンスのトレードオフの例
未学習の直し方
未学習と診断できたら、直す方法はいくつかあります。いずれも、データ中のパターンを表現するためのモデルの容量を増やす方向です。
- モデルの複雑さを上げる: より柔軟なモデルへ移行します。線形回帰から多項式回帰へ、浅い木からより深い木へ。
- 特徴量を追加する: 価値のある新しい入力を加えます。交互作用項や多項式特徴、ドメイン固有の特徴を作成し、モデルがアクセスできる情報を増やします。
- より長く学習する: 収束するのに十分な時間がなかった可能性があります。エポック数を増やす、学習率スケジュールを変えるなどしてください。
- 正則化を弱める: 正則化はモデルを単純に保つもので、未学習には逆効果です。正則化の強さを下げるか、思い切って外して自由度を高めます。
良質な特徴量を数個追加する方が、アーキテクチャ変更より効くことはよくあります。モデル自体を変える前に、まずは特徴量から着手してください。
過学習の直し方
過学習の修正は逆方向のアプローチです。モデルが学習データを暗記するのを止めるように制約します。
- データを増やす: データセットが大きくなると、暗記は格段に難しくなります。より多くの事例が、少数の行にだけ当てはまるものではなく、全体に通用するパターンの学習を強います。
- 正則化を適用する: L1 と L2 の正則化 は大きな重みにペナルティを課し、単一の特徴に過度に依存するのを抑えます。最も頼りになる対策の一つです。
- モデルの複雑さを下げる: データに対してモデルが大きすぎるなら縮小します。パラメータ数を減らす、浅い木にする、小さなネットワークにするなど。
- 交差検証を使う: 交差検証 は、未見データでの性能をより正直に評価します。単一のデータセットから複数の学習・テスト分割を得られます。
- ニューラルネットにドロップアウトを適用する: ドロップアウト は学習中に一定割合のニューロンをランダムに無効化します。これにより冗長な表現を学ばせ、単一のニューロンへの依存を減らします。
- 早期終了する: 検証誤差を監視し、増加し始めたら学習誤差が下がり続けていても学習を止めます。これはアーリーストッピングと呼ばれ、最も簡単に導入できる対策の一つです。
正則化とアーリーストッピングは、まず試すべき基本対策です。コストがかからず、ほぼ常に効果があります。
モデル別の過学習と未学習
モデルの系統によって、未学習と過学習の現れ方は異なります。ここでは代表的な3種で、両方向の失敗がどう起こるかを示します。
線形モデル
- 未学習: 線形モデルは直線関係を仮定します。実際のパターンが曲がっていると、どれだけデータを与えても追随できません。
- 過学習: 多項式項や交互作用項を十分に追加すれば、線形回帰でもノイズを暗記できます。Ridge や Lasso のような正則化は主にこれを抑えるためにあります。
決定木
- 未学習: 浅い木は少数の分割しかできません。2〜3回の判断では、より繊細なパターンを表現できません。
- 過学習: 深い木は過学習しがちです。各リーフが単一の学習事例になるまで分割を続けると、学習精度は完璧でもテスト精度は低下します。そのために
max_depth、min_samples_split、および剪定(プルーニング)といったパラメータが存在します。
ニューラルネットワーク
- 未学習: 問題に対してネットワークが小さすぎると未学習になります。学習が早く止まりすぎた場合や、最適化手法が不十分な解に陥った場合も同様です。
- 過学習: ディープラーニングではより一般的です。パラメータが何百万もあるネットワークは、大規模データでも十分なエポックを与えれば暗記できます。ドロップアウト、重み減衰、データ拡張、アーリーストッピングはその防止策です。
過学習と未学習の追加例
ここからは、典型例を2つ、パターンが見やすいコードとともに紹介します。
多項式回帰
ノイズのある正弦波は良いテストケースです。次数の異なる多項式を当てはめると、モデル挙動の違いが見えてきます。
import numpy as np
# Data
np.random.seed(7)
X = np.linspace(0, 1, 30)
y_true = np.sin(2 * np.pi * X)
y = y_true + np.random.normal(0, 0.2, X.shape)
# Fit polynomials of three degrees
X_smooth = np.linspace(0, 1, 300)
degrees = [1, 3, 15]
for degree in degrees:
coefs = np.polyfit(X, y, deg=degree)
y_pred = np.polyval(coefs, X_smooth)

多項式回帰の例
次数1は直線で未学習です。曲線にまったく追随できません。次数3は実際の形状を表現します。ノイズを多少吸収しつつも真値に近く保ちます。次数15は過学習で、すべての学習点をなぞるようにうねり、その間で大きな振動を生みます。
深さを変えた決定木
決定木でも同じ話が見られます。同一データで深さを増やしながら学習し、学習用とテスト用の両方で誤差を測ります。
import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# Data
np.random.seed(11)
X = np.linspace(0, 10, 250).reshape(-1, 1)
y = np.sin(X).ravel() + np.random.normal(0, 0.3, 250)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=0
)
depths = range(1, 21)
train_errors = []
test_errors = []
for depth in depths:
tree = DecisionTreeRegressor(max_depth=depth, random_state=0)
tree.fit(X_train, y_train)
train_errors.append(mean_squared_error(y_train, tree.predict(X_train)))
test_errors.append(mean_squared_error(y_test, tree.predict(X_test)))

決定木の例
木が深くなるにつれて学習誤差は減少し、各リーフが単一の学習点だけを含む頃にはゼロに近づきます。テスト誤差は、実際の関係を捉える段階では下がりますが、より深い分割でノイズに当てはまり始めると再び上がります。最小点は両者のバランスが取れた深さにあります。
モデル性能の診断で陥りがちな誤り
正しい指標を選んでいても、誤った結論に至るのは簡単です。モデル評価でやってはいけないことを挙げます。
- 学習精度だけを評価する: 学習精度は、既に見たデータへの当てはまりを示すだけです。新しい入力でどう振る舞うかは教えてくれません。結論を出す前に必ず別セットで測定してください。
- 検証データを無視する: 検証データは、アーキテクチャ、ハイパーパラメータ、学習停止点といった選択を調整するためのものです。同じテストセットを使い回すと、学習セットにもテストセットにも過適合します。
- 複雑なら常に良いと決めつける: 大きいモデルが自動的に高性能とは限りません。データが小さい、あるいは関係が単純な場合、複雑さはむしろ性能を下げます。まずはシンプルに始め、診断が必要と示すときだけ容量を増やしてください。
- ノイズをシグナルと取り違える: 学習データのすべてのパターンが学ぶ価値を持つわけではありません。ランダムなゆらぎ、サンプリングバイアス、外れ値、収集過程でのアーティファクトは、柔軟なモデルには意味ありげに見えます。関係が存在すべき理由を説明できないなら、慎重に扱ってください。
どのモデルでも、最終決定の前に必ず上記4点を確認してください。プロダクションでの失敗の多くは、これら(またはいくつかの組み合わせ)に起因します。
まとめ
未学習と過学習は、モデルが汎化に失敗する2つの形です。 一方は単純すぎてパターンを学べず、もう一方はデータセット中のあらゆる点を学ぼうとします。
学習の真の目標は、その中間に到達することです。バイアスとバリアンスのバランスが取れ、総誤差が最小になる地点です。
検証性能こそが自分の位置を教えてくれる指標です。学習中は常に追跡し、学習誤差と検証誤差の差に基づいて判断してください。学習誤差が下がり続けるのに検証誤差が改善しなくなったら、最適点を通り過ぎています。両方が高止まりなら、まだ到達していません。
高度なデータサイエンスの概念をさらに学び、2026年の即戦力を目指しますか? Machine Learning Engineer トラックに登録して、基礎から MLOps まで学びましょう。
FAQs
過学習と未学習の違いは何ですか?
未学習は、モデルがデータ内のパターンを表現するには単純すぎるときに起こり、学習・テストの両方で性能が低くなります。過学習はその逆で、学習データのノイズまで学習してしまうため、学習時は高性能でも新しいデータで失敗します。どちらも予測精度を弱めますが、理由が異なります。
自分のモデルが過学習か未学習かはどう見分ければよいですか?
学習誤差とテスト誤差を比較してください。両方が高ければ未学習。学習誤差が非常に低いのにテスト誤差が高ければ過学習です。学習曲線も有用で、過学習では学習と検証の誤差が乖離し、未学習では高い誤差で平坦になります。
バイアス–バリアンスのトレードオフとは何ですか?
バイアスはモデルが単純すぎることに起因する誤差で、バリアンスは学習データへの過敏さに起因する誤差です。一方を減らすと他方が増えるのが常で、総誤差が最小となるバランス点を探るのが目標です。最良のバランスを持つモデルが新しいデータに最もよく汎化します。
データを増やせば過学習は解決しますか?
多くの場合は有効ですが、万能薬ではありません。データが増えると暗記が難しくなり、全体に通用するパターンを学ばざるを得なくなります。ただし、モデルが問題に対して極端に複雑すぎる場合や、特徴量の大半がノイズである場合、データを増やすだけでは解決しません。そうしたケースでは、正則化やより単純なモデルの方が有効なことが多いです。
ニューラルネットの過学習防止にアーリーストッピングは使えますか?
はい。しかも最も簡単に導入できる対策の一つです。学習中に検証誤差を監視し、横ばいまたは増加に転じたら、学習誤差が下がり続けていても停止します。これはモデルが実パターンを学び終え、ノイズに当てはまり始めた時点を捉えます。主要なディープラーニングフレームワークにはアーリーストッピングのコールバックが用意されています。