怎么快速衡量和消除序列数据的趋势性

  • 2021 年 1 月 4 日
  • AI

简单的方法就是plot出来肉眼观察,但是如果序列数据很多,比如每一个sku都有一个独立的序列数据,则肉眼观察的方法太麻烦 ,平稳性检验和方差只能衡量序列数据的稳定性和波动程度,无法直接衡量趋势的强弱。

使用简单的线性回归的方法就可以了:

test[time].iloc[0].plot(figsize=(7,7))
test[time].iloc[100].plot(figsize=(7,7))
test[time].iloc[105].plot(figsize=(7,7))

看下面的三张图,趋势性越来越强:

我们使用一个线性回归模型就可以较好的评估了,记得加入截距项

from sklearn.linear_model import LinearRegression
lr=LinearRegression(normalize=True,fit_intercept=True)
for index in [0,100,105]:
    y=test[time].iloc[105].T
    X=list(range(63))
    lr.fit(np.array(X).reshape(-1,1),y)
    print(lr.coef_)

通过权重系数的正负我们可以大致判断趋势的方向,根据权重系数的大小我们可以大致判断趋势的强弱。

欢迎大佬们来补充一下还有其它更高效的趋势衡量的方法。

之前提到过gbdt对于趋势性的序列数据效果较差,关于趋势的去除,目前已知的方案有:

1、对每一个sku的时间序列数据进行时间序列分解,计算量比较大;

2、使用非gbdt的模型A(常见的是用线性回归或者多项式回归,前者泛化性能好)来拟合整体的趋势,然后将原始的序列数据减去A的预测结果,在剩下的结果上使用gbdt或者其它复杂非线性模型来拟合,类似于一种集成策略;

3、和方案二类似,不过使用的是ma、arima这类传统的经济学模型,这意味着每个sku都可能需要一个arima模型;

4、直接上nn,在实践中发现,如果要用nn来拟合到趋势信息还是有一定难度的,一方面,nn的网络结构设计可能需要比较复杂(看一看tpa-lstm,nbeats,esrnn这类为时序问题设计的网络结构就知道了。。。),另一方面需要大量的参数调整和呕心沥血的人工微调工作,导致了在实际问题中使用nn的效果并不好,常常会出现和gbdt类似的也无法捕获到趋势信息的问题,因此,去除趋势性还是有必要做一做的

5、待补充

这部分待定,整理完趋势消除的代码之后再贴上来