機械学習でOptunaというモジュールを使いたいのですが、pythonの基礎的なメソッドや変数の使い方がわからずOptunaを使えません。だれか教えていただけませんでしょうか。
https://qiita.com/koshian2/items/1c0f781d244a6046b83e
を参考にサンプルコードを書いています。
python
1from sklearn.datasets import load_boston 2from sklearn.svm import SVR 3from sklearn.preprocessing import StandardScaler 4from sklearn.model_selection import train_test_split 5from sklearn.metrics import mean_squared_error 6 7import optuna 8import numpy as np 9 10# 目的関数 11def objective(trial): 12 # C 13 svr_c = trial.suggest_loguniform('svr_c', 1e0, 1e2) 14 # epsilon 15 epsilon = trial.suggest_loguniform('epsilon', 1e-1, 1e1) 16 # SVR 17 svr = SVR(C=svr_c, epsilon=epsilon) 18 svr.fit(X_train, y_train) 19 # 予測 20 y_pred = svr.predict(X_val) 21 # CrossvalidationのMSEで比較(最大化がまだサポートされていない) 22 return mean_squared_error(y_val, y_pred) 23 24if __name__ == '__main__': 25 boston = load_boston() 26 X, y = boston["data"], boston["target"] 27 # 訓練、テスト分割 28 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=114514) 29 n_train = int(X_train.shape[0] * 0.75) 30 X_train, X_val = X_train[:n_train], X_train[n_train:] 31 y_train, y_val = y_train[:n_train], y_train[n_train:] 32 33 # 標準化 34 scaler = StandardScaler() 35 X_train = scaler.fit_transform(X_train) 36 X_val = scaler.transform(X_val) 37 X_test = scaler.transform(X_test) 38 39 # optuna 40 study = optuna.create_study() 41 study.optimize(objective, n_trials=100)
このようにメイン関数の中にメソッドを1つだとobjectiveの中のX_train, y_trainをグローバル変数として?読み取ってくれるようですが、
python
1from sklearn.datasets import load_boston 2from sklearn.svm import SVR 3from sklearn.preprocessing import StandardScaler 4from sklearn.model_selection import train_test_split 5from sklearn.metrics import mean_squared_error 6 7import optuna 8import numpy as np 9 10# 目的関数 11def objective(trial): 12 # C 13 svr_c = trial.suggest_loguniform('svr_c', 1e0, 1e2) 14 # epsilon 15 epsilon = trial.suggest_loguniform('epsilon', 1e-1, 1e1) 16 # SVR 17 svr = SVR(C=svr_c, epsilon=epsilon) 18 svr.fit(X_train, y_train) 19 # 予測 20 y_pred = svr.predict(X_val) 21 # CrossvalidationのMSEで比較(最大化がまだサポートされていない) 22 return mean_squared_error(y_val, y_pred) 23 24def preprocess(): 25 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=114514) 26 n_train = int(X_train.shape[0] * 0.75) 27 X_train, X_val = X_train[:n_train], X_train[n_train:] 28 y_train, y_val = y_train[:n_train], y_train[n_train:] 29 30 # 標準化 31 scaler = StandardScaler() 32 X_train = scaler.fit_transform(X_train) 33 X_val = scaler.transform(X_val) 34 X_test = scaler.transform(X_test) 35 return X_train,y_train,X_val,y_val,X_test,y_test 36 37def pipeline(X,y): 38 [X_train,y_train,X_val,y_val,X_test,y_test]=preprocess() 39 # optuna 40 study = optuna.create_study() 41 study.optimize(objective, n_trials=100) 42 return 43 44 45if __name__ == '__main__': 46 boston = load_boston() 47 X, y = boston["data"], boston["target"] 48 pipeline(X,y)
このように階層的にメソッドを使うとX_trainなどを読み取ってくれません。これはなぜでしょうか。メソッドを階層的にするとX_trainを読み取れないことよりも、1つのメソッドならX_trainを引数として指定しなくても読み取ってくれることが不思議なくらいなのですが。
サンプルコードのようなシンプルなものなら良いのですが、実際にはメソッドを多用せざるを得ない状況があると思います。その場合にメソッドの外からX_trainなどを渡すときにどのようにすればよいのでしょうか。
試しに
python
1def objective(trial,X_train):
などのようにobjectiveにX_trainを渡す形にして
python
1study.optimize(objective([],X_train), n_trials=100)
とするなど試しましたが、空のリストだとOptunaでエラーが出ますし、そもそも無理矢理な感じがあってもっと良い方法があるのではと思っております。
だれか助けていただけませんでしょうか。
回答1件
あなたの回答
tips
プレビュー