You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SKforecast与XGBoost时遇两类错误,寻求技术解决方案

问题背景

我有一个经groupby(按date和group字段分组)得到的DataFrame,共177行,数据结构如下:

dategroupvalue
2022-01-011225.2
2022-01-011536.54
2022-02-011255.3
2022-02-011569.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:55:28