1.前提・実現したいこと
KaggleチュートリアルTitanicについて、OptunadeXGBoost分類をしています。
なお、titanic号の乗客のデータセットはKaggleからダウンロードしました。
参考ブログ(下記※)は以下です。
※https://qiita.com/kuroneko-hornet/items/9e3e8ffba75c1dbf11c6「XGBoostをoptunaでチューニングしてtitanicを解く」
上記のコードを、利用させてもらいましたが、テストデータ予測でエラーが発生します。対処方法をお願いします。
2.発生している問題・エラーメッセージ
3.のソースコード実行で下記のエラーメッセージが発生
ValueError Traceback (most recent call last)
<ipython-input-178-569fcac6bfa9> in <module>()
6 # ----- Submit dataの作成 -------
7 PassengerId=test_data['PassengerId']
----> 8 predictions = predict(bst,test_x)
9
10
2 frames
/usr/local/lib/python3.7/dist-packages/xgboost/core.py in _init_from_npy2d(self, mat, missing, nthread)
476 # we try to avoid data copies if possible (reshape returns a view when possible
477 # and we explicitly tell np.array to try and avoid copying)
--> 478 data = np.array(mat.reshape(mat.size), copy=False, dtype=np.float32)
479 handle = ctypes.c_void_p()
480 missing = missing if missing is not None else np.nan
ValueError: could not convert string to float: 'Kelly, Mr. James'
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,round_num,gamma,min_childe_weigh,subsample,colsample_bytree,alpha,lamb): 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,round_num) 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 gamma = trial.suggest_int('gamma',0.0,1.0) 36 min_childe_weigh = trial.suggest_int('min_childe_weigh',0.0,1.0) 37 subsample = 1 38 colsample_bytree = trial.suggest_int('colsample_bytree',0.0,1.0) 39 alpha = trial.suggest_int('alpha',0.0,1.0) 40 lamb = 1 41 bst = train(df,max_depth,learning_rate,round_num,gamma,min_childe_weigh,subsample,colsample_bytree,alpha,lamb) 42 answer = predict(bst,df_test).round().astype(int) 43 score = accuracy_score(answer.round(),y) 44 return 1.0 - score 45 46df_original = pd.read_csv("(自分のPCのディレクトリ)/Titanic/train.csv") 47df_test = preprocess(df_original.tail(100)) 48df_train = preprocess(df_original.head(791)) 49y = df_test['Survived'] 50df_test = df_test.drop('Survived',axis=1) 51 52#optunaの前処理 53obj_f = partial(objective, df_train, df_test, y) 54#セッション作成 55study = optuna.create_study() 56#回数 57study.optimize(obj_f, n_trials=100) 58 59max_depth = study.best_params['max_depth'] 60learning_rate = study.best_params['learning_rate'] 61round_num = study.best_params['round_num'] 62gamma = study.best_params['gamma'] 63min_childe_weigh = study.best_params['min_childe_weigh'] 64colsample_bytree = study.best_params['colsample_bytree'] 65alpha = study.best_params['alpha'] 66subsample = 1 67lamb = 1 68 69bst = train(df_train,max_depth,learning_rate,round_num,gamma,min_childe_weigh,subsample,colsample_bytree,alpha,lamb) 70print('\nparams :',study.best_params) 71answer = predict(bst,df_train.drop('Survived',axis=1)).round().astype(int) 72print('train score :',accuracy_score(answer.round(),df_train['Survived'])) 73answer = predict(bst,df_test).round().astype(int) 74xgb.plot_importance(bst) 75print('test score :',accuracy_score(answer.round(),y)) 76print(answer) 77 78test_data = pd.read_csv("(自分のPCのディレクトリ)/Titanic/test.csv") 79print(test_data) 80# dfの情報 81test_data.info() 82test_x = test_data.values 83# ----- Submit dataの作成 ------- 84PassengerId=test_data['PassengerId'] 85predictions = predict(bst,test_x) 86submission = pd.DataFrame({"PassengerId": PassengerId, "Survived": predictions.astype(np.int32)}) 87submission.to_csv("my_submission_kaggle.csv", index=False) 88コード
4.自分で調べたことや試したこと
predictions = predict(bst,test_x)でエラーが発生、文字列を除いて、test_xを作るのだろうと思うが、スマート
な方法がわかりません。XGBoostは、NaNがあっても使えると聞いたことがあるが、文字は除く必要があるのだろうか?
5.使っているツールのバージョンなど補足情報
開発環境:Google Colaboratory
プログラム言語:python3
OS:windows10 Home
CPU:Intel(R) Core(TM) i7-7500U CPU@2.70GHz 2.90GHz
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。