预测每日电力负荷 - 拟合时间序列

机器算法验证 r 时间序列 回归 预测模型 有马
2022-03-26 03:19:58

我想预测日间电力负荷。我的数据是 11 个月的电力负荷,每隔 30 分钟采样一次。我还从气象站获得了特定于天气的数据(温度、相对湿度、风向、风速、阳光)。由此,我想预测一天结束之前的电力负荷。

我可以运行我的算法直到今天的 10:00,之后它应该以 30 分钟的间隔给出负载预测。因此,它应该在 10:30、11:00、11:30 等告诉负载,直到 24:00。

我的第一次尝试是在 R中创建一个线性模型。

BP.TS <- ts(Buying.power, frequency = 48)
a <- data.frame(
Time, BP.TS, Weekday, Pressure, Temperature, RelHumidity, AvgWindSpeed, AvgWindDirection, MaxWindSpeed, MaxWindDirection, SunLightTime,
m, Buying.2dayago, AfterHolidayAndBPYesterday8, MovingAvgLast7DaysMidnightTemp
)
a <- a[(6*48+1):nrow(a),]

start = 9716
steps.ahead = 21
par(mfrow=c(5,2))
for (i in 1:10) {
    train <- a[1:(start+(i-1)*48),]
    test <- a[((i-1)*48+start+1):((i-1)*48+start+steps.ahead),]
    summary(reg <- lm(log(BP.TS)~., data=train, na.action=NULL))
    pred <- exp(predict(reg, test))

    plot(test$BP.TS, type="o")
    lines(pred, col=2)
    cat("MAE", mean(abs(test$BP.TS - pred)), "\n")
}

这不是很成功。现在我尝试使用 ARIMA 对数据进行建模。我使用了预测包中的 auto.arima() 。这些是我得到的结果:

> auto.arima(BP.TS)
Series: BP.TS 
ARIMA(2,0,1)(1,1,2)[48]                    

Call: auto.arima(x = BP.TS) 

Coefficients:
         ar1      ar2     ma1    sar1     sma1    sma2
      1.1816  -0.2627  -0.554  0.4381  -1.2415  0.3051
s.e.  0.0356   0.0286   0.033  0.0952   0.0982  0.0863

sigma^2 estimated as 256118:  log likelihood = -118939.7
AIC = 237893.5   AICc = 237893.5   BIC = 237947

现在,如果我尝试类似:

reg = arima(train$BP.TS, order=c(2,0,1), xreg=cbind(
train$Time, 
train$Weekday, 
train$Pressure, 
train$Temperature, 
train$RelHumidity, 
train$AvgWindSpeed, 
train$AvgWindDirection, 
train$MaxWindSpeed, 
train$MaxWindDirection, 
train$SunLightTime,
train$Buying.2dayago,
train$MovingAvgLastNDaysLoad,
train$X1, train$X2, train$X3, train$X4, train$X5, train$X6, train$X7, train$X8, train$X9, 
train$X11, train$X12, train$X13, train$X14, train$X15, train$X16, train$X17, train$X18, 
train$MovingAvgLast7DaysMidnightTemp
))

p <- predict(reg, n.ahead=21, newxreg=cbind(
test$Time, 
test$Weekday, 
test$Pressure, 
test$Temperature, 
test$RelHumidity, 
test$AvgWindSpeed, 
test$AvgWindDirection, 
test$MaxWindSpeed, 
test$MaxWindDirection, 
test$SunLightTime,
test$Buying.2dayago,
test$MovingAvgLastNDaysLoad,
test$X1, test$X2, test$X3, test$X4, test$X5, test$X6, test$X7, test$X8, test$X9, 
test$X11, test$X12, test$X13, test$X14, test$X15, test$X16, test$X17, test$X18, 
test$MovingAvgLast7DaysMidnightTemp
))

plot(test$BP.TS, type="o", ylim=c(6300,8300))
par(new=T)
plot(p$pred, col=2, ylim=c(6300,8300))
cat("MAE", mean(p$se), "\n")

我得到更糟糕的结果。为什么?我的想法用完了,所以请帮忙。如果我需要提供其他信息,请询问。

2个回答

我玩过电力需求模型,我可以告诉你,开始“缩小”是个好主意。每个地区都有自己的特点,但大体思路是一样的。

