前提・実現したいこと
現在、XGBoostを使って回帰モデルを作成しています。
使っているデータは韓国の1月~6月までの新型コロナ感染者に関するもので、年齢や性別や居住地といった特徴量を入力し、韓国の地域ごとの将来の感染者数の予測を出力するということをやっています。
今までは,以下の検証を行っていました.
・20日間の1日ごとの年齢や性別や居住地といった特徴量を入力し,翌20日間の「1日ごとの」感染者の予測人数を出力する
今回,以下のことを行いたいと思っています.
・20日間の1日ごとの年齢や性別や居住地といった特徴量を入力し,翌20日間の「合計の」感染者の予測人数を出力する」
ただし,入力データと正解値の数が合わないというエラーが発生してしまっています.
上記のことを実践するためには,コードをどのように修正すれば良いかご教示頂けないでしょうか.
そもそも,XGBoostではそういったことはできないということであれば,その旨をご教示頂けますと大変助かります.
発生している問題・エラーメッセージ
--------------------------------------------------------------------------- XGBoostError Traceback (most recent call last) <ipython-input-14-c548977e730d> in <module>() 74 ---> 75 reg.fit(train_x, train_y) 4 frames /usr/local/lib/python3.6/dist-packages/xgboost/core.py in _check_call(ret) 186 """ 187 if ret != 0: --> 188 raise XGBoostError(py_str(_LIB.XGBGetLastError())) 189 190 XGBoostError: [07:21:58] ../src/data/data.cc:530: Check failed: labels_.Size() == num_row_ (1 vs. 20) : Size of labels must equal to number of rows. Stack trace: [bt] (0) /usr/local/lib/python3.6/dist-packages/xgboost/lib/libxgboost.so(+0xa5dc4) [0x7f46ea6b7dc4] [bt] (1) /usr/local/lib/python3.6/dist-packages/xgboost/lib/libxgboost.so(+0x106c92) [0x7f46ea718c92] [bt] (2) /usr/local/lib/python3.6/dist-packages/xgboost/lib/libxgboost.so(+0x1a84b7) [0x7f46ea7ba4b7] [bt] (3) /usr/local/lib/python3.6/dist-packages/xgboost/lib/libxgboost.so(+0x1aae4e) [0x7f46ea7bce4e] [bt] (4) /usr/local/lib/python3.6/dist-packages/xgboost/lib/libxgboost.so(XGBoosterUpdateOneIter+0x55) [0x7f46ea6a9f35] [bt] (5) /usr/lib/x86_64-linux-gnu/libffi.so.6(ffi_call_unix64+0x4c) [0x7f47287a4dae] [bt] (6) /usr/lib/x86_64-linux-gnu/libffi.so.6(ffi_call+0x22f) [0x7f47287a471f] [bt] (7) /usr/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so(_ctypes_callproc+0x2b4) [0x7f47289b85c4] [bt] (8) /usr/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so(+0x11c33) [0x7f47289b8c33]
該当のソースコード
Python
1import pandas as pd 2import numpy as np 3import xgboost as xgb 4from sklearn.model_selection import GridSearchCV 5from sklearn.metrics import mean_squared_error 6from sklearn.multioutput import MultiOutputRegressor 7import matplotlib.pyplot as plt 8from sklearn.externals import joblib 9 10df_x = pd.read_csv("Corona Korean data_by day_as of 0630.csv")# 1日ごとの年齢や性別や居住地といった特徴量 11df_y = pd.read_csv("Corona Korean data_trainY_as of 0630.csv")# 20日間の「合計の」感染者数 12 13print(df_x.head) 14 Day male female Sex_NA ... city No. 154 city No. 155 city No. NA PCR 150 1 0.0 1.0 0.0 ... 0.0 0.0 1.0 0.0 161 2 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 172 3 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 18.. ... ... ... ... ... ... ... ... ... 1982 83 NaN NaN NaN ... NaN NaN NaN NaN 2083 84 NaN NaN NaN ... NaN NaN NaN NaN 21 22[84 rows x 245 columns]> 23 24print(df_y.head) 25 Start_day Province No. 1 ... Province No. 16 Province No. 17 260 21 71 ... 64 16 271 22 76 ... 74 16 282 23 79 ... 81 19 29.. ... ... ... ... ... 3082 103 7 ... 122 8 3183 104 6 ... 124 9 32 33[84 rows x 18 columns]> 34 35# データを特徴量と目的変数に分ける 36df_x = df_x 37df_y = df_y[['Province No. 1']] 38 39# カウンター初期化 40counter = 1 41 42# 学習データの開始行番号 43train_x_start = 0 44train_y_start = 0 45 46# 学習データの終了行番号 47train_x_end = 20 48train_y_end = 1 49 50 51# スライドするデータ件数 52slide_rows = 1 53 54while True: 55 56 # 行番号を指定して、元データから学習データを抽出 57 train_x = df_x[train_x_start : train_x_end] 58 train_y = df_y[train_y_start : train_y_end] 59 60 params = {'objective': 'reg:squarederror', 'tree_method': 'auto', 'min_child_weight':1, 'max_depth': 2, 'gamma':1, 'reg_alpha': 0, 'n_estimators':100} 61 62 reg = xgb.XGBRegressor(**params) 63 reg.fit(train_x, train_y) 64 65 filename = 'Province_1_model_train{}'.format(train_x_start) 66 reg.save_model(filename) 67 68 # データをスライドさせる 69 train_x_start += slide_rows# train_start += slide_rows 70 train_y_start += slide_rows 71 train_x_end += slide_rows# train_end += slide_rows 72 train_y_end += slide_rows 73 74 # カウンター加算 75 counter += 1 76 77 reg.load_model(filename) # load data 78 79 if train_x_start > 84: 80 break 81 82# 性能向上に寄与する度合で重要度をプロットする 83_, ax = plt.subplots(figsize=(12, 4)) 84xgb.plot_importance(reg, ax=ax) 85plt.show()
試したこと
kaggleやXGBoostの公式サイトで,私がやりたいことと同様のケースがないか探していますが,今のところ見つけられていません.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/06 10:51