このドキュメントは未完成です。
scikit_learn==0.24.1
numpy==1.20.2
matplotlib==3.4.1
Pillow==8.2.0
K nearest neighbors(以下、KNNと呼ぶ)はテストデータが入力されたときにそれに近いk個のトレーニングデータを取り、それらのラベルの多数決を採ることで、テストデータのラベルを予測するモデルである。
MNIST(Modified National Institute of Standards)は0~9の手書き数字の画像データセットだ。データセットには60,000枚のトレーニングデータと10,000枚のテストデータが含まれている。 MNIST分類を行うために元となるデータは、OpenMLのmnist_784から取得した。
MNISTのテストデータセットのそれぞれの手書き数字画像データのラベル(0~9)をKNNを用いて予測した。 このラベル予測のことを本稿では以後、「MNIST分類」と呼ぶことにする。
KNNでラベル予測のために取得するトレーニングデータの個数kk(パラメータ)を選択する。 TODO:バリデーションセットのこと記述
バリデーションセットを分割する前のトレーニングデータをkk=3でKNNに学習させる。 さらにその学習済みのモデルを用いて、テストデータをMNIST分類させた。
結果、ラベル推測の正答率は97.05%となった。
MNIST分類の際に生じたエラー(誤ったラベル予測)の分析のために(1)外れ値の可能性検証(2)頻出するエラーのを行う。
そのために(1)ヒストグラムによる正解したデータとエラーになったデータの分布比較(2)混合行列(Confusion Matrix)による確認を行なう。
テストデータと3つのneighborの特徴量それぞれのユークリッド距離の計算結果の平均(以下、ユークリッド距離と呼ぶ)を横軸とする。横軸の最小値は0、最大値は上記のデータセットのユークリッド距離平均の中で最大のものを採用する。また縦軸はそれぞれのユークリッド距離ごとのデータ数とした。
先ほどMNIST分類したテストデータのうち正解した物とエラーになった物を分け、それぞれを用いて上記の定義に従ったヒストグラムを作成する。
上記から正解したデータの分布は11001200に、エラーとなったデータ分布には16001700に、山(データ数が最も多い箇所)が出来ている。また誤りデータの分布は正解したデータの分布に比べ、全体的に見ても右側に偏っていることがわかる。
以上からデータセットの正誤によって分布の仕方に差があり、誤りデータの一部に外れ値があるとわかった。
ラベル推測を誤ったデータにはどんな特徴があるのかを探るために、混同行列(Confusion Matrix)を用いて確認する。またデータ数の大小を視覚的に確認するために、混合行列をヒートマップ化した。
「正解ラベル-予測ラベル」のうち上記の混合行列で0.015以上となるのうち「7-1」、「4-9」、「8-3」の組み合わせを頻出エラーと呼ぶことにする。 次は頻出エラー及びそのneighborの画像3枚を確認する。
上記の画像を筆者の目視で確認した結果(1)「人間の目で見ても数字を判断出来ないテストデータ」もある一方で(2)「充分に数値判断出来るテストデータ」もあることがわかった。
TODO 一般的に画像データ(ここでバラバラの画像データ出す)は人間の目で見て(正解の)判断がつくものであるべきだ。 *右は左側の画像のピクセルをシャッフルしたもの
しかし、本記事で行なってきたモデルの学習/予測のアルゴリズムではピクセルの光度を(全て同じ規則で)シャッフルしてもスコアの精度に影響が出ることはない。 ※実際に一定の規則に基づいてシャッフルしたデータを学習/予測に用いた結果、正答率はシャッフルする前と同じく97.05%となった。