【Python】 SVM -実践編-
必要なライブラリのインポート
import numpy as np
import pandas as pd
# SVM
from sklearn.svm import SVC
# 訓練データとテストデータの分割
from sklearn.model_selection import train_test_split
# 標準化
from sklearn.preprocessing import StandardScaler
# アキュラシー
from sklearn.metrics import accuracy_score
# 混同行列
from sklearn.metrics import confusion_matrix
# 交差検証
from sklearn.model_selection import cross_val_score
# グリッドサーチ
from sklearn.model_selection import GridSearchCV
学習とテストデータに対するアキュラシー
# データの格納
data = pd.read_csv('DataSet.csv')
x_data = data.iloc[:,1:14401]
y_data = data.iloc[:,14401]
# トレーニングデータとテストデータに分割 random_state=Noneでランダム
X_train, X_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.3, random_state=None)
# データの標準化処理
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
# 線形SVMのインスタンスを生成
model = SVC(kernel = 'rbf' , C = 4 , gamma = 0.00016 , random_state = None)
# fit関数でモデルの学習
model.fit(X_train_std, y_train)
# テストデータに対する精度
pred_test = model.predict(X_test_std)
accuracy_test = accuracy_score(y_test, pred_test)
print('テストデータに対する正解率: %.2f' % accuracy_test)
# 混同行列
confusion_matrix(y_test, pred_test)
グリッドサーチ
# グリッドサーチするパラメータを指定
tuned_parameters = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [4 , 5, 6 , 7 , 8], 'kernel': ['rbf'], 'gamma': [0.00012 , 0.00014, 0.00016]}
{'C': [1, 10, 100, 1000], 'kernel': ['poly'], 'degree': [2, 3, 4], 'gamma': [0.01, 0.001, 0.0001]},
{'C': [1, 10, 100, 1000], 'kernel': ['sigmoid'], 'gamma': [0.01, 0.001, 0.0001]}
]
score = 'f1'
clf = GridSearchCV(
SVC(), # 識別器
tuned_parameters, # 最適化したいパラメータセット
cv=3, # 交差検定の回数
scoring='%s_weighted' % score ) # モデルの評価関数の指定
clf.fit(x_data_std, y_data)
clf.best_params_
交差検証
# データの標準化処理
sc = StandardScaler()
sc.fit(x_data)
x_data_std = sc.transform(x_data)
# 交差検証(デフォルトで cv=3)
scores = cross_val_score(model, x_data_std, y_data)
# 各分割におけるスコア
print('Cross-Validation scores: {}'.format(scores))
# 平均スコア
print('Average score: {}'.format(np.mean(scores)))
テストデータの偏りを避ける方法
train_test_splitを用いる場合
パラメータにstratify = y_data(目的変数)を追加することで、各目的変数につきtest_sizeで指定した割合もしくは個数のテストデータを取得できる。
X_train, X_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.1, random_state=None , stratify=y_data)
cross_val_scoreを用いる場合
パラメータにcv=StratifiedKFold(n_splits=10)を追加することで、目的変数の偏りを作らずにn_splitsで指定した数にデータを分割することができる。
from sklearn.model_selection import KFold
from sklearn.model_selection import StratifiedKFold
stratifiedkfold = StratifiedKFold(n_splits=10)
scores = cross_val_score(model, x_data_std, y_data , cv=stratifiedkfold)