アイデア
一度、学習&予測をした後に、確率の低い訓練データを使って転移学習し、確率の低いテストデータを再予測、というのはどうか?
— Masahiro SATO (@satomshr) 2021年1月11日
上記のようなことを考えたので, これまでの学習データ, 予測データを見直して, 精度を高める戦略を考えた.
正しい答えに対する確率と, 予測された最大の確率を調べる
これまでの予測データを使って, 正しい答えに対する確率 (青い線) と, 予測された確率 (tf.keras.Sequential.predict_proba()
の出力) の最大値 (赤い線) をプロットした. データは正しい答えに対する確率で逆順にソートしている. 1 枚目は訓練データ全体 (42000 データ) をグラフにしたもの. 2 枚目は,後ろから 500 データ分のグラフである.
確率が 0.5 を下回ると, 誤答が出てくる. 自信を持って間違えている (赤い線の値が大きい) 場合と, 迷っている (青い線の値と赤い線の値が同じくらい) 場合があることが分かる.
訓練データは答えが分かっているので, 正しい答えに対する確率が低い画像を識別できる. しかしテストデータは (当たり前だが) 正答が分からないので, テストデータから間違っていそうなデータだけ抽出して再予測することはできない.
対策として考えられるのは,
- 最大の確率が例えば 0.8 以下の全ての画像に対して, 再予測する (自信を持って間違えているデータは,あきらめる)
- 全部のテストデータに対して再予測し, 1 回目の予測結果とアンサンブル学習をする (最初の予測で正答が得られているデータの確率が低下する恐れがある)
確率の低い画像データ
ここで, 正答の確率が低いデータを見てみる. 以下は確率の低い 150 個分の画像である. 左上が確率が高いほう, 右下が確率が低いほうで, 画像の上の数字は, 左側が正しい答え, 右側が確率が最大だった答えとなっている.
これらの画像データで学習すれば, これらの画像データに対する正答率は向上する. しかし, もともと確率が高かった正答の画像を, 誤った結果にしてしまう危険性もある.
確率の低いデータのラベルの分布
「どんな数字の予測を間違えているのか?」を調べた. 以下は, 正答の確率の低い画像データ (低いほうから 150 個) で, ラベルごとの個数をプロット. x 軸は正答のラベル, y 軸は個数.
1, 4, 7, 9 のデータで, 誤りが多い.
まとめ (次の戦略)
前述したが, 大きく 2 つのやり方が考えられる (カッコ内はデメリット)
- 最大の確率が例えば 0.8 以下の全ての画像に対して, 再予測する (自信を持って間違えているデータは,あきらめる)
- 全部のテストデータに対して再予測し, 1 回目の予測結果とアンサンブル学習をする (最初の予測で正答が得られているデータの確率が低下する恐れがある)
1 番目のやり方は, 自信を持って間違えているデータが間違えたままになってしまうので, 私としてはイマイチだ. 2 番目のやり方をベースにして, アンサンブルのやり方を工夫する (例えば, 通常のモデルから 3 回分, 確率の低いデータで学習したモデルから 2 回分の予測を出すなど, 重みづけしたアンサンブルにする, など) ことを考えようと思う.
続きは明日 (か?)
蛇足
同じことは Github にも書いてある . Markdown は本当に便利だ.