筋肉で解決しないために。

日々出会うモノに対する考察をしたり、主に以下のテーマに関して書いています。 データサイエンス/人工知能/AI/機械学習/DeepLearning/Python//数学/統計学/統計処理

SVM(Support Vector Machines)による他クラス分類の実装と可視化

はじめに

このエントリでは、機械学習のサンプルデータとしてよく用いられるIrisのデータに対して、SVM(Support Vector Machines)を実装してみます。 サンプルデータは、Iris(アヤメ)という植物のデータで、3種類のアヤメについて、それぞれ50サンプルのデータに4つの特徴量が含まれています。

おまじない

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

Irisデータセットのインポート

from sklearn import datasets

iris = datasets.load_iris()
X = iris.data
Y = iris.target

データセットの分割

from sklearn.cross_validation import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=3)  
#test_sizeを指定しないと0.25になります

モデル生成

今回は、SVCにおける4つのkernelを用いて、それぞれの精度を出して比較してみます。

from sklearn.svm import SVC

model_linear = SVC(kernel = 'linear')
model_poly = SVC(kernel = 'poly')
model_rbf = SVC(kernel = 'rbf')#kernelを指定しない時のデフォルトです
model_sigmoid = SVC(kernel = 'sigmoid')

モデルに学習させる

#それぞれのモデルを学習させます
model_linear.fit(X_train,Y_train)
model_poly.fit(X_train,Y_train)
model_rbf.fit(X_train,Y_train)
model_sigmoid.fit(X_train,Y_train)

>>>
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto', kernel='sigmoid',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)
#これはsigmoidのときの出力です

モデルの精度確認

テストデータを入れて、モデルの精度を確認します

from sklearn import metrics

predicted_linear = model_linear.predict(X_test)
expected_linear = Y_test
print(metrics.accuracy_score(expected_linear,predicted_linear))

predicted_poly = model_poly.predict(X_test)
expected_poly = Y_test
print(metrics.accuracy_score(expected_poly,predicted_poly))

predicted_rbf = model_rbf.predict(X_test)
expected_rbf = Y_test
print(metrics.accuracy_score(expected_rbf,predicted_rbf))

predicted_sigmoid = model_sigmoid.predict(X_test)
expected_sigmoid = Y_test
print(metrics.accuracy_score(expected_sigmoid,predicted_sigmoid))

>>>
0.9736842105263158
0.9473684210526315
0.9736842105263158
0.2894736842105263

今回の場合では、rbfとlinearの精度が高くでていることがわかりました。

モデルの可視化

最後に下記サイト、及び公式ドキュメントを参考に、ここまでで行ったモデルの可視化に挑戦してみます http://www.tsjshg.info/udemy/Lec82-83.html

from sklearn import svm

#図示できるのが2次元までなので、変数を2つに絞ります。
X = iris.data[:,:2]
Y = iris.target

#SVMの正則化パラメータ
C = 1.0  

#SVC with a Linear Kernel
svc = svm.SVC(kernel='linear', C=C).fit(X, Y)

#Gaussian Radial Bassis Function
rbf_svc = svm.SVC(kernel='rbf', gamma=0.7, C=C).fit(X, Y)

#SVC with 3rd degree poynomial
poly_svc = svm.SVC(kernel='poly', degree=3, C=C).fit(X, Y)

#SVC Linear
lin_svc = svm.LinearSVC(C=C).fit(X,Y)

#step size
h = 0.02

#X軸の最大最小
x_min=X[:, 0].min() - 1
x_max =X[:, 0].max() + 1

#Y軸の最大最小
y_min = X[:, 1].min() - 1
y_max = X[:, 1].max() + 1

#meshgridを作ります。
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))

titles = ['SVC with linear kernel',
          'LinearSVC (linear kernel)',
          'SVC with RBF kernel',
          'SVC with polynomial (degree 3) kernel']

for i, clf in enumerate((svc, lin_svc, rbf_svc, poly_svc)):
    
#境界線を描画します。
    plt.figure(figsize=(15,15))
    plt.subplot(2, 2, i + 1)
    plt.subplots_adjust(wspace=0.4, hspace=0.4)
    
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    
    plt.contourf(xx, yy, Z, cmap=plt.cm.terrain, alpha=0.5,linewidths=0)
    plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Dark2)
    
    plt.xlabel('Sepal length')
    plt.ylabel('Sepal width')
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    plt.xticks(())
    plt.yticks(())
    plt.title(titles[i])
plt.show()

>>>

f:id:watarumon:20180711154133p:plain

f:id:watarumon:20180711154144p:plain

f:id:watarumon:20180711154154p:plain

f:id:watarumon:20180711154204p:plain

さいごに

今回は、機械学習のサンプルデータとしてよく用いられるIrisのデータに対して、SVC(Support Vector Machines)を実装し、4種類のkernelを比較してみました。

お疲れ様でした!

それじゃー、また。