文档章节

Python 实现针对时间序列预测的特征选择

易野
 易野
发布于 2017/06/21 19:41
字数 2704
阅读 13
收藏 0
点赞 0
评论 0

 

要将机器学习算法应用于时间序列数据,需要特征工程的帮助。

例如,单变量的时间序列数据集由一系列观察结果组成,它们必须被转换成输入和输出特征,才能用于监督性学习算法。

但这里有一个问题:针对每个时间序列问题,你可以处理的特征类型和数量,却并没有明确的限制。当然,古典的时间序列分析工具(如相关图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

完整数据的曲线图如下所示:

手把手教你用 Python 实现针对时间序列预测的特征选择

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 个月没有更早的数据用以差分计算,因此被丢弃。最终得到的季节差分结果如下图所示:

手把手教你用 Python 实现针对时间序列预测的特征选择

从图中可以看出,我们通过差分运算成功消除了季节性变化和增长趋势信息。

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)图,如下所示。

手把手教你用 Python 实现针对时间序列预测的特征选择

图中 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 行的数据不可用。

手把手教你用 Python 实现针对时间序列预测的特征选择

我们将前 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]

然后将得分绘制为条形图,如图所示。

手把手教你用 Python 实现针对时间序列预测的特征选择

图中显示 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

可见,这一结果与上一节由重要性得分得到的结果相一致。

手把手教你用 Python 实现针对时间序列预测的特征选择

同时,程序还会创建一个如下所示的条形图,图中显示了每个待选输入特征的选择排序(数字越小越好)。

同样,感兴趣的朋友还可以设置不同的预期特征数量,或者换用随机森林之外的其他模型。

总结

在本教程中,我们通过实例代码讲解了如何通过机器学习的工具对时间序列数据进行特征选择。

具体来说,我们介绍了如下三点:

● 如何解释具有高度相关性的滞后观测的相关图。

● 如何计算和查看时间序列数据中的特征重要性得分。

● 如何使用特征选择来确定时间序列数据中最相关的输入变量。

本文转载自:https://www.leiphone.com/news/201703/6rVkgxvxUumnv5mm.html

共有 人打赏支持
易野
粉丝 3
博文 142
码字总数 114058
作品 0
深圳
【python数据挖掘课程】二十三.时间序列金融数据预测及Pandas库详解

这是《Python数据挖掘课程》系列文章,也是我上课内容及书籍中的一个案例。本文主要讲述时间序列算法原理,Pandas扩展包基本用法以及Python调用statsmodels库的时间序列算法。由于作者数学比...

eastmount ⋅ 05/09 ⋅ 0

手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码)

简介 对于任何业务而言,基于时间进行分析都是至关重要的。库存量应该保持在多少?你希望商店的客流量是多少?多少人会乘坐飞机旅游?类似这样待解决的问题都是重要的时间序列问题。 这就是时...

技术小能手 ⋅ 06/12 ⋅ 0

Python 3中使用ARIMA进行时间序列预测的指南

最好的做法是,从笔记本电脑的顶部导入需要的库: 我们还为我们的地块定义了一个风格 。 我们将使用一个名为“来自美国夏威夷Mauna Loa天文台的连续空气样本的大气二氧化碳”的数据集,该数据...

u014096903 ⋅ 04/17 ⋅ 0

【干货】Python无监督学习的4大聚类算法

     来源:towardsdatascience.com   作者:Vihar Kurama 翻译:肖琴   【新智元导读】无监督学习是机器学习技术中的一类,用于发现数据中的模式。本文介绍用Python进行无监督学习的...

深度学习 ⋅ 05/28 ⋅ 0

一文简述多种无监督聚类算法的Python实现

  本文简要介绍了多种无监督学习算法的 Python 实现,包括 K 均值聚类、层次聚类、t-SNE 聚类、DBSCAN 聚类。   无监督学习是一类用于在数据中寻找模式的机器学习技术。无监督学习算法使...

深度学习 ⋅ 05/23 ⋅ 0

教程 | 一文简述多种无监督聚类算法的Python实现

  选自towardsdatascience   作者:Vihar Kurama   机器之心编译   参与:Geek AI、路      本文简要介绍了多种无监督学习算法的 Python 实现,包括 K 均值聚类、层次聚类、t-S...

机器之心 ⋅ 05/22 ⋅ 0

手把手教你在多种无监督聚类算法实现Python(附代码)

无监督学习是一类用于在数据中寻找模式的机器学习技术。无监督学习算法使用的输入数据都是没有标注过的,这意味着数据只给出了输入变量(自变量 X)而没有给出相应的输出变量(因变量)。在无...

技术小能手 ⋅ 06/01 ⋅ 0

[Python人工智能] 三.theano实现分类神经网络及机器学习基础

从本篇文章开始,作者正式开始研究Python深度学习、神经网络及人工智能相关知识。前两篇文章讲解了神经网络基础概念、Theano库的安装过程及基础用法、theano实现回归神经网络,这篇文章主要讲...

eastmount ⋅ 05/24 ⋅ 0

Python | K近邻实现(KNN)

01 KNN可以做点什么呢? 在李航的《统计学习方法》中,详细讲解了一中分类算法:K近邻(K Nearest Neighbor),具体的算法过程和关键点可以参考这篇文章: 统计学习方法 | k近邻法 算法的理论基...

邓莎 ⋅ 06/04 ⋅ 0

实验楼21期--机器学习--信用卡持卡人风险预测

参加实验楼的楼赛21期,关于机器学习的, 我以前没怎么接触过,所以是临时在网上查找资料解答的. 如果有一些错误或者是不完善的地方,欢迎指出. 题目 介绍 题目提供一个来自某银行的真实数据集,...

mbinary ⋅ 05/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA入门,配置文件的设置

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http......

码农屌丝 ⋅ 23分钟前 ⋅ 0

Java基础——面向对象和构造器

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 静态成员介绍 为什么要有静态成员?静态成员用来...

凯哥学堂 ⋅ 25分钟前 ⋅ 0

vmware中Centos 7 linux的LVM磁盘扩容

系统是RHEL7(centos7差不多一样) 关闭系统,在vmware、设置、硬盘、扩展、输入数字大于当前系统内存、点击扩展。 开机再查看磁盘信息 fdisk -l 注意:可以看出sda磁盘增加了,但是根目录还...

gugudu ⋅ 36分钟前 ⋅ 0

JAVA线程sleep和wait方法区别

昨天面试,突然被问到sleep 和 wait的区别,一下子有点蒙,在这里记一下,以示警戒。 首先说sleep,sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过去后,cpu...

徐玉强 ⋅ 37分钟前 ⋅ 0

vuex学习--模块

随着项目复杂性增加,共享状态也越来越多。需要对转态操作进行分组,分组后在进行分组编写。学习一下module:状态管理器的模块组操作。 首先是声明: const moduleA={ state,mutations,g...

大美琴 ⋅ 40分钟前 ⋅ 0

Selenium 简单入门

安装 pip install selenium 驱动下载 https://chromedriver.storage.googleapis.com/index.html 下载最新的驱动,放入path中,可以放入Python的scripts目录下,也可以放入Chrome安装目录,并...

阿豪boy ⋅ 41分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 今天 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部