机器学习——时间序列ARIMA模型(一):差分法详解
一、所需数据的性质
平稳性
样本数据需随着时间序列而发生变化,且序列的均值和方差不发生明显变化。
预测出在未来的一段期间内数据顺着现有的“惯性”延续下去
现实案例如:股价预测,人口增长率预测
严平稳与弱平稳
严平稳:分布不随时间的改变而改变(期望为0,方差为1)
弱平稳:期望与依赖性不变(未来的值依赖于过去的值)
二、差分法
例如我们现在有一组数据,其随着时间的变化而呈现如下图趋势变化。
那么我们需要将此数据的方差变小,即让此曲线能够更平稳,进而使用我们的ARIMA模型进行预测。
差分法定义:
当自变量x变到x+1时,函数y=y(x)的改变量
Δ y x = y ( x + 1 ) − y ( x ) , ( x = 0 , 1 , 2 , . . . ) \Delta y_{x} = y(x+1) - y(x) , (x = 0,1,2,...) Δyx=y(x+1)−y(x),(x=0,1,2,...)
称为函数y(x)在点x的一阶差分。通常记作
Δ y x = y x + 1 − y x ( x = 0 , 1 , 2 , . . . ) \Delta y_{x} = y_{x+1} - y_{x} (x=0,1,2,...) Δyx=yx+1−yx(x=0,1,2,...)
这里我写了些数据来进一步说明差分法,假设我们有的数据dif_test.csv如下:
data | values |
---|---|
2015/1/2 | 20 |
2015/1/5 | 60 |
2015/1/6 | 130 |
2015/1/7 | 150 |
2015/1/8 | 160 |
2015/1/9 | 150 |
2015/1/12 | 130 |
2015/1/13 | 60 |
2015/1/14 | 20 |
2015/1/15 | 20 |
使用jupyter编写代码
#使用pandas读取数据
import pandas as pd
dif_data = 'dif_test.csv'
dif_data = pd.read_csv(dif_data, index_col=0, parse_dates=[0])
dif_data.head()
使用matplotlib和seaborn绘制曲线
import matplotlib.pylab as plt
import seaborn as sns
#绘制图像
dif_data.plot(figsize=(12,8))
plt.legend(bbox_to_anchor=(1.25, 0.5))
plt.title("method of difference")
sns.despine()
将原数据进行一阶差分
stock_diff = dif_data.diff()
stock_diff.plot(figsize=(9,5))
plt.legend(bbox_to_anchor=(1.25, 0.5))
plt.title("first difference")
sns.despine()
一阶差分后结果如下图
简单来说就是将values值改变成后项减去前项。例如values中的前两项之差(60-20=40)成为差分后的第一项。依此类推,使values趋于平稳。
40 |
---|
70 |
20 |
10 |
-10 |
-20 |
-70 |
-40 |
0 |