今日の kaggle / MNIST は準備だけ

イデア

上記のようなことを考えたので, これまでの学習データ, 予測データを見直して, 精度を高める戦略を考えた.

正しい答えに対する確率と, 予測された最大の確率を調べる

これまでの予測データを使って, 正しい答えに対する確率 (青い線) と, 予測された確率 (tf.keras.Sequential.predict_proba() の出力) の最大値 (赤い線) をプロットした. データは正しい答えに対する確率で逆順にソートしている. 1 枚目は訓練データ全体 (42000 データ) をグラフにしたもの. 2 枚目は,後ろから 500 データ分のグラフである.

正しい答えと間違った答えの確率

正しい答えと間違った答えの確率(拡大)

確率が 0.5 を下回ると, 誤答が出てくる. 自信を持って間違えている (赤い線の値が大きい) 場合と, 迷っている (青い線の値と赤い線の値が同じくらい) 場合があることが分かる.

訓練データは答えが分かっているので, 正しい答えに対する確率が低い画像を識別できる. しかしテストデータは (当たり前だが) 正答が分からないので, テストデータから間違っていそうなデータだけ抽出して再予測することはできない.

対策として考えられるのは,

  • 最大の確率が例えば 0.8 以下の全ての画像に対して, 再予測する (自信を持って間違えているデータは,あきらめる)
  • 全部のテストデータに対して再予測し, 1 回目の予測結果とアンサンブル学習をする (最初の予測で正答が得られているデータの確率が低下する恐れがある)

確率の低い画像データ

ここで, 正答の確率が低いデータを見てみる. 以下は確率の低い 150 個分の画像である. 左上が確率が高いほう, 右下が確率が低いほうで, 画像の上の数字は, 左側が正しい答え, 右側が確率が最大だった答えとなっている.

確率の低い画像データ

これらの画像データで学習すれば, これらの画像データに対する正答率は向上する. しかし, もともと確率が高かった正答の画像を, 誤った結果にしてしまう危険性もある.

確率の低いデータのラベルの分布

「どんな数字の予測を間違えているのか?」を調べた. 以下は, 正答の確率の低い画像データ (低いほうから 150 個) で, ラベルごとの個数をプロット. x 軸は正答のラベル, y 軸は個数.

確率の低いデータのラベルの分布

1, 4, 7, 9 のデータで, 誤りが多い.

まとめ (次の戦略)

前述したが, 大きく 2 つのやり方が考えられる (カッコ内はデメリット)

  1. 最大の確率が例えば 0.8 以下の全ての画像に対して, 再予測する (自信を持って間違えているデータは,あきらめる)
  2. 全部のテストデータに対して再予測し, 1 回目の予測結果とアンサンブル学習をする (最初の予測で正答が得られているデータの確率が低下する恐れがある)

1 番目のやり方は, 自信を持って間違えているデータが間違えたままになってしまうので, 私としてはイマイチだ. 2 番目のやり方をベースにして, アンサンブルのやり方を工夫する (例えば, 通常のモデルから 3 回分, 確率の低いデータで学習したモデルから 2 回分の予測を出すなど, 重みづけしたアンサンブルにする, など) ことを考えようと思う.

続きは明日 (か?)

蛇足

同じことは Github にも書いてある . Markdown は本当に便利だ.