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

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/30 09:35
2022/05/30 10:24