Проблемы с LGBMRegressor
Пытаюсь для временного ряда (подневного) спрогнозировать объем будущих продаж (раньше использовал fbprophet - получается не очень в силу нерегулярности продаж). По совету обратился к lightgbm. Проблема следующая:
Traceback (most recent call last):
File "C:\Users\Usr\Desktop\forecast\new_model0604.py", line 270, in <module>
X_test = model.predict(future_df)
File "C:\Users\Usr\anaconda3\lib\site-packages\lightgbm\sklearn.py", line 665, in predict
pred_leaf=pred_leaf, pred_contrib=pred_contrib, **kwargs)
File "C:\Users\Usr\anaconda3\lib\site-packages\lightgbm\basic.py", line 2415, in predict
data_has_header, is_reshape)
File "C:\Users\Usr\anaconda3\lib\site-packages\lightgbm\basic.py", line 504, in predict
data = _data_from_pandas(data, None, None, self.pandas_categorical)[0]
File "C:\Users\Usr\anaconda3\lib\site-packages\lightgbm\basic.py", line 344, in _data_from_pandas
+ ', '.join(data.columns[bad_indices]))
ValueError: DataFrame.dtypes for data must be int, float or bool.
Did not expect the data types in the following fields: 0, 1, 2
Не могу ее устранить.
Привожу фрагмент кода:
model = LGBMRegressor()
model.fit(firarg, secarg)
X_test = model.predict(future_df)
print(X_test)
firarg - матрица признаков (n,3), где 3 - год, месяц, день; а secarg - матрица ответов (n,1), т.е. уровень продаж в конкретный день. future_df - матрицы признаков, аналогичная firarg, но на будущие 100 дней
firarg
0 1 2
0 2018 8 24
1 2018 8 25
2 2018 8 26
3 2018 8 27
4 2018 8 28
.. ... .. ..
561 2020 3 7
562 2020 3 8
563 2020 3 9
564 2020 3 10
565 2020 3 11
[566 rows x 3 columns]
secarg
sales
0 2.0
1 3.0
2 0.0
3 0.0
4 0.0
.. ...
561 2.0
562 0.0
563 2.0
564 1.0
565 0.0
[566 rows x 1 columns]
future_df
0 1 2
0 2020 3 11
1 2020 3 12
2 2020 3 13
3 2020 3 14
4 2020 3 15
.. ... .. ..
95 2020 6 14
96 2020 6 15
97 2020 6 16
98 2020 6 17
99 2020 6 18
Ответы (1 шт):
По имеющейся ошибке подозреваю, что там у вас тип Pandas Categorical, а LightGBM (по крайней мере в имеющейся у вас версии) не умеет работать с таким типом. Можете попробовать дать ему чистый numpy.array посредством future_df.values, во многих случаях это помогает.