🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1045閲覧

【python(初心者)】メソッドを定義した時の変数の扱い方がわかりません。

chain

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/10/18 02:12

機械学習で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でエラーが出ますし、そもそも無理矢理な感じがあってもっと良い方法があるのではと思っております。
だれか助けていただけませんでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/10/18 03:28

もう少し基本的な文法を理解されてから、次のステップに進んだ方がよろしいかと感じます。結局この問題が教えてもらった結果クリアできたとして、また別の問題が出た際に結局はご自身で解決できないまま誰かに頼らざるを得ない状況になるのではないでしょうか。 別にOptunaを利用せずとも、 def xxx(): return 1,2,3 [x,y,z] = xxx() とやってみてどうなるか確認し、コードを修正してみてはいかがでしょうか。
chain

2019/10/18 03:44

疑問をそのまま記述したような質問になってしまい申し訳ありません。Optunaを使う必要はないのはごもっともでいろいろ試しているのですが、参考にしたURLがあった方が具体的でよいかと思いこのような記載にしてしまいました。 基本的な文法の理解を言われるのもごもっともで恐縮ですが、ではこれだけでも教えていただければありがたいのですが、 study.optimize(objective, n_trials=100) このobjectiveは何という用法なのでしょうか。もともとobjectiveは関数として定義されているのでobjective()とするのではないかと思ってしまうのですが、objectiveは(trial)として定義されたにも関わらずobjectiveとして引数に入ってしまうのがわかりません。 study.optimize(objective([],X_train), n_trials=100) こういう使い方は全然的外れなんだろうとは思うのですが、どう勉強してよいのかわからないのです。その用法の名前など教えていただければ自習可能と思いますので、可能でしたらヒントをいただけませんでしょうか。
chain

2019/10/18 04:02

了解しました。ありがとうございます。
meg_

2019/10/18 10:51

関数を引数としているのではないですか?(optimizeの中身は知りませんので中でどう使っているかはわかりません)
chain

2019/10/18 11:12

関数objectiveを引数としているのですが、objectiveの引数にX_traialなどを指定することとうまくいかず苦戦していました。objectiveにtrial以外の変数を指定する方法がとれるのかどうかは調べても結局わかりませんでしたが、pipeline()の中にobjective()を定義することでX_trialを受け取るという別の方法で解決しました。ありがとうございました。
guest

回答1

0

自己解決

objectiveにtrial以外の変数を指定する方法がとれるのかどうかは調べても結局わかりませんでしたが、pipeline()の中にobjective()を定義することでX_trialを受け取るという別の方法で解決しました。ありがとうございました。

投稿2019/10/18 11:12

chain

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問