報告では100%だったのに
大阪のある物流会社が、配達が遅れるかを予測するモデルを作りました。
社内の報告では、正解率は100%でした。ところが、実際の配達で使い始めると、10件中6件しか当たりません。
原因は、モデルの作り方ではなく、テストのやり方にありました。このレッスンでは、正しいテストのしかたを学びます。
このレッスンのゴール
メモ
モデルを、学習に使っていないデータでテストする理由を説明できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 訓練データ | モデルが学ぶために使う例です。 | |
| テストデータ | 成績を測るために、取っておく例です。 | |
| 分割 | データを訓練用とテスト用に分けることです。 | 8割と2割 |
| 未知のデータ | モデルがまだ一度も見ていないデータです。 | |
| データ漏れ | テスト用の情報が、学習に混ざることです。 |
学生が入力するセルは、このプレビューでは空白です。
覚えた例で測っても、力は分からない
新人のドライバーが、研修で走ったルートだけを覚えたとします。そのルートでは、もう迷いません。
でも、本当の力が分かるのは、初めて走る地区に出たときです。
モデルも同じです。学習に使った例で測ると、答えを覚えているだけでも高い点が出ます。仕事で出会うのは、いつも未知のデータです。だから、見ていないデータで測ります。
例: 同じモデルを二通りに測る
| 測ったデータ | 当たった件数 | 正解率 |
|---|---|---|
| 学習に使った100件 | 100件 | 100% |
| 学習に使っていない100件 | 60件 | 60% |
| 実際の配達(翌月) | 約60件 | 約60% |
学生が入力するセルは、このプレビューでは空白です。
データは、最初に分けておく
学習を始める前に、データを二つに分割します。
よく使われるのは、8割を訓練データ、2割をテストデータにする分け方です。
テストデータは、最後の成績を測るときまで、モデルに見せません。1000件あれば、800件で学び、200件で測ります。
やってみよう: 8割と2割に分ける
# 大阪の物流会社の、配達記録10件です。1 は遅れ、0 は時間どおりです。
records = [0, 1, 0, 0, 1, 0, 0, 1, 0, 0]
percent = 80
# 何件を訓練に使うかを、割合から計算します。
cut = len(records) * percent // 100
train = records[:cut]
test = records[cut:]
print("訓練データ:", len(train), "件", train)
print("テストデータ:", len(test), "件", test)
# percent を 70 に変えて、件数がどう変わるか見ましょう。
よくある誤解
注意
データは全部学習に使い、同じデータでテストすればよい、と考える人がいます。それでは、答えを覚えただけのモデルでも満点になります。成績を報告するときは、学習に使っていないデータで測った数を出しましょう。
データ漏れは、気づかないうちに起きる
テスト用の情報が学習に混ざることを、データ漏れと呼びます。
たとえば、同じ荷物の記録が二重に登録され、訓練とテストの両方に入ることがあります。
時間にも注意します。4月から9月で学び、10月で測るのが自然です。10月の記録で学ぶと、未来を知っているモデルになってしまいます。
データ漏れがあるのはどれか
| やり方 | 漏れ | 理由 |
|---|---|---|
| 4月から9月で学び、10月で測る | なし | 過去で学び、後の月で測っている |
| 同じ荷物の記録が、両方に入っている | あり | テストの答えを見てしまう |
| 全期間から、ばらばらに2割を取る | 注意 | 未来の記録で学ぶことがある |
| 実際の到着時刻を、特徴量に入れる | あり | 予測の時点では分からない情報 |
学生が入力するセルは、このプレビューでは空白です。