如何在python中创建时间序列数据的线性回归预测
我需要能够创建一个python函数,用于基于线性回归模型进行预测,该模型具有时间序列数据的置信区间: 该函数需要使用一个参数来指定要预测的距离。例如,1天、7天、30天、90天等。根据参数,需要创建具有置信带的Holt Winters预测: 我的时间序列数据如下所示:如何在python中创建时间序列数据的线性回归预测,python,Python,我需要能够创建一个python函数,用于基于线性回归模型进行预测,该模型具有时间序列数据的置信区间: 该函数需要使用一个参数来指定要预测的距离。例如,1天、7天、30天、90天等。根据参数,需要创建具有置信带的Holt Winters预测: 我的时间序列数据如下所示: print series [{"target": "average", "datapoints": [[null, 1435688679], [34.870499801635745, 1435688694], [null, 14
print series
[{"target": "average", "datapoints": [[null, 1435688679], [34.870499801635745, 1435688694], [null, 1435688709], [null, 1435688724], [null, 1435688739], [null, 1435688754], [null, 1435688769], [null, 1435688784], [null, 1435688799], [null, 1435688814], [null, 1435688829], [null, 1435688844], [null, 1435688859], [null, 1435688874], [null, 1435688889], [null, 1435688904], [null, 1435688919], [null, 1435688934], [null, 1435688949], [null, 1435688964], [null, 1435688979], [38.180000209808348, 1435688994], [null, 1435689009], [null, 1435689024], [null, 1435689039], [null, 1435689054], [null, 1435689069], [null, 1435689084], [null, 1435689099], [null, 1435689114], [null, 1435689129], [null, 1435689144], [null, 1435689159], [null, 1435689174], [null, 1435689189], [null, 1435689204], [null, 1435689219], [null, 1435689234], [null, 1435689249], [null, 1435689264], [null, 1435689279], [30.79849989414215, 1435689294], [null, 1435689309], [null, 1435689324], [null, 1435689339], [null, 1435689354], [null, 1435689369], [null, 1435689384], [null, 1435689399], [null, 1435689414], [null, 1435689429], [null, 1435689444], [null, 1435689459], [null, 1435689474], [null, 1435689489], [null, 1435689504], [null, 1435689519], [null, 1435689534], [null, 1435689549], [null, 1435689564]]}]
该函数应将预测值附加到上述称为“序列”和返回序列的时间序列数据中:
[{"target": "average", "datapoints": [[null, 1435688679], [34.870499801635745, 1435688694], [null, 1435688709], [null, 1435688724], [null, 1435688739], [null, 1435688754], [null, 1435688769], [null, 1435688784], [null, 1435688799], [null, 1435688814], [null, 1435688829], [null, 1435688844], [null, 1435688859], [null, 1435688874], [null, 1435688889], [null, 1435688904], [null, 1435688919], [null, 1435688934], [null, 1435688949], [null, 1435688964], [null, 1435688979], [38.180000209808348, 1435688994], [null, 1435689009], [null, 1435689024], [null, 1435689039], [null, 1435689054], [null, 1435689069], [null, 1435689084], [null, 1435689099], [null, 1435689114], [null, 1435689129], [null, 1435689144], [null, 1435689159], [null, 1435689174], [null, 1435689189], [null, 1435689204], [null, 1435689219], [null, 1435689234], [null, 1435689249], [null, 1435689264], [null, 1435689279], [30.79849989414215, 1435689294], [null, 1435689309], [null, 1435689324], [null, 1435689339], [null, 1435689354], [null, 1435689369], [null, 1435689384], [null, 1435689399], [null, 1435689414], [null, 1435689429], [null, 1435689444], [null, 1435689459], [null, 1435689474], [null, 1435689489], [null, 1435689504], [null, 1435689519], [null, 1435689534], [null, 1435689549], [null, 1435689564]]},{"target": "Forecast", "datapoints": [[186.77999925613403, 1435520801], [178.95000147819519, 1435521131]]},{"target": "Upper", "datapoints": [[186.77999925613403, 1435520801], [178.95000147819519, 1435521131]]},{"target": "Lower", "datapoints": [[186.77999925613403, 1435520801], [178.95000147819519, 1435521131]]}]
有人在python中做过类似的事情吗?有什么想法可以开始吗?注意:这不是一个详细的规范答案,而是对适用于您的领域的可用库(统计模型)的引用 对于python,您可以使用:
- 西皮:
- e、 g.(使用
)scipy.stats.linregresse
- e、 g.(使用
- statsmodels:这里有
:以下是最新版本sklearn
- 特别是它有一个关于预测的章节
- 另一篇文章展示了如何使用
和statsmodels
sklearn
null = None
time_series = [{"target": "average", "datapoints": [[null, 1435688679], [34.870499801635745, 1435688694], [null, 1435688709], [null, 1435688724], [null, 1435688739], [null, 1435688754], [null, 1435688769], [null, 1435688784], [null, 1435688799], [null, 1435688814], [null, 1435688829], [null, 1435688844], [null, 1435688859], [null, 1435688874], [null, 1435688889], [null, 1435688904], [null, 1435688919], [null, 1435688934], [null, 1435688949], [null, 1435688964], [null, 1435688979], [38.180000209808348, 1435688994], [null, 1435689009], [null, 1435689024], [null, 1435689039], [null, 1435689054], [null, 1435689069], [null, 1435689084], [null, 1435689099], [null, 1435689114], [null, 1435689129], [null, 1435689144], [null, 1435689159], [null, 1435689174], [null, 1435689189], [null, 1435689204], [null, 1435689219], [null, 1435689234], [null, 1435689249], [null, 1435689264], [null, 1435689279], [30.79849989414215, 1435689294], [null, 1435689309], [null, 1435689324], [null, 1435689339], [null, 1435689354], [null, 1435689369], [null, 1435689384], [null, 1435689399], [null, 1435689414], [null, 1435689429], [null, 1435689444], [null, 1435689459], [null, 1435689474], [null, 1435689489], [null, 1435689504], [null, 1435689519], [null, 1435689534], [null, 1435689549], [null, 1435689564]]}]
# assuming the time series is the X axis value
input_X_vars = []
input_Y_vars = []
for pair in time_series[0]["datapoints"]:
if (pair[0] != None and pair[1] != None):
input_X_vars.append(pair[1])
input_Y_vars.append(pair[0])
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
regr = linear_model.LinearRegression()
regr.fit(input_X_vars, input_Y_vars)
test_X_vars = [1435688681, 1435688685]
results = regr.predict(test_X_vars)
forecast_append = {"target": "Lower", "datapoints": results}
time_series.append(forecast_append)
return Y[-fc:], alpha, beta, rmse
我将null设置为None,因为“null”关键字在python中被解析为一个简单的变量。在您的问题文本中,您明确表示希望 回归输出的上限和下限,以及输出 预测。您还提到使用Holt Winters算法 特别是预测 其他回答者建议的软件包很有用,但您可能会注意到
sklearn
LinearRegression不会给出“超出”的错误界限
“盒子”,statsmodels有
因此,我建议尝试使用霍尔特温特斯。
不幸的是,它的许可证不清楚,所以我不能在这里复制它
满满的。现在,我不确定你是否真的想要霍尔特·温特斯
(季节性)预测,或霍尔特的线性指数平滑
算法。我猜这篇文章的标题是后者。因此
您可以使用链接库的linear()
函数。这个
这项技术是为感兴趣的读者准备的
为了不提供仅链接的答案,我将描述
这里的主要特点。定义了一个函数来获取数据,即
def linear(x, fc, alpha = None, beta = None):
x
是要拟合的数据,fc
是所需的时间步数
为了预测,阿尔法和贝塔采用其通常的霍尔特冬季含义:
大致是一个参数,用于控制平滑到“级别”的量
分别向"趋势"靠拢。如果alpha
或beta
不是
如果指定,则使用
将RMSE降至最低
该函数通过循环使用
现有数据点,然后返回预测,如下所示:
null = None
time_series = [{"target": "average", "datapoints": [[null, 1435688679], [34.870499801635745, 1435688694], [null, 1435688709], [null, 1435688724], [null, 1435688739], [null, 1435688754], [null, 1435688769], [null, 1435688784], [null, 1435688799], [null, 1435688814], [null, 1435688829], [null, 1435688844], [null, 1435688859], [null, 1435688874], [null, 1435688889], [null, 1435688904], [null, 1435688919], [null, 1435688934], [null, 1435688949], [null, 1435688964], [null, 1435688979], [38.180000209808348, 1435688994], [null, 1435689009], [null, 1435689024], [null, 1435689039], [null, 1435689054], [null, 1435689069], [null, 1435689084], [null, 1435689099], [null, 1435689114], [null, 1435689129], [null, 1435689144], [null, 1435689159], [null, 1435689174], [null, 1435689189], [null, 1435689204], [null, 1435689219], [null, 1435689234], [null, 1435689249], [null, 1435689264], [null, 1435689279], [30.79849989414215, 1435689294], [null, 1435689309], [null, 1435689324], [null, 1435689339], [null, 1435689354], [null, 1435689369], [null, 1435689384], [null, 1435689399], [null, 1435689414], [null, 1435689429], [null, 1435689444], [null, 1435689459], [null, 1435689474], [null, 1435689489], [null, 1435689504], [null, 1435689519], [null, 1435689534], [null, 1435689549], [null, 1435689564]]}]
# assuming the time series is the X axis value
input_X_vars = []
input_Y_vars = []
for pair in time_series[0]["datapoints"]:
if (pair[0] != None and pair[1] != None):
input_X_vars.append(pair[1])
input_Y_vars.append(pair[0])
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
regr = linear_model.LinearRegression()
regr.fit(input_X_vars, input_Y_vars)
test_X_vars = [1435688681, 1435688685]
results = regr.predict(test_X_vars)
forecast_append = {"target": "Lower", "datapoints": results}
time_series.append(forecast_append)
return Y[-fc:], alpha, beta, rmse
其中,Y[-fc:]
是预测点,alpha
和beta
是预测点
实际使用的值和rmse
是均方根误差。
不幸的是,正如你所看到的,信心没有上限或下限
间隔。顺便说一句,我们可能应该把它们称为
预测区间数学
霍尔特算法和霍尔特温特斯算法是指数平滑算法
为生成的预测寻找置信区间的技术和方法
对他们来说,这是一个棘手的问题。它们被称为方法,在霍尔特温特斯的例子中,它们是乘法的
算法,没有。但是,
声称:
可以计算长期预测的置信区间
通过考虑指数平滑模型生成的预测
作为ARIMA模型的特例。(注意:并非所有软件都能计算
这些模型的置信区间正确。)的宽度
置信区间取决于(i)模型的均方根误差,(ii)
平滑类型(简单或线性);(iii)该物业的价值
平滑常数;以及(iv)你将要经历的时期数
预测。一般来说,随着α的增大,间隔的扩展速度加快
在SES模型中更大,当线性化时,它们传播得更快
而不是使用简单的平滑
我们看到ARIMA(0,2,2)模型等价于Holt模型
具有加性误差的线性模型
预测间隔代码(即如何继续)
你在评论中指出你的观点。我
我猜您可能已经习惯了
forecast
打包在R
中,因此期望这样的间隔。在里面
在这种情况下,您可以修改python库,以便在
同样的基础
查看,我们可以看到它返回一个对象
基于预测(ets(…)
。在引擎盖下-这最终调用
,它返回平均值mu
和方差
var
(以及我不得不承认我不理解的cj
)。
方差用于计算上界和下界
要在Python中执行类似的操作,我们需要生成一些
类似于估算每个变量方差的class1
R函数
预测。此函数获取模型拟合和预测中发现的残差
在每个时间步将它们乘以一个因子,得到
在线性霍尔特算法的特殊情况下,因子是alpha+k*beta
其中,k
是预测的时间步数。一旦你有了它
在每个预测点的方差,将误差视为正常情况
分布并从正态分布中获取X%值
下面是一个如何在Python中实现这一点的想法(使用代码