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() >>>
さいごに
今回は、機械学習のサンプルデータとしてよく用いられるIrisのデータに対して、SVC(Support Vector Machines)を実装し、4種類のkernelを比較してみました。
お疲れ様でした!
それじゃー、また。