サポートベクターマシン【SupportVectorMachine】

〇教師あり学習を用いるパターン認識モデルの1つ

 -分類や回帰のためのアルゴリズム
 -SVMと頻繁に呼ばれる
 -クラスを明確に分ける境界線を引くための手法
 -マージン最大化と呼ばれる方法で境界線を推定

〇4つの工程

#1ライブラリのインポート

from sklearn.svm import SVM

#2インスタンス作成

clf = LinerSVC( )

#3モデル学習

clf.fit(X,y)

#4作成したモデルでの予測

clf.predict(X')



〇サポートベクターマシーンの使用方法

【scikit-learnに実装されているSVM】
・分類問題に使用する SVM (Support Vector Classification)
  ・SVC (C-Support Vector Classification)
      ・標準的なソフトマージン(エラーを許容する)SVM
  ・LinearSVC (Linear Support Vector Classification)
      ・カーネルが線形カーネルの場合に特化したSVM
  ・NuSVC (Nu-Support Vector Classification)
      ・エラーを許容する表現が異なるSVM
・回帰問題に使用する SVM (Support Vector Regression)参考
  ・SVR
  ・LinearSVR
  ・NuSVR
・異常検知に使用する SVM
  ・OneClassSVM


【SVC()の引数】
・引数C:正則化のパラメータ
・引数kernel:アルゴリズムで使用するカーネルタイプ('linear'、 'poly'、 'rbf'、 'sigmoid'、 'precomputed')
・引数degree: 多項式カーネル関数の次数(kernel='poly'の時のみ有効)
・引数gamma: カーネルがrbf、poly、sigmoidの時のカーネル係数。
・引数random_state: 乱数
・引数verbose: モデル構築の過程のメッセージを出すかどうか(デフォルトは0)


In [1]: # ライブラリのインポート
       import pandas as pd
       from sklearn.datasets import load_breast_cancer
       from sklearn.svm import SVC
       from sklearn.model_selection import train_test_split
       from sklearn.metrics import accuracy_score

       # データのロード
       breast = load_breast_cancer()
       df_breast = pd.DataFrame(data=breast.data,columns=breast.feature_names)
       df_breast['target'] = breast.target

       # インスタンス作成
       clf = SVC(random_state=0)

       # 説明変数
       X = df_breast[breast.feature_names].values

       # 目的変数target
       Y = df_breast['target'].values

       # データの分割
       X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2,random_state=0)

       # 予測モデルを作成
       clf.fit(X_train, y_train)

       # 精度
       print(accuracy_score(y_test,clf.predict(X_test)))

Out[1]: 0.9298245614035088



〇サポートベクターマシンを使った分類【GridSearchCV】

・パラメーターチューニングを含めたモデル学習

【パラメータチューニングとは】
 →モデル学習で様々なパラメータを行い、精度が高くなるパラメータを探索すること。
→『sklearn.model_selection.GridSearchCV』を用いる

<手順①>パラメータの形式指定

 チューニングしたいパラメータと探索したいパラメータの範囲を辞書形式で指定。

params = {
   "C":np.arange(0.1,1,0.05),
   "kernel":["rbf"],
   "gamma":np.arange(0.1,1,0.5)
}
・ライブラリnumpyの関数np.arange()を使用して範囲指定
・上記のパラメータだと
           ・パラメータC:0.1から1.0までの間を0.05刻み。
   ・パラメータkernel:rbf
   ・パラメータgamma:0.1から1.0までの間を0.5刻みで探索。
・刻みの数を細かくすると探索する時間が長くなり、逆に刻みを荒くすると探索する時間は短くなる。


<手順②>sklearn.model_selection.GridSearchCVを使用。

In [1]: clf = GridSearchCV(clf, params,scoring="accuracy", cv=3)

       # パラメータチューニング
       clf.fit(X_train, y_train)

Out[1]: GridSearchCV(cv=3, error_score=nan,
            estimator=SVC(C=1.0, break_ties=False, cache_size=200,
                          class_weight=None, coef0=0.0,
                          decision_function_shape='ovr', degree=3,
                          gamma='scale', kernel='rbf', max_iter=-1,
                          probability=False, random_state=0, shrinking=True,
                          tol=0.001, verbose=False),
            iid='deprecated', n_jobs=None,
            param_grid={'C': array([0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 , 0.45, 0.5 , 0.55, 0.6 ,
      0.65, 0.7 , 0.75, 0.8 , 0.85, 0.9 , 0.95]),
                        'gamma': array([0.1, 0.6]), 'kernel': ['rbf']},
            pre_dispatch='2*n_jobs', refit=True, return_train_score=False,
            scoring='accuracy', verbose=0)

最も最適なパラメータはbest_params_にて確認することができます。

In [2]: print(clf.best_params_)

Out[2]: {'C': 0.1, 'gamma': 0.1, 'kernel': 'rbf'}










この記事が気に入ったらサポートをしてみませんか?