使用SKforecast与XGBoost时遇两类错误,寻求技术解决方案
问题背景
我有一个经groupby(按date和group字段分组)得到的DataFrame,共177行,数据结构如下:
| date | group | value |
|---|---|---|
| 2022-01-01 | 12 | 25.2 |
| 2022-01-01 | 15 | 36.54 |
| 2022-02-01 | 12 | 55.3 |
| 2022-02-01 | 15 | 69.2 |
以下是两个问题的解决方法:
问题1:执行data = data.asfreq('MS')触发ValueError: cannot reindex on an axis with duplicate labels
原因
asfreq要求索引为唯一的时间序列,但当前DataFrame中同一date对应多个group,存在重复索引标签,无法直接完成重索引操作。
解决方案
按group拆分数据,对每个分组单独执行asfreq后再合并:
import pandas as pd # 确保date列为datetime类型 data['date'] = pd.to_datetime(data['date']) # 分组处理:每个组设date为索引后补全月份,再重置索引合并 data = data.groupby('group').apply( lambda x: x.set_index('date').asfreq('MS').reset_index() ).reset_index(drop=True)
问题2:XGBoost结合SKforecaster网格搜索触发KeyError
原因
SKforecaster要求输入数据的时间索引必须唯一,当前长表格式下同一时间对应多个group,导致生成滞后特征或划分数据集时无法匹配索引。
解决方案
方案1:转换为宽表格式(推荐)
将每个group转为单独列,date作为唯一索引:
# 转换为宽表并补全月份 data_wide = data.pivot(index='date', columns='group', values='value').asfreq('MS') # 使用多序列预测器执行网格搜索 from skforecast.ForecasterAutoregMultiSeries import ForecasterAutoregMultiSeries from xgboost import XGBRegressor from sklearn.model_selection import GridSearchCV forecaster = ForecasterAutoregMultiSeries( regressor=XGBRegressor(random_state=123), lags=12 # 根据业务场景调整滞后阶数 ) param_grid = { 'regressor__n_estimators': [100, 200], 'regressor__max_depth': [3, 5] } grid_search = GridSearchCV( estimator=forecaster, param_grid=param_grid, cv=3, scoring='neg_mean_squared_error' ) grid_search.fit(data_wide)
方案2:按分组单独训练模型
如果需要保留长表格式,对每个group独立训练模型:
from skforecast.ForecasterAutoreg import ForecasterAutoreg from xgboost import XGBRegressor from sklearn.model_selection import GridSearchCV forecasters = {} param_grid = { 'n_estimators': [100, 200], 'max_depth': [3, 5] } for group in data['group'].unique(): # 提取单个分组数据并补全月份 group_data = data[data['group'] == group].set_index('date').asfreq('MS') # 初始化预测器并执行网格搜索 forecaster = ForecasterAutoreg( regressor=XGBRegressor(random_state=123), lags=12 ) grid_search = GridSearchCV(estimator=forecaster, param_grid=param_grid, cv=3) grid_search.fit(group_data) forecasters[group] = grid_search.best_estimator_
内容的提问来源于stack exchange,提问作者so.n
相关产品推荐
相关产品推荐

