我正在计算名为
"spot"
的变量的预测(数据的未来结果)。我正在使用随机森林和一个名为
"DTCI"
的自变量来帮助预测
"spot"
。预测以每月一次的频率进行,这与数据的频率相同。我想根据每个月的上限和下限,获得每个预测月份的置信区间。这与附图中的绿色限值类似。
我尝试使用
GradientBoostingRegressor
构建区间,具体如下:
# 设置下量值和上量值
inf = 0.1
sup = 0.9
# 每个模型必须是独立的
lower_model = GradientBoostingRegressor(loss="quantile", alpha=inf)
upper_model = GradientBoostingRegressor(loss="quantile", alpha=sup)
lower_model.fit(X_train, y_train)
upper_model.fit(X_train, y_train)
predictions = pd.DataFrame(y_hat_forecast_spot)
predictions["inf"] = lower_model.predict(X_fore)
predictions["sup"] = upper_model.predict(X_fore)
然而,结果并没有我预期的趋势。由于这是一个时间序列,我认为(从上图中也可以观察到)极限的增长方式应该是置信区域变大。换句话说,日期越靠后,预测难度就越大,因此与之相关的误差或区间也就越大。
我使用
GradientBoostingRegressor
发现的结果如下所示,其区间随时间变化而变化,而不是增长。
GradientBoostingRegressor
适合时间序列吗?还是有其他函数可以更好地理解时间序列?
GradientBoostingRegressor
本身并不具备时间序列数据的概念。虽然它可以用于时间序列预测,并且你使用的分位数回归方法对于构建预测区间是有效的,但它没有考虑数据中的时间依赖性,这会导致你看到的预测区间不符合预期。
导致你的预测区间没有随时间增加的几个可能原因:
-
缺乏时间特征: 你的模型可能只使用了
DTCI
作为预测spot
的特征,而没有明确包含任何时间信息。如果DTCI
本身没有捕捉到时间趋势,模型将无法学习时间依赖性,导致预测区间在时间上保持相对稳定。 -
数据平稳性: 如果你的时间序列数据具有很强的季节性或趋势,
GradientBoostingRegressor
可能无法有效地捕捉到这些模式。这可能导致对未来的预测过于依赖最近的数据点,从而导致预测区间过窄。
为了改进你的模型并获得更符合预期的预测区间,你可以尝试以下方法:
1. 添加时间特征:
-
滞后特征:
包含
spot
的过去值作为模型的特征。例如,你可以添加spot
在前一个月、前一季度或前一年的值。 - 时间趋势特征: 创建一个表示时间推移的特征,例如从第一个数据点开始的天数或月份。
- 周期性特征: 如果你的数据具有季节性模式,请添加表示这些模式的特征,例如月份的正弦和余弦变换。
2. 时间序列分解:
- 在将数据输入模型之前,使用时间序列分解技术(例如 STL 分解)来分离趋势、季节性和残差成分。
-
你可以使用
statsmodels
库中的seasonal_decompose
函数执行此操作。 - 然后,你可以分别对每个成分进行建模,并组合预测以获得最终预测区间。
3. 使用专门针对时间序列的模型:
- 考虑使用专门为时间序列数据设计的模型,例如 ARIMA、SARIMA 或 Prophet。
- 这些模型可以更好地捕捉时间依赖性,并可能产生更准确的预测区间。
4. 交叉验证:
- 使用时间序列交叉验证来评估你的模型性能并微调超参数。
- 这将确保你的模型不会过度拟合训练数据,并能更好地泛化到未来数据。
以下是一些代码示例,说明如何添加滞后特征和时间趋势特征:
import pandas as pd
# 创建一个时间索引
predictions['date'] = pd.to_datetime(predictions.index)
# 添加时间趋势特征
predictions['time_trend'] = (predictions['date'] - predictions['date'].min()).dt.days
# 添加滞后特征
predictions['spot_lag1'] = predictions['spot'].shift(1)
predictions['spot_lag12'] = predictions['spot'].shift(12)
# 选择特征进行建模
features = ['DTCI', 'time_trend', 'spot_lag1', 'spot_lag12']
X_fore = predictions[features]
请记住,在实施这些更改后重新训练你的
GradientBoostingRegressor
模型,并评估预测区间的改进。
此外,选择最佳方法取决于你的数据的具体特征和你的预测目标。 建议你尝试不同的方法并比较它们的表现,以确定最适合你的用例的方法。
标签:python,machine-learning,scikit-learn,time-series,arima From: 78572538