クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

過学習を見つけて防ぐ

このレッスンのあとで: 過学習を見つけて、減らす方法を説明できる。

55分のレッスンコマンド2件JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

丸暗記したモデルは新しいデータに弱い

過学習(オーバーフィッティング)とは、モデルが学習データを丸暗記して、新しいデータでは外れるようになることです。学習データでの成績だけを見ていると、役に立たないモデルを見逃します。

試験の過去問の答えだけを覚えた人は、問題が変わると解けません。モデルにも、同じことが起こります。

このレッスンのゴール

メモ

過学習を見つけて、減らす方法を説明できる。

キーワード

ことばいみれい
学習データ重みを直すために使うデータ
検証データ学習に使わず、成績の確認だけに使うデータ
過学習学習データには合うが、新しいデータには合わない状態
早期終了検証の損失が悪くなる前に、学習を止めること
待つ回数よくならなくても、止めずに待つエポックの数2
ドロップアウト学習中に、ニューロンの一部をランダムに休ませる方法

学生が入力するセルは、このプレビューでは空白です。

データを学習用と検証用に分ける

学習データだけで成績を測ると、丸暗記でも高い点が出ます。そこで、データの一部を検証データとして取っておきます。

検証データは重みの更新に使わず、エポックのあとに損失だけを測ります。365日のデータなら、およそ4分の3を学習に、4分の1を検証に使います。

ラボのデータは何行あるか

次のコマンドは、hires.csv の行数を数えます。1行目は列の名前なので、日数は行数より1少なくなります。

行数を数える

コマンド
docker exec jupyter wc -l hires.csv

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

例: 8エポックの損失

エポック学習データの損失検証データの損失差
10.900.950.05
20.600.700.10
30.420.520.10
40.300.470.17
50.210.490.28
60.140.550.41
70.090.640.55
80.050.780.73

学生が入力するセルは、このプレビューでは空白です。

差の広がりを調べる

コード: python
train = [0.90, 0.60, 0.42, 0.30, 0.21, 0.14, 0.09, 0.05]
valid = [0.95, 0.70, 0.52, 0.47, 0.49, 0.55, 0.64, 0.78]
for n in range(len(train)):
    gap = valid[n] - train[n]
    print("エポック", n + 1, "差", round(gap, 2))
# 差が 0.2 を超えるのは、何エポック目ですか。
# 検証の損失が 0.6 を超えるのは、何エポック目ですか。

早期終了は悪くなり始めたら止める

早期終了は、検証の損失がよくならなくなったら、学習を止める方法です。1回悪くなっただけでは止めません。損失は揺れることがあるからです。

待つ回数を決めておき、最良の損失が出てから、その回数だけよくならなければ止めます。止めたあとは、最良のエポックの重みを使います。

例: 待つ回数を2にした場合

エポック検証の損失最良のあとの回数判断
10.950最良を更新
20.700最良を更新
30.520最良を更新
40.470最良を更新
50.491続ける
60.552止める

学生が入力するセルは、このプレビューでは空白です。

最良の損失は最小値で見つかる

最良の損失は、検証の損失のうち、いちばん小さいものです。次のコマンドは、表の6エポック分から、最小値を求めます。

検証の損失の最小値を調べる

コマンド
docker exec jupyter python3 -c "print(min([0.95, 0.7, 0.52, 0.47, 0.49, 0.55]))"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

過学習を減らす方法は他にもある

学習データを増やすと、丸暗記しにくくなります。ネットワークを小さくするのも効きます。ドロップアウトは、学習中にニューロンの一部を休ませて、特定のニューロンに頼らせません。

重みが大きくなりすぎないよう罰を足す正則化もあります。どの方法でも、効いたかどうかは検証データで確かめます。

よくある間違い

注意

学習データでの成績が高ければ、よいモデルだと考えがちです。しかし丸暗記でも高くなります。検証の損失が上がり始めたら、過学習のしるしです。最後の確認用のテストデータは、調整が終わってから1回だけ使います。

このラボとソースについて: JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。