【Digit Recognizer】多層パーセプトロン(ディープラーニング)でMNISTデータセットの分類した話

Kaggle
しぃたけ
しぃたけ

sikit-learnの MLPClassifier(多層パーセプトロン)を用いてMNISTの文字分類を行っていきます。

やりたい事

前回前処理を実施したMNISTデータセットの文字分類を行っていきます。


前回記事

https://cpptake.com/2020/05/04/【digit-recognizer】mnistの数字識別コンペ-前処理編/

今回は識別器に多層パーセプトロンを使って識別を行い、Kaggleに提出するとところまでやっていきます。

多層パーセプトロンは、scikit-learnを利用しました。

参考文献はこちらです。




多層パーセプトロンについて

多層パーセプトロンとは?

自分自身認識がふわふわしてるんですが、一言でいうと

近年注目されているディープラーニングの技術の一番基本的な形のもの。

という認識です。

多層パーセプトロンにシグモイドなどの活性化関数を利用したものがニューラルネットワーク。

ニューラルネットワークの隠れ層が2層以上あるものディープラーニングやと思ってます。

今回は、活性化関数を使う + 隠れ層が2層以上 なので広い意味ではディープラーニングだと思うのですが、関数の名前がMLP(Multi Layer Perceptron)なので、本文では多層パーセプトロンで統一します。

もし認識に間違いあればコメントとかいただければと思います。


scikit-learnのMLPClassifierのパラメータ

今回使うscikit-learnのMLPClassifierのパラメータは下記に説明されてます。

ニューラルネットワークのパラメータ設定方法(scikit-learnのMLPClassifier)
目次あらすじ1. hidden_layer_sizes| 層の数と、ニューロンの数を指定2. activation| 活性化関数を指定3. solver| 最適化手法を選択4. alpha| L2正則化のpenaltyを ...

リンク先を見るとMLPClassifierはパラメータ数が 21種類 存在することがわかります。

これを1つ1つ振っていたらきりがないので今回使うのはよく使われる、

batch_size(ミニバッチのサイズ)、hidden_layer_sizes(隠れ層のサイズ)、max_iter(反復学習の最大回数)、activation(活性化関数)

くらいに絞って使っていきます。

それでは早速モデルを作成しましょう。



モデル作成

教師データとテストデータの分割

まずは、MLPの精度を確認するために、正解ラベルのある教師データ(X_train)をtrain_test_split関数で、もう一度教師データ、テストデータに分割していきます。

n数が40000存在した教師データ(X_train,y_train)が33600個のX_train2、8400個のX_test2に分割できました。

これで、モデルを作成した際の精度の検証が可能になりました。

こちらのデータをつかってモデルを作成していきましょう。


多層パーセプトロンを用いたモデルの作成

scikitlearnのMLPClassifierを利用してモデルを作成します。

パラメータは 適当に設定して、隠れ層は2層( 100、100) 活性化関数 relu 最適化手法 adam 学習反復回数 20 で実装します。その他はデフォルトでやってみます。

accuracy_score : 0.951 (正答率:95.1%)

lossも10回目の反復付近で収束していることがわかります。

適当にパラメータ決めた割には悪くない結果ではないでしょうか?

一度この状態でKaggle提出してみます。


csv出力と提出

教師データをX_train2 → X_trainに、テストデータをy_test2 → y_test変更してからcsv出力を行います。

結果は、、、

Score:0.95128(正答率:95.128%)

順位:2011位/2352位中(上位85.5%)

95%悪くない結果かと思いきや、という下から数えたほうがはるかに速いという結果になりました笑。

プライド的に上位50%くらいには入りたいところですが、適当に設定したパラメータではだめだったのでしょうか?

ということで上位50%くらいに入れるようにパラメータチューニングを行っていきます!


RandomizedSearchCVを利用したパラメータチューニング

調べてみたところ、ニューラルネットワークではパラメータが多いのでRandomizedSearchCVが適しているとのこと。 使ってみようと思います。

( 出展:https://zerofromlight.com/blogs/detail/28/

なお、設定するパラメータも根拠はなく適当に下記の通りの値で設定しました。

ベストパラメータ決まりました!

上記のパラメータで再設定してもう一度提出してみます。

提出結果は、、

Score : 95.971%

順位 : 1975位/2367位(上位83.4%)


。。。。。

全然あかんやん

一応順位は50位くらい上がってますが、パラメータ調整だけではこれが限界ってことですね。

上位50%なんて夢のまた夢みたいな場所にいるってことですね。



感想、今後の展望

MNISTデータセットは世界的に有名なデータセットなので、ぽっと出が上位に食い込むのは難しいということがわかりました。調子乗ってすみませんでした。

調べてみると、このコンペで上位1000位以内に入るためにはScoreが99%を目指す必要があるみたいです。

そうなってくると多層パーセプトロンだけでは相当頑張らないとむすかしそうなので、根本的にモデルを考え直す必要がありそうです。

画像処理といえばCNN(畳み込みニューラルネットワーク)が有名です。次回はCNNを利用して1000位以内は入りたいですね。

コメント

タイトルとURLをコピーしました