手把手教你用 Python 实现针对时间序列预测的特征选择
off999 2024-09-13 13:30 70 浏览 0 评论
雷锋网按:本文源自美国机器学习专家 Jason Brownlee 的博客,雷锋网编译。
要将机器学习算法应用于时间序列数据,需要特征工程的帮助。
例如,单变量的时间序列数据集由一系列观察结果组成,它们必须被转换成输入和输出特征,才能用于监督性学习算法。
但这里有一个问题:针对每个时间序列问题,你可以处理的特征类型和数量,却并没有明确的限制。当然,古典的时间序列分析工具(如相关图correlogram)可以帮助评估滞后变量(lag variables),但并不能直接帮助开发者对其他类型的特征进行选择,例如从时间戳(年、月、日)和移动统计信息(如移动平均线moving average)衍生的特征。
因此,我们将在本教程中探讨如何利用基于特征重要性和特征选择的机器学习工具处理时间序列问题。
通过本教程的学习,你将了解:
● 如何创建和解释滞后观察的相关图。
● 如何计算和解释时间序列特征的重要性得分。
● 如何对时间序列输入变量进行特征选择。
本教程共分为如下六个部分:
1. 载入每月汽车销量数据集:即载入我们将要使用的数据集。
2. 平稳化:讲述如何使数据集平稳化,以便于后续的分析和预测。
3. 自相关图:讲述如何创建时间序列数据的相关图。
4. 时间序列到监督学习:将时间单变量的时间序列转化为监督性学习问题。
5. 滞后变量的特征重要性:讲述如何计算和查看时间序列数据的特征重要性得分。
6. 滞后变量的特征选择:讲述如何计算和查看时间序列数据的特征选择结果。
1. 载入数据
在本教程中,我们将基于魁北克在 1960 到 1968 年的月度汽车销量数据进行讲解。
原始数据可以在如下链接下载:
https://datamarket.com/data/set/22n4/monthly-car-sales-in-quebec-1960-1968
本例中,我们将下载后的数据集保存为 car-sales.csv 文件,同时删去了文件中的脚注信息。
基于 Pandas 库加载该数据集的代码如下,我们将数据保存为一个 Series 对象:
# line plot of time series
from pandas import Series
from matplotlib import pyplot
# load dataset
series = Series.from_csv('car-sales.csv', header=0)
# display first few rows
print(series.head(5))
# line plot of dataset
series.plot
pyplot.show
运行以上实例后的打印情况如下(这里只列出了 5 行):
Month
1960-01-01 6550
1960-02-01 8728
1960-03-01 12026
1960-04-01 14395
1960-05-01 14587
Name: Sales, dtype: int64
完整数据的曲线图如下所示:
2. 平稳化
从上图我们可以看到汽车销量数据明显的季节性和日益增长的变化趋势。
这种季节性的变化和增长趋势虽然可以作为序列预测的关键特征,但如果需要探索其他的有助于我们做出序列预测的系统信号,就必须将它们移除。
通常,我们将除去了季节性变化和增长趋势的时间序列称为平稳化序列。
为了消除这种季节性变化,通常采取季节差分的办法,即生成所谓的季节性适配时间序列(seasonally adjusted time series)。
本例中季节性变化的变化周期似乎是一年(12个月)。下面的代码展示了如何计算季节性适配时间序列,并将结果保存到文件 seasonally-adjusted.csv。
# seasonally adjust the time series
from pandas import Series
from matplotlib import pyplot
# load dataset
series = Series.from_csv('car-sales.csv', header=0)
# seasonal difference
differenced = series.diff(12)
# trim off the first year of empty data
differenced = differenced[12:]
# save differenced dataset to file
differenced.to_csv('seasonally_adjusted.csv')
# plot differenced dataset
differenced.plot
pyplot.show
代码中,由于最初的 12 个月没有更早的数据用以差分计算,因此被丢弃。最终得到的季节差分结果如下图所示:
从图中可以看出,我们通过差分运算成功消除了季节性变化和增长趋势信息。
3. 自相关图
通畅情况下,我们根据与输出变量的相关性来选择时间序列的特征。
这被称为自相关(autocorrelation),并包括如何绘制自相关图,也称为相关图。 自相关图展示了每个滞后观察结果的相关性,以及这些相关性是否具有统计学的显着性。
例如,下面的代码绘制了月汽车销量数据集中所有滞后变量的相关图。
from pandas import Series
from statsmodels.graphics.tsaplots import plot_acf
from matplotlib import pyplot
series = Series.from_csv('seasonally_adjusted.csv', header=None)
plot_acf(series)
pyplot.show
运行后可以得到一张相关图,或自相关函数(ACF)图,如下所示。
图中 x 轴表示滞后值,y 轴上 -1 和 1 之间则表现了这些滞后值的正负相关性。
蓝色区域中的点表示统计学显着性。滞后值为 0 相关性为 1 的点表示观察值与其本身 100% 正相关。
可以看到,图中在 1,2,12 和 17 个月显示出了显著的滞后性。
这个分析为后续的比较过程提供了一个很好的基准。
4. 时间序列到监督学习
通过将滞后观察(例如t-1)作为输入变量,将当前观察(t)作为输出变量,可以将单变量的月度汽车销量数据集转换为监督学习问题。
为了实现这一转换,在下面的代码中我们调用了 Pandas 库中的 shift 函数,通过 shift 函数我们可以为转换后的观察值创建新的队列。
在以下示例中,我们创建了一个包含 12 个月滞后值的新时间序列,以预测当前的观察结果。
代码中 12 个月的迁移表示前 12 行的数据不可用,因为它们包含 NaN 值。
from pandas import Series
from pandas import DataFrame
# load dataset
series = Series.from_csv('seasonally_adjusted.csv', header=None)
# reframe as supervised learning
dataframe = DataFrame
for i in range(12,0,-1):
dataframe['t-'+str(i)] = series.shift(i)
dataframe['t'] = series.values
print(dataframe.head(13))
dataframe = dataframe[13:]
# save to new file
dataframe.to_csv('lags_12months_features.csv', index=False)
打印输出如下所示,其中前 12 行的数据不可用。
我们将前 12 行的数据删除,然后将结果保存在 lags_12months_features.csv 文件中。
实际上,这个过程可以在任意的时间步长下重复进行,例如 6 或 24 个月,感兴趣的朋友可以自行尝试。
5. 滞后变量的特征重要性
各种决策树,例如 bagged 树和随机森林等,都可以用来计算特征值的重要性得分。
这是一种机器学习中的常见用法,以便在开发预测模型时有效评估输入特征的相对有效性。
这里,我们通过正要性得分,来帮助评估时间序列预测输入特征的相对重要性。
这一点之所以重要,不仅是因为我们可以设计上述提到的滞后观察特征,还可以设计基于观测时间戳、滚动统计等其他类型的特征。因此,特征重要性是整理和选择特征时非常有效的一种方法。
在下面的实例中,我们加载了上一节中创建的数据集的监督性学习视图,然后利用随机森林模型(代码中为RandomForestRegressor),总结了 12 个滞后观察中每一个的相对特征重要性得分。
这里使用了大数量的树来保证得分的稳定性。此外,我们还用到了随机种子初始化(the random number seed is initialized),用以保证每次运行代码时都能获得相同的结果。
from pandas import read_csv
from sklearn.ensemble import RandomForestRegressor
from matplotlib import pyplot
# load data
dataframe = read_csv('lags_12months_features.csv', header=0)
array = dataframe.values
# split into input and output
X = array[:,0:-1]
y = array[:,-1]
# fit random forest model
model = RandomForestRegressor(n_estimators=500, random_state=1)
model.fit(X, y)
# show importance scores
print(model.feature_importances_)
# plot importance scores
names = dataframe.columns.values[0:-1]
ticks = [i for i in range(len(names))]
pyplot.bar(ticks, model.feature_importances_)
pyplot.xticks(ticks, names)
pyplot.show
运行示例后,首先打印了滞后观察值的重要性得分,如下所示。
[ 0.21642244 0.06271259 0.05662302 0.05543768 0.07155573 0.08478599
0.07699371 0.05366735 0.1033234 0.04897883 0.1066669 0.06283236]
然后将得分绘制为条形图,如图所示。
图中显示 t-12 观测值的相对重要性最高,其次就是 t-2 和 t-4。
感兴趣的朋友可以仔细研究这个结果与上述自相关图的差异。
实际上,这里还可以用 gradient boosting,extra trees,bagged decision trees 等代替随机森林模型,同样可以计算特征的重要性得分。
6. 滞后变量的特征选择
我们还可以通过特征选择来自动识别并选择出最具预测性的输入特征。
目前,特征选择最流行方法是递归特征选择(Recursive Feature Selection,RFE)。
RFE 可以创建预测模型,对特征值赋予不同的权值,并删掉那些权重最小的特征,通过不断重复这一流程,最终就能得到预期数量的特征。
以下示例中我们演示了如何通过RFE与随机森林模型进行特征选择,注意其中输入特征的预期数量设置的是 4。
from pandas import read_csv
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestRegressor
from matplotlib import pyplot
# load dataset
dataframe = read_csv('lags_12months_features.csv', header=0)
# separate into input and output variables
array = dataframe.values
X = array[:,0:-1]
y = array[:,-1]
# perform feature selection
rfe = RFE(RandomForestRegressor(n_estimators=500, random_state=1), 4)
fit = rfe.fit(X, y)
# report selected features
print('Selected Features:')
names = dataframe.columns.values[0:-1]
for i in range(len(fit.support_)):
if fit.support_[i]:
print(names[i])
# plot feature rank
names = dataframe.columns.values[0:-1]
ticks = [i for i in range(len(names))]
pyplot.bar(ticks, fit.ranking_)
pyplot.xticks(ticks, names)
pyplot.show
运行以上示例后,可以得到如下 4 个待选特征。
Selected Features:
t-12
t-6
t-4
t-2
可见,这一结果与上一节由重要性得分得到的结果相一致。
同时,程序还会创建一个如下所示的条形图,图中显示了每个待选输入特征的选择排序(数字越小越好)。
同样,感兴趣的朋友还可以设置不同的预期特征数量,或者换用随机森林之外的其他模型。
总结
在本教程中,我们通过实例代码讲解了如何通过机器学习的工具对时间序列数据进行特征选择。
具体来说,我们介绍了如下三点:
● 如何解释具有高度相关性的滞后观测的相关图。
● 如何计算和查看时间序列数据中的特征重要性得分。
● 如何使用特征选择来确定时间序列数据中最相关的输入变量。
来源:machinelearningmastery,雷锋网编译
相关推荐
- 打印机如何网络共享打印(打印机网络共享打印怎么设置)
-
想要建立打印机共享使用的方法如下1右击【计算机】选择【管理】,在弹出的【计算机管理】窗口中:系统工具->本地用户和组->用户,在右边找到【Guest】双击进去,把账户已禁用的勾选去掉。2回...
- 联想售后维修服务地址(联想售后维修 电话)
-
官方网站:http://www.lenovo.com.cn/作为全球电脑市场的领导企业,联想从事开发、制造并销售可靠的、安全易用的技术产品及优质专业的服务,帮助全球客户和合作伙伴取得成功。联想公司主要...
- 华硕系统(华硕系统恢复)
-
华硕电脑安装的是微软公司的windows系统。一般的华硕电脑出厂的时候安装的都是微软的操作系统,不会安装安卓或者苹果的操作系统。安卓的操作系统一般都是安装在手机上面的,苹果的操作系统都是安装在苹果手机...
- wifi强力破解软件排名(wife强力破解软件)
-
目前我还沒发现有可以破解WiFi密码的软件,有可能有,但这是违法的,所以开发者不可能在网上发布的。有很多人说万能钥匙,其实万能钥匙不是破解WiFi密码,而是密码共享,也就是说一台手机上安装万能钥匙,有...
- 电脑回收站怎么找出来(电脑回收站到哪里找)
-
1、打开电脑来到桌面,在空白的地方单击右键,在跳出来的属性中选择个性化。2、点击更改桌面图片,然后会跳出一个桌面图标设置,对桌面上固有图标的更改。3、在桌面图标设置中你可以看到回收站前面未勾选,勾选了...
- windows xp电脑公司特别版(正版windows xp)
-
1、请看下你的游戏说明,是否需要最新版本的显卡驱动支持,如果需要,请将你的显卡驱动升级到最新版。另外,Win7系统内置了很多显卡驱动程序,所以很多计算机在安装完操作系统后都不需要再安装显卡驱动,但是还...
- win7怎么设置定时关机命令(windows7设置定时关机)
-
1、点击屏幕左下方的开始菜单,点运行,输入cmd, 2、弹出一个黑色的框,在里面输入shutdown-f-s-t3600,记住后面这几个字母要加空格,这里面的3600代表的是3600秒,比如...
- windows7恢复出厂设置后账户停用
-
1、重新开机或电脑重启的过程中,也就是在出现品牌Logo的时候,连续按F8进入安全模式,选择带命令行的安全模式。 2、管理员身份打开的命令提示符窗口,输入并回车执行:compmgmt.msc命令。3...
- 随身wifi每月怎么交钱(随身wifi是怎么交费的)
-
需要看具体的随身wifi服务商和套餐类型。一般来说,续费可以通过以下途径实现:1.网上续费:登录随身wifi服务商的官网,找到相应的续费渠道,选择套餐并支付即可;2.APP续费:下载随身wifi...
- 共享打印机需要输入用户名和密码
-
WindowsXP一直提示凭证不足,输入Guest用户名或者什么名都试过,密码为空,还是提示凭证不足。不过解决了,顺便分享下方法。 以下是在打印机主机的设置: 在Win10电脑中,...
- 360文件恢复工具下载(360的文件恢复功能怎么样)
-
文件恢复工具是在360安全卫士里的一个组件360文件恢复,可以帮助您快速从硬盘,U盘,SD卡等磁盘设备中恢复,被误删的文件360安全卫士的文件恢复功能在360的工具里。操作办法如下:1、打开360安全...
- 1660s现在全是矿卡了吧(1660有矿卡)
-
是的。1660super显卡已经停产了,1660super有着高算力低功耗的特点,他是最受矿工欢迎的显卡,市场上在卖的不是矿卡未翻新就是矿卡翻新。16系的显卡都因为有图灵架构所以架构特别高,这个架构带...
- 腾讯电脑管家软件中心介绍(腾讯电脑管家官网是多少)
-
可以加速升级qq等级,还有就是清除电脑病毒基本靠谱,现在完全靠谱的软件太少了,功能好一点,就乌七八糟全是广告,也可以理解,都要挣钱的嘛。QQ电脑管家这点就比较好,性能好用,一贯的清爽没广告,大公司的...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
慕ke 前端工程师2024「完整」
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
