本文介绍使用tsfresh库进行时序 Freature Extract,结合Lasso进行建模。
一、背景
众所周知,lasso是机器学习鼻祖之一Robert Tibshirani之作,以L1正则作为特征筛选的回归模型,在多元回归和高维数据建模中具有广泛的应用,但在时序模型中使用的较少,可以查到的几篇文章中文期刊中,主要使用在ARIMA模型中p的定阶,以及多元时间序列的特征筛选。而tsfresh作为一个Feature Extract 机器学习库。有惊呼称之为时序特征提取的瑞士军刀,也有拿着原库example做粗暴简单演示,基本都没有触及到时序建模,甚至语焉不详,我自己之前也拿过来用过,库是好库,但是文档方面确实是简单了一点,本文用tsfresh进行Freature Extract并用Lasso模型对特征做筛选。

二、Lasso简介

Lasso模型在很多博客和论文中都有提及,下面简单解释回顾一下

LassoCV 特征选择 python_Lasso


LassoCV 特征选择 python_Lasso_02


三、tsfresh与建模

LassoCV 特征选择 python_建模_03


图2

图2是该库/模块的主要贡献者在2018年发表的文章

主要通过以下三个步骤对特征进行抽取:

LassoCV 特征选择 python_Lasso_04

  1. 对序列求如平均值这样的特征
  2. 对平均值这个特征进行计算p-value
  3. 多重检验

如作者所说,该库联合了63种方法,共可以产生794种特征,可以说是非常全面了,甚至到了恐怖的程度,以至于不得不考虑计算性能的问题了。好在上述两步都是使用高效并行方法,使用了python中的多进程库multiprocessing,用进程池的方式批量创建子进程,默认调用全部的 CPU 核数,所以在执行特征抽取的时候电脑几乎是满负荷运行。同时这么多的特征,哪些才是对模型有贡献的特征呢?这么多的特征是会导致可怕的overfitting,也就是学习到很多无关特征,训练集上表现很好,但是验证集上一塌糊涂,即高方差,低偏差现象。

正是由于存在特征过多的问题,所以需要对特征进行筛选,刚好Lasso最大的贡献就是过滤掉多余的特征,但lasso作为一种传统的截面数据建模方法,tsfresh是一种时间序列特征提取库,一个主要针对截面数据,一个是时序数据,所以存在一点障碍,下面本文在查看tsfresh文档和相关资料后,把二者结合进行模型特征生成与筛选。

我们知道,时间序列的特征常见的有均数,标准差,众数等,本文在此基础上加入线性回归的拟合残差结果作为lasso的特征之一。

本文不打算插入代码示范,对二者皆有了解的读者,看完以上介绍,可自行尝试,如需要参考代码,请点击

四、结果

LassoCV 特征选择 python_Lasso_05

从图4中我们可以看到,对模型贡献率大的特征有众数、线性回归残差、标准差、序列长度;还有高阶特征,如连续小波变换、快速傅里叶变换。图5是绘制的预测值和真实值的散点图,可以看出,预测值比较可信。同时有回归系数,以及针对时序建模的MAPE指标。

LassoCV 特征选择 python_Lasso_06

参考文献:

https://www.sciencedirect.com/science/article/pii/S0925231218304843