电力需求是许多变量的函数。从最慢的移动项开始。

  1. 一般经济活动是移动最慢的期限(通常是 3 到 8 年的时间框架)。该术语通常与该地区的国内生产总值有关。电力需求的增长速度通常可能快于 GDP,但在经济繁荣时期电力需求“上升”,而在经济衰退期间需求“下降”提供了与 GDP 的明显联系。请参见下面第一张图中的蓝线。

  2. 接下来是季节性期限(年度时间框架)。例如在美国,夏季高峰出现在 8 月,冬季高峰出现在 1 月,春季低谷出现在 4 月,秋季低谷出现在 11 月。请参阅下面前两个图表中的红线。在第二张图中,我展示了每个月的季节性期限是恒定的,但是您可以通过每个月的线性或非线性关系(每月时间范围)轻松地改进它。

  3. 您现在已进入每日时间范围。底部图表显示了德克萨斯州在 24 小时内 (2010 年 12 月 22 日) 的电力需求。白天高峰在晚上 7:00 (19:00),夜间低谷在凌晨 4:00 (04:00)。这个时间范围是您要考虑假期、周末、天气等的地方。但是,请记住,那些其他变量(在上面的 1 和 2 中)也会影响您的结果。

因此,根据您的描述,您有 11 个月的数据。查看下面的第一张图,假设您有 11 个月的数据。这足以了解一年的季节性术语吗?我会使用至少 10 年的月度数据来了解季节性期限。这里的想法是在“快速季节性变化”的月份与“缓慢的季节性变化”月份对你的日常模型的结构进行不同的调整。

接下来,我将使用您将用来估算日常模型的“数据窗口”的大小和结构。例如,如果在估算夏季每日模型时包含每日秋季和冬季数据,您会得到更好的每日模型吗?或者,在估算夏季每日模型时,使用 10 个重新缩放的“夏季数据窗口”(10 年数据中每年一个)更好吗?

一旦你让所有确定性术语都能正常工作,那么,只有这样,我才会使用 ARIMA 术语。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

@格雷加:

我在评论区的空间用完了,所以我开始另一个答案。

从您的评论来看,这就是问题所在。每个系统/网格都有自己的“签名”。它是系统动力学、年龄、天气、当地经济、文化、传统等的结合。在日本,情况更糟。该国某些地区的运行频率为 50Hz,而其他地区的运行频率为 60Hz。这些电网连接在高压直流站,这意味着某些地区的行为就像电气“孤岛”(与几英里外的邻居完全不同)。如果你只关注一家工厂,可预测性就会下降得更多。更少的用户意味着更高的不确定性。

不管你怎么做,它都会变得一团糟。

我会过滤掉每日/工作日/周末/假期部分以获得季节性术语。如何?31 天的中心移动平均线?51天CMA?XX 天 CMA?您必须对此进行试验,但我会将其设为变量,以便您稍后对其进行调整。无论您最终使用哪种过滤器,请记住它在数据的任何一端都停止(以 31 天为中心的移动平均线将从您的原始数据的第 16 天开始,并在您的原始数据结束后的第 16 天结束)。

接下来,您可以使用 11 个月的数据做的最好的事情是“弥补”第 12 个月(从过滤后的系列的末尾到开头画一条线)。接下来,从原始数据中减去您的季节性期限(过滤后的数据)以获得残差。将残差拟合到您的天气数据,考虑星期几和假期的因素。

您可能需要添加的一些因素是:

1)“生产运行”因素。无论他们在这家工厂生产什么产品,如果他们从一种产品/类别切换到另一种产品/类别,制造一种产品所需的电力需求可能与制造另一种产品所需的电力需求不同。

2)“转换”因素。这是他们从一种产品/类别转移到另一种产品/类别的时候。有时需要几天的时间来准备转换。

3)“工作班次”因素。如果他们每天有三班倒,那么晚班的电力需求可能与白班有很大不同。

祝你好运。正如您可能知道的那样,这种问题可能会让人非常沮丧。

====== 编辑以回答 Grega 的第一条评论 (01/25/2011) ====================

@Grega:回答您的第一条评论,恐怕没有。像这样的模型背后的想法是拥有 32 个未来点的多个“相似实例”,因此您可以拟合这些点,然后预测新点。您没有典型的“类似实例”,因为昨天与今天不同。你必须使用上周的同一天和前一周的同一天,等等。当你得到几个“相似的实例”(比如 20 个)时,你通常超过过去 20 周(假期可能会打乱你的一周或多周)。那时,你正处于一年中完全不同的季节。因此,为了在另一个季节使用这些日子,您需要从原始数据中删除季节术语。

这是一个草率的情况,但这是你可以用 11 个月的数据做的最好的事情。