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

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

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

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

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2981閲覧

Python XGBoost "Size of labels must equal to number of rows."エラーについて

SuzuAya

総合スコア71

XGBoost

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

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/06 07:42

編集2020/09/06 07:50

前提・実現したいこと

現在、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の公式サイトで,私がやりたいことと同様のケースがないか探していますが,今のところ見つけられていません.

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

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

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

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

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

guest

回答1

0

ベストアンサー

XGBoostというより機械学習の学習の仕方の問題です
プログラムで示された方法でできるアルゴリズムはありません

機械学習は
y_1 x1_1, x2_1, ..., xn_1
y_2 x1_2, x2_2, ..., xn_2
...
の様に目的変数1つに対して説明変数を1つ以上とした1行の組み毎に学習します。
例示いただいたプログラムですと目的変数に対して説明変数20行を当てはめようとしてエラーとなっています。
これはXGBoostでなくとも出来ません。
目的変数に対して20行の説明変数が全て必要ならばそれを横1行に展開して与える必要があります。

1つのやり方としては20日間の実績値を機械的に1行にする、というものです。
ただ、予測したいデータに対してこれでよいかは分かりません。20日前の値よりも1日前の値の方が効果あるなど
重み付けをした方がよいかもしれませんが、それは学習の調整の一つとなります。

また、時系列の効果を加味するならばXGBoostではなくARIMAなどの時系列モデルの方が良いかもしれません。
これはデータによりけりなので一般的にこれが正解というものはありません。

まぁまず着手してみる方法としては機械的にできる、
1つのやり方としては20日間の実績値を機械的に1行にする
ところからかなと思います。

投稿2020/09/06 09:16

aokikenichi

総合スコア2240

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

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

SuzuAya

2020/09/06 10:51

>aokikenichi様 ご丁寧なご回答をありがとうございます!やっぱり,こういったことはできないんですね.アルゴリズムをご丁寧にご教示くださりましてありがとうございました.なんとか理想に近い形でできるように引き続き模索してみます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問