2018-09-23こしあんTweetPocket構造化データを畳み込みニューラルネットワーク(CNN)で分析することを考えます。BrestCancerデータセットはScikit-learnに用意されている、乳がんが良性か悪性かの2種類を分類する典型的な構造化データです。サンプル数569、データの次元30の典型的な構造化データです。目次なぜ畳み込みニューラルネットワーク(CNN)なのか多層パーセプトロンでもやってみるそれサポートベクトルマシンでよくない?まとめなぜ畳み込みニューラルネットワーク(CNN)なのかCNNは画像分類など非構造化データに対して使われる例が多いですが、本質的にはBrestCancerデータセットのような構造化データに対しても使えます。1/3」をカーネルとした畳みこみを行ったとしてましょう。(a+b+c)/3$$であり、これは結果的には移動平均を取っているのと同じになります。a-b$$という差分を取っているのと同じです。1次元の畳込み処理により、移動平均、差分といった主に時系列解析で使われる手法を内生的に表現でき、どのような処理を行わせるかは訓練を通じてモデルに選ばせるということができます。わかりやすく言うと、「画像のように系列間に相関がある場合は、パラメーター間の相関に着目して訓練が進むCNNもやってみる価値があるよ」ということです。30次元の構造化データをどのようにCNNに落とし込むのでしょうか。入力を「データ数×30×1」にすると1次元の畳み込みの問題に落とし込めます。あとはConv+BatchNorm+ReLUといういつものパターンでできます。最初にデータをfeature-wiseで標準化しておきます。{max_val_acc:.3}")plt.show()CNNを使った場合は最大精度が97.7%となりました。多層パーセプトロンでもやってみる通常よく出てくるのはこちらです。多層パーセプトロンはすぐオーバーフィッティングするのでL2正則化を入れながらやってみます。{max_val_acc:.3}")plt.show()多層パーセプトロンの場合、最大精度が98.8%となりました。今回は多層パーセプトロンがうまくいきましたが、多層パーセプトロンは次元が多くなるとパラメーター数が爆発的に多くなるのでご注意ください。あとよくオーバーフィッティングします。それサポートベクトルマシンでよくない?というディープラーニングあるあるなツッコミがきそうなので、サポートベクトルマシン(SVM)でどれぐらいの精度が出るか見てみます。SVMにはγとCという2つのハイパーパラメータがあるので、SklearnでざっくりGridSearchしてみます。'rbf'}SVMでは97%ぐらいの精度が出るようです(カーネルがpolyの場合は6次元まで調べてみましたが95%ぐらいでした)。BrestCancerデータセットの場合、CNNを使っても多層パーセプトロンを使っても、SVMの精度は越えるということがわかります。いくらカーネルトリックで非線形な処理しているといっても、ニューラルネットワークでは隠れ層を突っ込めば表現できる非線形さが際限なく増えますからね。(Sklearnの)SVMには決定的な欠陥があります。それはGPUが使えないということです。Colabを使えば誰しも無料でGPU訓練ができるので、GPUが使えないという欠陥はかなり大きいです。この差が気になるのなら、例えばMNISTをRBFカーネルのSVMを使ってCPUで訓練させてみてください。MNISTクラスでも物凄い時間がかかりますので。まとめBrestCancerデータセットを通じて、CNNでも構造化データに対してSVMを越える程度の精度が出ることを確かめられました。CNNが万能というわけではありませんが、多層パーセプトロンだけではなくCNNも構造化データに対する1つの選択肢として検討してみてくださいね。Commentコメントをキャンセルメールアドレスが公開されることはありません。