如何使用ML预测Python中的时间序列数据

Python023

如何使用ML预测Python中的时间序列数据,第1张

通过numpy转换:

import numpy as np

series['maxsal']= series['maxsal'].astype(np.float64)

series['minsal']= series['minsal'].astype(np.float64)

在调用ARIMA之前,加入上面两行。

model = ARIMA(series, order=(1,1,0))

某些情况下,也可以选择直接执行下面这行代码:

series = series.astype(np.float64)

ARMA, ARIMA, SARIMA assumptions:

▪ Time-series data is stationary.

▪ If nonstationary, remove trend, seasonality, apply differencing, and so on.

▪ Remember that stationary data has no trend, seasonality, constant mean, and

constant variance.

▪ Therefore, the past is assumed to represent what will happen in the future

in a probabilistic sense.

pyramid-arima 的安装请见 https://pypi.org/project/pyramid-arima/

(我只在linux系统上成功安装了,windows上没有成功)

函数参数介绍请见 https://www.alkaline-ml.com/pmdarima/index.html

Github上的例子请见 https://github.com/tgsmith61591/pmdarima

pm.auto_arima可以自动搜索出arima模型中的(q, d, p)参数

参考 https://blog.csdn.net/HHXUN/article/details/79858672

利用 model.predict() 函数预测

或更优的,使用 model.update() 函数,不断用新观测到的 value 更新模型,以达到更长时间的预测。

2.4 模型评价

公司平台上有不同的api,供内部或外部调用,这些api承担着不同的功能,如查询账号、发版、抢红包等等。日志会记录下每分钟某api被访问了多少次,即一个api每天会有1440条记录(1440分钟),将每天的数据连起来观察,有点类似于股票走势的意思。我想通过前N天的历史数据预测出第N+1天的流量访问情况,预测值即作为合理参考,供新一天与真实值做实时对比。当真实流量跟预测值有较大出入,则认为有异常访问,触发报警。

我放了一份样例数据在data文件夹下,

看一下数据大小和结构

画图看一下序列的走势:(一些画图等探索类的方法放在了test_stationarity.py 文件中,包含时间序列图,移动平均图,有兴趣的可以自己尝试下)。

看这糟心的图,那些骤降为0的点这就是我遇到的第一个坑,我当初一拿到这份数据就开始做了。后来折腾了好久才发现,那些骤降为0的点是由于数据缺失,ETL的同学自动补零造成的,沟通晚了(TДT)。

把坑填上,用前后值的均值把缺失值补上,再看一眼:

发现这份数据有这样几个特点,在模型设计和数据预处理的时候要考虑到:

前六天的数据做训练,第七天做测试集。

消除数据的毛刺,可以用移动平均法,我这里没有采用,因为我试过发现对于我的数据来说,移动平均处理完后并不能使数据平滑,我这里采用的方法很简单,但效果还不错:把每个点与上一点的变化值作为一个新的序列,对这里边的异常值,也就是变化比较离谱的值剃掉,用前后数据的均值填充,注意可能会连续出现变化较大的点:

平滑后的训练数据:

采用statsmodels工具包:

对分解出来的趋势部分单独用arima模型做训练:

预测出趋势数据后,加上周期数据即作为最终的预测结果,但更重要的是,我们要得到的不是具体的值,而是一个合理区间,当真实数据超过了这个区间,则触发报警,误差高低区间的设定来自刚刚分解出来的残差residual数据:

预测并完成最后的加法处理,得到第七天的预测值即高低置信区间:

对第七天作出预测,评估的指标为均方根误差rmse,画图对比和真实值的差距:

可以看到,均方根误差462.8,相对于原始数据几千的量级,还是可以的。测试数据中的两个突变的点,也超过了置信区间,能准确报出来。

前文提到不同的api形态差异巨大,本文只展示了一个,我在该项目中还接触了其他形态的序列,有的有明显的上升或下降趋势;有的开始比较平缓,后面开始增长... ... ,但是都属于典型的周期性时间序列,它的核心思想很简单:做好分解,做好预测结果的还原,和置信区间的设置,具体操作可根据具体业务逻辑做调整,祝大家建模愉快:-D。