実現したいこと、質問内容
OptunaでGPR(gaussian process regression)のkernelの最適な組み合わせ、
ハイパーパラメータの最適化を実施しています。
・実現したいこと
以下①②をOptunaで探索したいと考えています。
①kernelは3種の組み合わせでどれがよいか。
ConstantKernel() * RBF() + WhiteKernel(), ConstantKernel() * Matern() + WhiteKernel(), ConstantKernel() * Matern() + WhiteKernel() + DotProduct()
②選択されたkernelの組み合わせのパラメータ調整
例えば、選択されたkernelの組み合わせが
ConstantKernel() * Matern() + WhiteKernel()
だった場合Matern()
のパラメータであるnu
を0.5~2.5の範囲で0.1刻みで探索
・質問内容
②については、nu = trial.suggest_discrete_uniform('nu', 0.5, 2.5, 0.1)
のように探索できるとは思うのですが、
trial.suggest_categorical('kernel', kernelのリスト)
で探索しようとすると、
kernelが選択された段階でdefaultのパラメータが設定され、②が実行できません。
①および②の実装方法についてご教授ください。
発生している問題・エラーメッセージ
エラーではないですがwarning
UserWarning: Choices for a categorical distribution should be a tuple of None, bool, int, float and str for persistent storage but contains 1**2 * RBF(length_scale=1) + WhiteKernel(noise_level=1) which is of type Sum. warnings.warn(message) [W 2020-05-20 14:03:22,122] Choices for a categorical distribution should be a tuple of None, bool, int, float and str for persistent storage but contains 1**2 * RBF(length_scale=1) + WhiteKernel(noise_level=1) which is of type Sum.
該当のソースコード
from sklearn.datasets import load_boston from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import DotProduct, WhiteKernel, ConstantKernel, RBF, Matern, RationalQuadratic from sklearn.metrics import mean_absolute_error import optuna def objective(trial): boston = load_boston() X_array = boston.data y_array = boston.target X_train, X_test, y_train, y_test = train_test_split(X_array, y_array, test_size=0.2, random_state=0) scaler = StandardScaler() X_train_scaler = scaler.fit_transform(X_train) X_test_scaler = scaler.transform(X_test) kernels = [ConstantKernel() * RBF() + WhiteKernel(), ConstantKernel() * Matern() + WhiteKernel(), ConstantKernel() * Matern() + WhiteKernel() + DotProduct()] kernel = trial.suggest_categorical('kernel', kernels) gpr = GaussianProcessRegressor(kernel=kernel).fit(X_train_scaler, y_train) y_pred = gpr.predict(X_test_scaler) mae = mean_absolute_error(y_test, y_pred) return mae study = optuna.create_study(direction='minimize') study.optimize(objective, n_trials=10)
補足情報(FW/ツールのバージョンなど)
python3.7
あなたの回答
tips
プレビュー