質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
XGBoost

XGBoostは、アンサンブル学習と決定木を組み合わせた手法です。弱学習器の構築時に、以前構築された弱学習器の結果を用いて弱学習器を構築。高度な汎化能力を持ち、勾配ブースティングとも呼ばれています。

Python 3.x

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

Q&A

解決済

2回答

969閲覧

XGBoostの分類での「name 'gamma' is not defined」エラー対処方法

kouji_39

総合スコア164

XGBoost

XGBoostは、アンサンブル学習と決定木を組み合わせた手法です。弱学習器の構築時に、以前構築された弱学習器の結果を用いて弱学習器を構築。高度な汎化能力を持ち、勾配ブースティングとも呼ばれています。

Python 3.x

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

0グッド

0クリップ

投稿2022/05/30 08:10

1.前提・実現したいこと
KaggleチュートリアルTitanicについて、OptunadeXGBoost分類をしています。
なお、titanic号の乗客のデータセットはKaggleからダウンロードしました。
参考ブログ(下記※)は以下です。
https://qiita.com/kuroneko-hornet/items/9e3e8ffba75c1dbf11c6「XGBoostをoptunaでチューニングしてtitanicを解く」
上記のコードを、利用させてもらいましたが、エラーが発生します。対処方法をお願いします。

2.発生している問題・エラーメッセージ
3.のソースコード実行で下記のエラーメッセージが発生

NameError: name 'gamma' is not defined

NameError Traceback (most recent call last)
<ipython-input-41-263240bbee7e> in <module>()
----> 1 main()

6 frames
<ipython-input-39-60f9057c5dc4> in objective(df, df_test, y, trial)
5 round_num = trial.suggest_int('round_num',1,30)
6
----> 7 bst = train(df,max_depth,learning_rate,round_num,gamma,min_childe_weigh,subsample,colsample_bytree,alpha,lamb)
8 answer = predict(bst,df_test).round().astype(int)
9 score = accuracy_score(answer.round(),y)

NameError: name 'gamma' is not defined

3.該当のソースコード

python3

1import pandas as pd 2import xgboost as xgb 3# optuna 4! pip install optuna 5import optuna 6from functools import partial 7from sklearn.model_selection import train_test_split 8from sklearn.metrics import accuracy_score 9 10def train(df,max_depth,learning_rate,num_round): 11 train_x = df.drop('Survived',axis=1) 12 train_y = df.Survived 13 dtrain = xgb.DMatrix(train_x,label=train_y) 14 param = { 'max_depth':max_depth,'learning_rate':learning_rate,'objective':'reg:logistic' } 15 bst = xgb.train(param,dtrain,num_round) 16 return bst 17 18def preprocess(df): 19 df['Fare'] = df ['Fare'].fillna(df['Fare'].mean()) 20 df['Age'] = df['Age'].fillna(df['Age'].mean()) 21 df['Embarked'] = df['Embarked'].fillna('Unknown') 22 df['Sex'] = df['Sex'].apply(lambda x: 1 if x == 'male' else 0) 23 df['Embarked'] = df['Embarked'].map( {'S':0,'C':1,'Q':2,'Unknown':3} ).astype(int) 24 df = df.drop(['Cabin','Name','PassengerId','Ticket'],axis=1) 25 return df 26 27def predict(bst,df): 28 return bst.predict(xgb.DMatrix(df)) 29 30def objective(df, df_test, y,trial): 31#目的関数 32 max_depth = trial.suggest_int('max_depth',1,30) 33 learning_rate = trial.suggest_uniform('learning_rate',0.0,1) 34 round_num = trial.suggest_int('round_num',1,30) 35 36 bst = train(df,max_depth,learning_rate,round_num,gamma,min_childe_weigh,subsample,colsample_bytree,alpha,lamb) 37 answer = predict(bst,df_test).round().astype(int) 38 score = accuracy_score(answer.round(),y) 39 return 1.0 - score 40 41def main(): 42 df_original = pd.read_csv("(自分のPCのパス/Titanic/train.csv") 43 df_test = preprocess(df_original.tail(100)) 44 df_train = preprocess(df_original.head(791)) 45 y = df_test['Survived'] 46 df_test = df_test.drop('Survived',axis=1) 47 48 #optunaの前処理 49 obj_f = partial(objective, df_train, df_test, y) 50 #セッション作成 51 study = optuna.create_study() 52 #回数 53 study.optimize(obj_f, n_trials=100) 54 55 max_depth = study.best_params['max_depth'] 56 learning_rate = study.best_params['learning_rate'] 57 round_num = study.best_params['round_num'] 58 59 bst = train(df_train,max_depth,learning_rate,round_num) 60 print('\nparams :',study.best_params) 61 answer = predict(bst,df_train.drop('Survived',axis=1)).round().astype(int) 62 print('train score :',accuracy_score(answer.round(),df_train['Survived'])) 63 answer = predict(bst,df_test).round().astype(int) 64 xgb.plot_importance(bst) 65 print('test score :',accuracy_score(answer.round(),y)) 66 67#実行 68main()

4.自分で調べたことや試したこと
name 'gamma' is not definedを調べたが有用な情報は無し。
gammaは、「gamma(float)–ツリーのリーフノードにさらにパーティションを作成するために必要な最小の損失削減。」とのこと。

5.使っているツールのバージョンなど補足情報
開発環境:Google Colaboratory
プログラム言語:python3
OS:windows10 Home
CPU:Intel(R) Core(TM) i7-7500U CPU@2.70GHz 2.90GHz

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

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

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

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

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

guest

回答2

0

ベストアンサー

方針3(optunaで沢山パラメータチューニング)

bjectice()とmain()については、パラメータ増やすだけなので、コードは省略。

と記載があるので、alpha, gamma などについては、max_depth, learning_rate などと同様のコードを自身で追加する必要があります。

投稿2022/05/30 08:27

can110

総合スコア38266

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

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

kouji_39

2022/05/30 09:35

1.以下のように、順に自身で記載させて、エラーは解消しました。 2.しかし、新たに、「train() takes 4 positional arguments but 10 were given」が出ました。 つまり、関数が要求している引数の数と、実際に渡した引数の数が異なるようです。再度、ご教授 いただけたらと思います。 #目的関数 max_depth = trial.suggest_int('max_depth',1,30) learning_rate = trial.suggest_uniform('learning_rate',0.0,1) round_num = trial.suggest_int('round_num',1,30) gamma = trial.suggest_int('gamma',0.0,1.0) min_childe_weigh = trial.suggest_int('min_childe_weigh',0.0,1.0) subsample = 1 colsample_bytree = trial.suggest_int('colsample_bytree',0.0,1.0) alpha = trial.suggest_int('alpha',0.0,1.0) lamb = 1 bst = train(df,max_depth,learning_rate,round_num,gamma,min_childe_weigh,subsample,colsample_bytree,alpha,lamb)
can110

2022/05/30 10:24

当然train関数も修正する必要があります。
guest

0

google翻訳
NameError:名前'gamma'が定義されていません

とおっしゃってますよ
そのとおり、どこにも定義されてませんし

投稿2022/05/30 08:22

y_waiwai

総合スコア87774

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

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

kouji_39

2022/05/30 09:30

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問