徒然weed

アウトプットの場

Python機械学習プログラミング第3章(3.1,3.2)

f:id:shintaro-football7:20191030160441j:plain
(↑写真かっこよくね??)
機械学習に必要なpythonの基本を学んでみようということで以下の本を参考にコツコツ勉強してみようと思います。
結構分厚い本なので途中で挫折しないようにします。まずは終わらせることが大事なので、ソースコードをいちいち全て写経するというより大事そうなところを見極めたり、苦手な部分を掘り下げてみたりして柔軟にやっていこうかなと思います。

[第2版]Python 機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

[第2版]Python 機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

第2章まではもうやったので第3章からやっていきます。
テーマは「分類器」です。様々な分類器を同じデータセットて試しそれらの特徴をプロットを通して考察するといった流れのようです。
今回のテーマはパーセプトロンです。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn .preprocessing import StandardScaler
from sklearn.linear_model import Perceptron
from sklearn.metrics import accuracy_score
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import numpy as np

iris = datasets.load_iris()
X = iris.data[:,[2,3]] #3,4列目の特徴量を抽出
y = iris.target #クラスラベルを取得

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3,random_state = 1,stratify = y)
#テストデータ:トレーニングデータを3:7
#random_stateに固定のパラメータを指定すると再現可能の結果を得られる
#stratifyはそうかサンプリングを利用。トレーニングセットとテストセットに含まれているクラスラベルの比率が入力データセットのと等しい

sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
print(X_test_std)

ppn = Perceptron(max_iter = 100,eta0=0.1,random_state = 1)
ppn.fit(X_train_std,y_train)
y_pred = ppn.predict(X_test_std)
print("misclasified samples : %d" %(y_test != y_pred).sum())
print(accuracy_score(y_test,y_pred))
#misclasified samples : 3
#0.9333333333333333

def plot_decision_regions(X,y,classifier,test_idx = None,resolution = 0.2):
    markers = ('s','x','o', '^', 'v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])

    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.3,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,0],
                    c = '',
                    marker = markers[idx],
                    label = cl,
                    edgecolor = 'black'
                    )
    if test_idx:
        # plot all samples
        X_test, y_test = X[test_idx, :], y[test_idx]

        plt.scatter(X_test[:, 0],
                    X_test[:, 1],
                    c='',
                    edgecolor='black',
                    alpha=1.0,
                    linewidth=1,
                    marker='o',
                    s=100, 
                    label='test set')

X_combined_std = np.vstack((X_train_std, X_test_std))#行方向に結合
y_combined = np.hstack((y_train, y_test))#列方向に結合

plot_decision_regions(X=X_combined_std, y=y_combined,
                      classifier=ppn, test_idx=range(105, 150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')

plt.tight_layout()
#plt.savefig('images/03_01.png', dpi=300)
plt.title('perceptron')
plt.show()

プロットしてみましょう
f:id:shintaro-football7:20191101190236p:plain

ポイント
・標準化とは平均\mu、分散\sigmaを用いてx  \longmapsto\frac{x - \mu}{\sigma}と変換すること。
・完全に線形分離可能でないとパーセプトロンアルゴリズムは収束しない(エポックごとにclassラベルと一致しないテストデータが存在して絶えず重みが更新されてしまう)

次のロジスティック関数を活性化関数に用いる分類器はclassが完全に線形分離できない場合であってもコスト関数の最小値に収束することを紹介する。


本日のおまけ
面白そうだから買ってみた。アマゾンのレビューを見たら、かなり難しいと書いてあるのでやる気MAX。

プログラマのための論理パズル 難題を突破する論理思考トレーニング

プログラマのための論理パズル 難題を突破する論理思考トレーニング