DARTS多模型集成回归训练报错:无法构建有效训练样本
解决DARTS RegressionEnsembleModel集成模型训练报错问题
问题背景
- 数据集:40条月度时间序列数据,包含1个目标列和9个协变量列,需预测2022年11月的目标值
- 单个DARTS模型(XGBoost、LightGBM、CatBoost、GRU)单独训练正常,但组合成
RegressionEnsembleModel时抛出ValueError
可复现代码
import numpy as np import pandas as pd from darts import TimeSeries from darts.models import XGBModel, LightGBMModel, CatBoostModel, BlockRNNModel, RandomForest, RegressionEnsembleModel from darts.metrics import SymmetricMeanAbsolutePercentageError col1 = list(np.arange(1,40)) col2 = list(np.arange(41,80)) col3 = list(np.arange(81,120)) col4 = list(np.arange(121,160)) month = pd.date_range('2019-08-01','2022-10-01',freq='1MS').strftime("%Y-%b").tolist() dt = {'col1': col1,'col2':col2,'col3':col3,'target':col4,'month':month} df = pd.DataFrame(dt) df['month'] = pd.to_datetime(df['month']) df.index = df['month'] df = df.drop(['month'],axis = 1) X_train_t = TimeSeries.from_dataframe(df,value_cols=list(df.columns.drop(["col3"]) ),freq="1MS") y_train_t = TimeSeries.from_dataframe(df,freq = '1MS',value_cols = 'target') #Initializing model and fitting torch_metrics = SymmetricMeanAbsolutePercentageError() model1 = XGBModel(lags= [-1,-2,-3], lags_past_covariates=[-1,-2,-3],random_state = 42,output_chunk_length=1) model2 = LightGBMModel(lags= [-1,-2,-3], lags_past_covariates=[-1,-2,-3],random_state = 42,output_chunk_length=1) model3 = CatBoostModel(lags= [-1,-2,-3], lags_past_covariates=[-1,-2,-3], lags_future_covariates=None, output_chunk_length=1,random_state = 42) model4 = BlockRNNModel(input_chunk_length=12,model = 'GRU',dropout=0.2,random_state = 42,output_chunk_length = 1) forecasting_models = [model1,model2,model3,model4] regression_model =RandomForest(lags=None, lags_past_covariates=None, lags_future_covariates=[0], output_chunk_length=1, add_encoders=None, n_estimators=100, max_depth=None) model_ensemble = RegressionEnsembleModel(forecasting_models = forecasting_models, regression_train_n_points =38,regression_model = regression_model) history = model_ensemble.fit(y_train_t,past_covariates = X_train_t) pred = model_ensemble.predict(n=1, series = y_train_t,past_covariates = X_train_t)
报错信息
ValueError Traceback (most recent call last) /tmp/ipykernel_27/3395707719.py in <module> 12 regression_model =RandomForest(lags=None, lags_past_covariates=None, lags_future_covariates=[0], output_chunk_length=1, add_encoders=None, n_estimators=100, max_depth=None) 13 model_ensemble = RegressionEnsembleModel(forecasting_models = forecasting_models, regression_train_n_points =38,regression_model = regression_model) ---> 14 history = model_ensemble.fit(y_train_t,past_covariates = X_train_t) 15 16 pred = model_ensemble.predict(n=1, series = y_train_t,past_covariates = X_train_t) /opt/conda/lib/python3.7/site-packages/darts/models/forecasting/regression_ensemble_model.py in fit(self, series, past_covariates, future_covariates) 119 series=forecast_training, 120 past_covariates=past_covariates, ---> 121 future_covariates=future_covariates, 122 ) 123 /opt/conda/lib/python3.7/site-packages/darts/models/forecasting/forecasting_model.py in _fit_wrapper(self, series, past_covariates, future_covariates) 1820 future_covariates=future_covariates 1821 if self.supports_future_covariates -> 1822 else None, 1823 ) 1824 /opt/conda/lib/python3.7/site-packages/darts/models/forecasting/xgboost.py in fit(self, series, past_covariates, future_covariates, val_series, val_past_covariates, val_future_covariates, max_samples_per_ts, **kwargs) 219 future_covariates=future_covariates, 220 max_samples_per_ts=max_samples_per_ts, ---> 221 **kwargs, 222 ) 223 /opt/conda/lib/python3.7/site-packages/darts/models/forecasting/regression_model.py in fit(self, series, past_covariates, future_covariates, max_samples_per_ts, n_jobs_multioutput_wrapper, **kwargs) 481 482 self._fit_model( ---> 483 series, past_covariates, future_covariates, max_samples_per_ts, **kwargs 484 ) 485 /opt/conda/lib/python3.7/site-packages/darts/models/forecasting/regression_model.py in _fit_model(self, target_series, past_covariates, future_covariates, max_samples_per_ts, **kwargs) 363 364 training_samples, training_labels = self._create_lagged_data( ---> 365 target_series, past_covariates, future_covariates, max_samples_per_ts 366 ) 367 /opt/conda/lib/python3.7/site-packages/darts/models/forecasting/regression_model.py in _create_lagged_data(self, target_series, past_covariates, future_covariates, max_samples_per_ts) 334 lags_future_covariates=lags_future_covariates, 335 max_samples_per_ts=max_samples_per_ts, ---> 336 multi_models=self.multi_models, 337 ) 338 /opt/conda/lib/python3.7/site-packages/darts/utils/data/tabularization.py in _create_lagged_data(target_series, output_chunk_length, past_covariates, future_covariates, lags, lags_past_covariates, lags_future_covariates, max_samples_per_ts, is_training, multi_models) 150 "Unable to build any training samples of the target series " 151 + (f"at index {idx} " if len(target_series) > 1 else "") ---> 152 + "and the corresponding covariate series; " 153 "There is no time step for which all required lags are available and are not NaN values.", 154 ) /opt/conda/lib/python3.7/site-packages/darts/logging.py in raise_if(condition, message, logger) 102 if `condition` is satisfied 103 """ --> 104 raise_if_not(not condition, message, logger) 105 106 /opt/conda/lib/python3.7/site-packages/darts/logging.py in raise_if_not(condition, message, logger) 76 if not condition: 77 logger.error("ValueError: " + message) --> 78 raise ValueError(message) 79 80 ValueError: Unable to build any training samples of the target series and the corresponding covariate series; There is no time step for which all required lags are available and are not NaN values.
错误原因分析
- 集成模型训练样本数设置不合理:
regression_train_n_points=38超出了部分基础模型的有效样本生成能力。例如BlockRNNModel设置了input_chunk_length=12,需要至少12条历史数据才能生成预测,有效训练样本数应为总样本数 - input_chunk_length = 40-12=28,设置38会导致模型无法生成足够的有效预测样本。 - 回归模型参数错误:设置
lags_future_covariates=[0],但当前没有提供未来协变量数据,模型尝试获取不存在的未来协变量滞后项,导致样本构建失败。
解决方案
1. 调整集成模型训练样本数
将regression_train_n_points设置为所有基础模型中最小的有效样本数,这里匹配GRU模型的28。
2. 修正回归模型参数
移除未来协变量滞后设置,改为lags_future_covariates=None,因为没有可用的未来协变量数据。
修正后的完整代码
import numpy as np import pandas as pd from darts import TimeSeries from darts.models import (XGBModel, LightGBMModel, CatBoostModel, BlockRNNModel, RandomForest, RegressionEnsembleModel) from darts.metrics import SymmetricMeanAbsolutePercentageError # 构建数据集 col1 = list(np.arange(1,40)) col2 = list(np.arange(41,80)) col3 = list(np.arange(81,120)) col4 = list(np.arange(121,160)) month = pd.date_range('2019-08-01','2022-10-01',freq='1MS').strftime("%Y-%b").tolist() dt = {'col1': col1,'col2':col2,'col3':col3,'target':col4,'month':month} df = pd.DataFrame(dt) df['month'] = pd.to_datetime(df['month']) df.index = df['month'] df = df.drop(['month'],axis = 1) # 转换为Darts TimeSeries对象 X_train_t = TimeSeries.from_dataframe(df, value_cols=list(df.columns.drop(["col3"])), freq="1MS") y_train_t = TimeSeries.from_dataframe(df, freq='1MS', value_cols='target') # 初始化基础预测模型 model1 = XGBModel(lags= [-1,-2,-3], lags_past_covariates=[-1,-2,-3], random_state=42, output_chunk_length=1) model2 = LightGBMModel(lags= [-1,-2,-3], lags_past_covariates=[-1,-2,-3], random_state=42, output_chunk_length=1) model3 = CatBoostModel(lags= [-1,-2,-3], lags_past_covariates=[-1,-2,-3], lags_future_covariates=None, output_chunk_length=1, random_state=42) model4 = BlockRNNModel(input_chunk_length=12, model='GRU', dropout=0.2, random_state=42, output_chunk_length=1) forecasting_models = [model1, model2, model3, model4] # 修正回归模型参数:移除未来协变量滞后设置 regression_model = RandomForest(lags=None, lags_past_covariates=None, lags_future_covariates=None, output_chunk_length=1, add_encoders=None, n_estimators=100, max_depth=None) # 调整集成模型的训练样本数:匹配GRU模型的有效样本数 model_ensemble = RegressionEnsembleModel(forecasting_models=forecasting_models, regression_train_n_points=28, regression_model=regression_model) # 训练集成模型 history = model_ensemble.fit(y_train_t, past_covariates=X_train_t) # 预测2022年11月目标值 pred = model_ensemble.predict(n=1, series=y_train_t, past_covariates=X_train_t) print(pred)
内容的提问来源于stack exchange,提问作者Crossfit_Jesus
相关产品推荐
相关产品推荐

