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チューニングに頼るのは精度を最後の数%上げるところなので、
学習に時間をかける割には精度の上昇があまり見込めないことが多い・・・)