スマレジエンジニアyushiのブログ

スマレジエンジニアのブログ

【機械学習入門 #6】Perceptronの性能検証

機械学習に入門しています。

yushi-dev.hatenablog.com

今回は、前回までに実装したPerceptronの性能を確認していきます。

性能検証

Perceptronの性能を確認するために、どの値に対してPerceptronがIris-setosaかIris-versicolorのどちらとして判定するかを確かめていきます。

まず最初に、作成したグラフを見てみます。

この赤い丸と青いバツは、下記の記事で表示したのと同じものです。

yushi-dev.hatenablog.com

上記の記事と同様に、図の意味は下記の通りです。

  • x軸: がくの長さ
  • y軸: 花弁の長さ
  • 赤点: Iris-setosa
  • バツ: Iris-versicolor

x軸とy軸の範囲は、それぞれトレーニングデータの最小値-1、最大値+1です。

今回新たに表示されているのは、赤と青色の背景色です。

これは、図内の一点一点について、それがIris-setosaかIris-versicolorのどちらに判定されるかを示しています。
レーニングデータはもちろんそれに近い値についても、正しく判定されていそうなことがわかります。
十分な性能のPerceptronができていそうですね。

ソースコードは以下です。

"""
グラフ表示関数
"""

from matplotlib.colors import ListedColormap

def plot_decision_regions(X, y, classifier, resolution=0.02):
    markers = ('o', 'x')
    colors = ('red', 'blue')
    cmap = ListedColormap(colors[:len(np.unique(y))])
    
    print(cmap)
    
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    
    xx1, xx2 = np.meshgrid(
        np.arange(x1_min, x1_max, resolution),
        np.arange(x2_min, x2_max, resolution)
    )
    Z = classifier.predict(
        np.array([
            xx1.ravel(),
            xx2.ravel(),
        ]).T
    )
    
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
    
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())
    
    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(
            x=X[y == cl, 0],
            y=X[y == cl, 1],
            alpha=0.8,c=cmap(idx),
            marker=markers[idx],
            label=cl
        )
"""
処理結果のグラフ表示
赤背景のデータだとsetosa、青背景のデータだとversicolorとして分類される
"""

plot_decision_regions(X, y, classifier=ppn)
plt.xlabel('sepal length [cm]')
plt.ylabel('petap length [cm]')

plt.legend(loc='upper left')

plt.show()

ソースコード

これまでのソースコードです。

https://github.com/nek0meshi/data-science-learn/blob/master/PerceptronLearn.ipynb

まとめ

数回に渡り、Perceptronの実装や解説をしてみました。

短いコードで機械学習が実現できてしまうのは驚きでしたし、面白かったです。