【AIプログラミング】多層パーセプトロンで分類、分類の境界線可視化

AIプログラミング

思い切って多層パーセプトロンを勉強始めたんだけれど、なんだかとても難しく感じています。

まずはscikit-learnとかで分類とパラメータ調整がちょうどよさそうだね。

前回のパーセプトロンに引き続き、多層パーセプトロンを勉強し始めました。今までの機械学習の勉強で、何となく言っていることのイメージはふんわりつかめるのですが、内部的な動作のパラメータなどとなると、結構難しく、現段階ではすべてを理解しつくす、ということがとても難しいような感覚です。まずは、概念的な部分を理解しつつ、パラメータをいじりながらいろいろと理解が進めばよいかなと思っています。今回は公式ドキュメントを雰囲気で読み解くような内容となりました・・・

前回のパーセプトロンについてはこちらの記事もご参考ください。

こんな人の役に立つかも

・機械学習プログラミングを勉強している人

・多層パーセプトロンについてザックリ知りたい人

・scikit-learnの多層パーセプトロンのドキュメントを読みたい人の補助として

スポンサーリンク

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

scikit-learnで実装されているニューラルネットワークに、多層パーセプトロンがあります。英語表記でMLP(Multi-layer Perceptron)と表記します。ディープラーニングの基礎的なアルゴリズムになっています。

また、scikit-learnのMLPは、分類用の「MLPClassifier」と回帰用の「MLPRegressor」があり、分類と回帰の両方で多層パーセプトロンを実行できるようになっています。

多層パーセプトロンを使うメリット

・非線形の分類ができること

単純なパーセプトロンのように直線や平面だけではなく、曲線や曲面での分類や回帰ができます。

・オンライン学習ができること

データをリアルタイムで学習することができるらしいです。新しく入ってきたデータも含めて考えることができるということですね。

多層パーセプトロンのデメリット

・局所最適解に陥る場合があること

訓練の過程で試行錯誤を行って一番良い「境界線」や「予測線」を見つけていく過程で、今の試行錯誤の回数の中で一番良いスコアのものを選びますよ、というような状態です。もっと試行錯誤すればよいスコアの「境界線」や「予測線」があるかもしれません。

・パラメータが多いこと

調整すべきパラメータが多いので、調整が難しいです。パラメータの理解も大変ですね。

・データのスケーリングに敏感なこと
多層パーセプトロンは、データのスケーリングに敏感とのことです。StandardScalerやMinMaxScalerでデータを整えて利用すると良いらしいです。

scikit-learn公式ドキュメント「1.17.8 Tips on Practical Use」も参考にすると良いです。

また、データのスケーリングについては、こちらの記事もご参考ください。

・データによっては訓練に時間がかかること

いろいろな多層パーセプトロンの記事や本を見ていると、サポートベクターマシンなどのアルゴリズムと比較して、訓練に時間がかかるようです。また、時間をかけて訓練するほど良い正解率となるパラメータに行き着くかもしれないことのことです。

一気に小難しくなった・・・、やっぱりちょっと今までのアルゴリズムとは違います・・・

多層パーセプロトン(MLP)を試してみる

とりあえず、前回のパーセプトロンと同じようにmake_blobsで作成したデータを2クラス問題してみて、境界線を可視化してみたいと思います。

まずは、前回と同様に、2クラス、2特徴量のデータを準備します。

from sklearn.datasets import make_blobs

X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=3)

plt.scatter(X[:, 0], X[:, 1], c=y)
2クラスのデータ

境界線の可視化関数を準備します。

境界線の可視化についてはこちらの記事もご参考ください。

#3つの関数を作成
def make_meshgrid(x, y, h=.02):
    x_min, x_max = x.min() - 1, x.max() + 1
    y_min, y_max = y.min() - 1, y.max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    return xx, yy

def plot_contours(ax, clf, xx, yy, **params):
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    out = ax.contourf(xx, yy, Z, **params)
    return out

#ここはオリジナルの関数です。
def graf_setting(ax):
    ax.set_xticks(())
    ax.set_yticks(())

パラメータはデフォルトの状態で多層パーセプトロンを訓練させます。

from sklearn.neural_network import MLPClassifier

clf = MLPClassifier().fit(X,y)

matplotlibで訓練した境界線を可視化します。

#空のグラフを作成
fig = plt.figure(figsize=(9, 4))
ax = fig.add_subplot(121)

#グリッドのデータを作成
X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0, X1)

#グラフに境界線とデータをプロット
plot_contours(ax, clf, xx, yy, cmap=plt.cm.coolwarm, alpha=0.8)
ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors='k')
graf_setting(ax)

パーセプトロンとは違い、曲がった非線形な境界線になったね

※この境界線は、実行毎に違う境界線となります。

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