IrisデータについてSVMで分類をしてみた。さて、今回はSVMモデルのパラメータをいじってみてより精度が高いモデルを作ってみる。
すべての学習モデルはハイパーパラメータと呼ばれる学習モデルに影響を与えるパラメータがある。このパラメータを適切に選ぶことで精度に大きな影響が出る。SVMが使いやすい理由の一つとしてはこのパラメータが少ないからである。あまりにハイパーパラメータが多い場合には、どのパラメータをいじればよいかわからずに、時間ばかりかかってしまう。
ハイパーパラメータをチューニングするステップは以下のようになる。
- モデルの選択
- 主なハイパーパラメータの理解
- チューニングするハイパーパラメータの選択
- チューニング
- 検証
ここでは以下について取り扱う。
- ハイパーパラメータの選択
- グリッドサーチ
- 検証
ハイパーパラメータの選択
モデルが決定したら、まずそのモデルで利用できるハイパーパラメータを明らかにする。
今回モデルはLinearSVCを使う。
上記のドキュメントからsklearn.svm.SVCで使えるハイパーパラメータの一覧がわかる。
また下記から主なパラメータとしてCとgammaがあることがわかる。
よって今回はCとgammaについてチューニングをしてみる。
Cは正則化パラメータである。Cが小さいと誤分類を許容する、大きいと誤分類を許容しなくなる。これについては0.1~1000について10のオーダーで検証する。
gammaは決定境界の複雑さの度合いを決める。gammaが大きければ境界は複雑となる。0.0001~1について10のオーダーで検証する。
kernelについてはrbf(Radial Basis function Kernel)とする。
グリッドサーチ
まず学習データと検証データを用意する。
import seaborn as sns iris = sns.load_dataset('iris') X_iris = iris.drop('species', axis=1) y_iris = iris['species'] from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X_iris, y_iris,random_state=1)
Gridsearchを実装する。
from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV param_grid = {'C': [0.1, 1, 10, 100, 1000], 'gamma': [1, 0.1, 0.01, 0.001, 0.0001], 'kernel': ['rbf']} grid = GridSearchCV(SVC(), param_grid, refit = True, verbose = 3) grid.fit(X_train, y_train)
まずはGridSearchCV用のパラメータを生成する。
param_grid = {‘C’: [0.1, 1, 10, 100, 1000], ‘gamma’: [1, 0.1, 0.01, 0.001, 0.0001], ‘kernel’: [‘rbf’]}
GridSearchを実行する。
grid = GridSearchCV(SVC(), param_grid, refit = True, verbose = 3)
grid.fit(X_train, y_train)#
Fitting 3 folds for each of 25 candidates, totalling 75 fits [CV] C=0.1, gamma=1, kernel=rbf ...................................... [CV] C=0.1, gamma=1, kernel=rbf, score=0.9743589743589743, total= 0.0s [CV] C=0.1, gamma=1, kernel=rbf ...................................... [CV] C=0.1, gamma=1, kernel=rbf, score=0.9459459459459459, total= 0.0s
検証
GridSearchの検証方法としてはまず最も評価が高かったパラメータを明らかにする。
これはbest_params_から取得できる。
print(grid.best_params_) # {'C': 1, 'gamma': 0.1, 'kernel': 'rbf'}
次にそのスコアを明らかにする。
print(grid.best_score_) # 0.9732142857142857
最も成績が良かった学習器はbest_estimator_で取得できる。
best = grid.best_estimator_ print(best) # SVC(C=1, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape='ovr', degree=3, gamma=0.1, kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False)