写文章的目的在于之前面试的时候,提到某一个时间序列项目的特征工程处理。我说的大多数都是一些数据清洗、数据去除异常点、针对数据特性做出的特别的特征工程的操作,然后面试官给我的建议是下一次面试多说一下常规的特征工程处理,因为这样面试官才会跟你有共鸣,能更好的理解你说的特征工程是什么。
本文主要讲述一些比较有意思的特征工程。但是这个有意思就是不那么普通,但是也不那么特殊,让人看了耳目一新的那种感觉。
有趣的特征工程
【节假日消耗的能源更多?】
不管是什么任务中,预测家庭能源消耗、预测消费情况等等,节假日都是一个需要注意的特征,因为放假了就会消耗更多的能源,产生更多的消费购物。
不过需要注意的是:欧美国家的一些节假日和中国不一样,所以需要看一下欧美的法定节假日日期以及周末的放假日期。
【分离时间戳产生更多特征?】
一般时间戳timestamp可能是这样的格式:13:21 20/3/1997,这样的话,可以把这个timestamp分离成5个特征:hour,minute,day,month,year。
进一步的,可以对小时数据进行数据探索分析,看看是否存在白天黑夜的不同导致的对预测结果的影响?对day和month进行分析,看看是否存在节假日对预测结果的影响。
【日期数据的循环性】
通常对于上面的hour特征是[0,23]的,但是其实0点和23点并不像数字本身看起来差别那么巨大,所以可以使用cos或者sin来将时间变成一个循环。相似的是星期一与星期日的差别。
【其他的tricks】
- 人造节日是否考虑进去?中国的6.18,5.20,11.11,12.12等
- 季节导致的偏移是否存在?可能同样的情况春天发生和秋天发生并不相同?
常规的特征工程
滑动窗口法。寻找100个时间相邻的样本的某一个特征的某一个统计特性,比如:
- 均值mean()
- 中位数median()
- 最大值max()
- 最小值min()
- 标准差std()
- 四分位点quantile(q=0.25)/quantile(q=0.75)
- 数据的偏度df.skew()
- 数据的峰度df.kurt()
- 数据的绝对离差df.max(),数据与其均值的差的绝对值的平均值
- 绝对值的最大值
- 绝对值的最小值
- 梯度的绝对值
- 最大值与最小值的差值
- 最大值与最小值的倍数
- 使用时间序列的shift偏移
周期性的特征工程
部分时间特征是具有周期性的。可能是一个月是一个周期,也可能一个季度,一年等等。为了寻找这个周期性,可以使用自相关系数来寻找。简单的说,就是通过平移特征工程,然后绘制自相关系数随着平移距离的函数图像。
有了这个周期性之后,就可以构建更多的特征。比方说同比(去年同月)或者环比(相邻月份)。环比和同比一般都是比率,我们可以再构建这个环比的梯度,类似二阶差分。
卡尔曼滤波器
在百度搜索“时间序列 滤波”等关键词的时候,会发现有下面的内容:
使用kalman滤波器好像可以作为时间序列的一种特征工程。
其实是这样的,在处理一些微观数据的时候,有的时候观测仪器会存在测量误差,这个时候我们可以使用卡尔曼滤波器来进行一定的矫正。
对于每一个时间点的数据,获取的方法有两个:
- 第一个就是观测,但是测量的结果不一定准确,可能受限于测量仪器的精度?
- 第二个就是用这个时间点之前的所有数据,预测这个时间点的数据,当然,这个预测值也是不准的。
- 可否利用这两种方法,相互促进,预测的值更准,或者说让观测到的值更接近本质?Kalman Filter卡尔曼滤波器就这样做的。
这里不加赘述了,更多内容可以看这篇文章,通俗讲解了卡尔曼滤波器以及python实现方法,方便下次直接拿轮子来用:
kalman filter-卡尔曼滤波器与python实现