3
4

More than 3 years have passed since last update.

Optunaを使ったSVMの設定方法

Last updated at Posted at 2020-07-05

Optunaを使ったSVR(サポートベクター回帰)の設定方法

SVMの回帰SVRについて設定してみる。
設定はメインの、gamma,C,epsilonを設定した。kernelも設定を忘れないようにコメントとして、置いておいた。kernel込みの計算も可能だが、poly多項式が入るととたんに計算が遅くなったので、とりあえずrbf(放射基底関数)のみで、計算しておいた方が良いと思います。

パラメータの設定

def objective(trial):
    #kernel = trial.suggest_categorical('kernel', ['linear','rbf','poly','sigmoid','precomputed'])
    gamma = trial.suggest_loguniform('gamma',1e-5,1e5)
    C = trial.suggest_loguniform('C',1e-5,1e5)
    epsilon = trial.suggest_loguniform('epsilon',1e-5,1e5)

    #カーネルを選択した場合は、上を使う
    #regr = SVR(kernel = kernel, gamma = gamma, C = C ,epsilon = epsilon)
    regr = SVR(kernel = 'rbf', gamma = gamma, C = C ,epsilon = epsilon)
    score = cross_val_score(regr, X_train_std, y_train, cv=3, scoring="r2")

    r2_mean = score.mean()
    print(r2_mean)

    return r2_mean

Optunaでの学習

# optunaのstudy
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)

# チューニングしたハイパーパラメーターをフィット

optimised_regr = SVR(kernel = 'rbf' , gamma = study.best_params['gamma'],
                   C = study.best_params['C'],epsilon = study.best_params['epsilon'])
'''
#kernelを選択した場合は、こちらを使う
optimised_regr = SVR(kernel = study.best_params['kernel'] , gamma = study.best_params['gamma'],
                   C = study.best_params['C'],epsilon = study.best_params['epsilon'])
'''
optimised_regr.fit(X_train_std ,y_train)

結果はこんな感じで良い感じでfitできました。

svm_Figure_1.png

プログラムの全文です

# -*- coding: utf-8 -*-


from sklearn import datasets
from sklearn.svm import SVR
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
import pandas as pd
import optuna
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler


boston = datasets.load_boston()

print(boston['feature_names'])

X = boston['data']
y = boston['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8)

scaler=StandardScaler()
scaler.fit(X_train)
X_train_std=scaler.transform(X_train)
X_test_std=scaler.transform(X_test)

# 目的関数
def objective(trial):
    #kernel = trial.suggest_categorical('kernel', ['linear','rbf','poly','sigmoid','precomputed'])
    gamma = trial.suggest_loguniform('gamma',1e-5,1e5)
    C = trial.suggest_loguniform('C',1e-5,1e5)
    epsilon = trial.suggest_loguniform('epsilon',1e-5,1e5)

    #regr = SVR(kernel = kernel, gamma = gamma, C = C ,epsilon = epsilon)

    regr = SVR(kernel = 'rbf', gamma = gamma, C = C ,epsilon = epsilon)

    score = cross_val_score(regr, X_train_std, y_train, cv=3, scoring="r2")


    r2_mean = score.mean()
    print(r2_mean)

    return r2_mean

'''
 kernel='rbf',
 degree=3, gamma='scale', coef0=0.0, tol=0.001, C=1.0, epsilon=0.1, shrinking=True, cache_size=200, verbose=False, max_iter=-1



'''


# optuna
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)

# チューニングしたハイパーパラメーターをフィット

optimised_regr = SVR(kernel = 'rbf' , gamma = study.best_params['gamma'],
                   C = study.best_params['C'],epsilon = study.best_params['epsilon'])
'''
optimised_regr = SVR(kernel = study.best_params['kernel'] , gamma = study.best_params['gamma'],
                   C = study.best_params['C'],epsilon = study.best_params['epsilon'])
'''
optimised_regr.fit(X_train_std ,y_train)


#結果の表示
print("訓練データにフィット")
print("訓練データの精度 =", optimised_regr.score(X_train_std, y_train))
pre_train = optimised_regr.predict(X_train_std)
print("テストデータにフィット")
print("テストデータの精度 =", optimised_regr.score(X_test_std, y_test))
pre_test = optimised_regr.predict(X_test_std)

#グラフの表示

plt.scatter(y_train, pre_train, marker='o', cmap = "Blue", label="train")
plt.scatter(y_test ,pre_test, marker='o', cmap= "Red", label="test")
plt.title('boston')
plt.xlabel('measurment')
plt.ylabel('predict')
#ここでテキストは微調整する
x = 30  
y1 = 12
y2 = 10
s1 =  "train_r2 =" + str(optimised_regr.score(X_train_std, y_train))
s2 =  "test_r2 =" + str(optimised_regr.score(X_test_std, y_test))
plt.text(x, y1, s1)
plt.text(x, y2, s2)

plt.legend(loc="upper left", fontsize=14)
plt.show()




3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4