見出し画像

【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)

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