一般社団法人 全国個人事業主支援協会

COLUMN コラム

pythonの機械学習用のライブラリの一つ、optunaでSVMのHPチューニングを行う。

optunaの恩恵を受けられるのはXGBoostやLightGBM、DeepLeaningなどのHP調整に時間のかかるアルゴリズムが中心だが、データセットが大きくなるとSVMもかかる時間が膨大になる。

(そもそも大きなデータセットでSVM使うなというのもあるけど。)

 

ライブラリのインポート

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV, cross_validate
from sklearn.model_selection import KFold
from sklearn.datasets import make_regression, make_classification
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
from sklearn.svm import SVR, SVC
import optuna

 

データ作成

X, y, coef = make_regression(n_samples=4000, n_features=25, n_informative=10, bias=1.0, noise=50, coef=True, random_state=1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=1)
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

 

目的関数の作成

# 目的関数
def objective(trial):
params = {
'C': trial.suggest_loguniform('C', 1e-5, 1),
'gamma': trial.suggest_loguniform('gamma', 1e-5, 1 ),
'kernel': trial.suggest_categorical('kernel', ['linear', 'rbf', 'sigmoid'])
}
# training
model = SVR(**params)
model.fit(X_train_std, y_train)
# predict
preds = model.predict(X_test_std)
# rmseを返す
return np.sqrt(mean_squared_error(y_act, y_pred))

学習

study = optuna.create_study(sampler=optuna.samplers.TPESampler(seed=0))
study.optimize(objective, n_trials=50,)

 

結果出力

print('best_trial: ', study.best_trial)
print('best_value: {:.3f}'.format(study.best_value))
print('best_params: ', study.best_params)

 

実際の現場ではクロスバリデーション必須。
sklearnのアルゴリズムは大体この形で実行可能。
(だけどHPチューニングに頼るのは精度を最後の数%上げるところなので、
学習に時間をかける割には精度の上昇があまり見込めないことが多い・・・)

 

The following two tabs change content below.

東 健太朗

最新記事 by 東 健太朗 (全て見る)

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア