過去の売上は全部当たるのに
名古屋のスーパーで、牛乳の販売数を予測するモデルを作りました。
過去1年分のどの日を聞いても、ぴったりの本数を答えます。ところが、来週の予測はまるで当たりません。
このモデルは、パターンを学んだのではなく、答えを覚えていただけでした。このレッスンでは、そうしたモデルの見分け方を学びます。
このレッスンのゴール
メモ
例を丸暗記したモデルを、成績の表から見分けられる。
キーワード
| ことば | いみ |
|---|---|
| 過学習 | モデルが例を丸暗記し、新しいデータに弱くなることです。 |
| 汎化 | 見ていないデータにも、うまく答えられることです。 |
| 訓練の成績 | 学習に使った例で測った成績です。 |
| テストの成績 | 学習に使っていない例で測った成績です。 |
| 検証データ | 学習の途中で、成績を見るために取っておく例です。 |
学生が入力するセルは、このプレビューでは空白です。
訓練とテストの差が、合図になる
過学習を見つけるには、二つの成績を並べます。
訓練の成績がとても高く、テストの成績がずっと低い。この差が大きいのが、過学習の合図です。
二つの成績が近ければ、見ていないデータにも答えられています。これを汎化と呼び、モデルに一番求められる力です。
三つのモデルを比べる
| モデル | 訓練の成績 | テストの成績 | 差 | 判断 |
|---|---|---|---|---|
| A | 70% | 68% | 2 | 単純すぎて、まだ学びが足りない |
| B | 99% | 62% | 37 | 過学習 |
| C | 85% | 83% | 2 | よく汎化している |
学生が入力するセルは、このプレビューでは空白です。
覚えすぎると、新しい日に答えられない
過去の売上には、偶然の出来事も混ざっています。近くで祭りがあった日や、冷蔵ケースが故障した日です。
例が少ないのにモデルが細かすぎると、その偶然まで覚えてしまいます。これが過学習です。
下のコードは、極端な例です。見た例とまったく同じ入力にしか、答えられません。
やってみよう: 丸暗記するモデル
# 丸暗記するモデルです。見た例と、まったく同じ入力にしか答えられません。
memory = {"月曜・20度": 50, "火曜・22度": 48, "水曜・21度": 52}
question = "月曜・20度"
if question in memory:
print("予測:", memory[question], "本")
else:
print("見たことがない入力なので、答えられません。")
# 平均で答えるモデルなら、新しい入力にも答えが出せます。
total = 50 + 48 + 52
print("平均で答えるモデルの予測:", total / 3, "本")
# question を "月曜・21度" に変えて、もう一度実行しましょう。
よくある誤解
注意
訓練の成績が100%に近いほど、良いモデルだと考える人がいます。実際には、テストの成績と比べるまで、良いかどうかは分かりません。訓練の成績だけが高いときは、まず過学習を疑いましょう。
過学習は、こうして防ぐ
過学習を防ぐ方法は、主に三つあります。
一つ目は、例を増やすことです。例が多ければ、偶然の出来事は目立たなくなります。
二つ目は、モデルを単純にすることです。
三つ目は、検証データで途中の成績を見て、悪くなり始めたら学習を止めることです。テストデータは、最後まで使わずに取っておきます。