您当前的位置:首页 > 互联网百科 > 大数据

特征工程之处理时间序列数据

时间:2020-09-07 11:15:23  来源:  作者:
特征工程之处理时间序列数据

 

维基百科对于特征工程的定义是:利用相关领域知识,通过数据挖掘技术从原始数据中提取特征的过程。这些特征可以用来提高机器学习算法的性能。

不过,特征工程不一定非得很花哨。特征工程的一个简单但普遍的处理对象是时间序列数据。特征工程在这个领域的重要性是因为(原始)时间序列数据通常只包含一个表示时间属性的列,即日期时间(或时间戳)。

对于日期时间数据,特征工程可以看作是从独立的(不同的)特征数据中提取有用的信息。例如,从"2020–07–01 10:21:05"这日期时间数据中,我们可能需要从中提取以下特征:

1. 月份:7

1. 本月第几日:1

1. 周几:周三(通过2020-07-01判断得到)

1. 时刻:10:21:05

从日期时间数据中提取这类特征正是本文的目标。之后,我们将结合我们的工程实际中的特征数据,将其作为预测因子,并且建立一个gradient boosting 回归预测模型。具体来说,我们将预测地铁州际交通量。

本文目录

本文主要包含以下内容:

详细阐述如何从时间日期数据中提取以下特征数据:

1. 月份

1. 时间数据处于每月第几日

1. 周几

1. 时间

1. 时段分类(早上、下午等)

1. 周末标记(如果是周末则添加标记1,否则添加标记0)

如何将上述特种数据用于搭建Gradient Boosting 回归模型,并且实现对于地铁州际交通量的预测

数据情况

在本文中,我们使用地铁州际交通量数据集,它可以在UCI机器学习库(archive.ics.uci.edu/ml/datasets/Metro+Interstate+Traffic+Volume)中找到。该数据集是明尼苏达州圣保罗州明尼阿波利斯市I-94的每小时交通量,其中包括2012-2018年的天气和假日数据。这48204行数据包含以下属性:

1. holiday:类型数据,包含美国国家法定假日、区域假日、明尼苏达州博览会等

1. temp:数值型数据,平均温度(开尔文)

1. rain_1h:数值型数据,每小时降雨(毫米)

1. snow_1h:数值型数据,每小时降雪(毫米)

1. clouds_all:数值型数据,云层情况(百分比)

1. weather_main:类型数据,当前天气的分类描述(简要)

1. weather_description:类型数据,当前天气的分类描述(详细)

1. data_time:时间序列数据

1. traffic_volume:数值型数据,每小时I-94 ATR 301记录的西行交通量(本文预测目标)

接下来,我们首先载入数据:

# import libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# load the dataraw = pd.read_csv('Metro_Interstate_Traffic_Volume.csv')
# display first five rowsraw.head()# display details for each column
raw.info()
特征工程之处理时间序列数据

 

 

raw.head()
特征工程之处理时间序列数据

 

 

raw.info()

查看info信息,我们发现data_time这一类目是object类型,所以我们需要将其转化为datetime类型:

# convert date_time column to datetime type
raw.date_time = pd.to_datetime(raw.date_time)

特征工程

从上面的info方法的输出中,我们知道除了date_time列之外还有其他的分类特征。但是由于本文的主要主题是处理时间序列数据,我们将重点关注针对date_time的特性工程。

Month

Pandas自身有许多易于使用的方法来处理datetime类型的数据。要提取时间/日期信息,我们只需调用pd.Series.dt。pd.Series.dt.month是提取month信息所需的函数。这将产生一系列int64格式的月份数字(例如1代表1月,10代表10月)。

# extract month feature
months = raw.date_time.dt.month

Day of month

和Month类似,我们只需要调用pd.Series.dt.day函数。以2012-10-27 09:00:00为例,调用该函数提取结果为27。

# extract day of month feature
day_of_months = raw.date_time.dt.day

Hour

类似地,pd.Series.dt.hour将生产对应的小时信息数据(范围为0-23的整数)。

# extract hour feature
hours = raw.date_time.dt.hour

Day name

获取Day name的方式和上面几个数据有所不同。我们想要确定raw.date_time序列中关于星期几的信息,需要以下两个步骤。首先,通过pd.Series.dt.day_name()生成day name序列。然后,我们需要通过pd.get_dummies()进行独热编码(one-hot encode)。

# first: extract the day name literal
to_one_hot = raw.date_time.dt.day_name()
# second: one hot encode to 7 columns
days = pd.get_dummies(to_one_hot)
#display data
days
特征工程之处理时间序列数据

 

独热编码后的Day name信息

Daypart

在本部分中,我们将基于Hour数据创建一个分组。我们希望有六个小组代表每一天的各个部分。它们是黎明(02.00-05.59)、上午(06.00-09.59)、中午(10.00-13.59)、下午(14.00-17.59)、晚上(18.00-21.59)和午夜(22.00-次日01.59)。

为此,我们创建了一个标识函数,稍后将使用该函数来作为数据系列的Apply方法。然后,我们对得到的dayparts执行一个热编码。

# daypart function
def daypart(hour):    if hour in [2,3,4,5]:
        return "dawn"
    elif hour in [6,7,8,9]:
        return "morning"
    elif hour in [10,11,12,13]:
        return "noon"
    elif hour in [14,15,16,17]:
        return "afternoon"
    elif hour in [18,19,20,21]:
        return "evening"
    else: return "midnight"
# utilize it along with apply methodraw_dayparts = hours.apply(daypart)# one hot encodingdayparts = pd.get_dummies(raw_dayparts)# re-arrange columns for convenience
dayparts = dayparts[['dawn','morning','noon','afternoon','evening','midnight']]
#display datadayparts
特征工程之处理时间序列数据

 

独热编码后的Day parts信息

Weekend flag

我们从date_time时间序列数据中提取的最后一个特征是is_weekend。这一特征指示给定的日期时间是否在周末(星期六或星期日)。为了实现这一目标,我们将利用pd.Series.dt.day_name()方法以及lambda函数。

# is_weekend flag 
day_names = raw.date_time.dt.day_name()
is_weekend = day_names.apply(lambda x : 1 if x in ['Saturday','Sunday'] else 0)

Holiday flag 以及 weather

幸运的是,这些数据还包含公共假日信息。信息是细粒度的,因为它提到每个公共假日的名称。尽管如此,本文假设对每个假期进行编码并没有显著的好处。因此,让我们创建一个二进制特性来指示对应的日期是否是假日。

# is_holiday flag
is_holiday = raw.holiday.apply(lambda x : 0 if x == "None" else 1)

我们需要考虑的最后一个分类特征是天气。我们只对该特征进行如下独热编码。

# one-hot encode weather
weathers = pd.get_dummies(raw.weather_main)
#display data
weathers
特征工程之处理时间序列数据

 

独热编码后的Weather信息

特征处理后的数据

现在,我们终于有了最终的可用于训练的数据!让我们创建一个名为features的全新数据集,它包含所有的特征,包括数值型特征(我们从原始数据中按原样放置)和类型特征(我们设计的特性)。

# features table
#first step: include features with single column naturefeatures = pd.DataFrame({    'temp' : raw.temp,
    'rain_1h' : raw.rain_1h,
    'snow_1h' : raw.snow_1h,
    'clouds_all' : raw.clouds_all,
    'month' : months,
    'day_of_month' : day_of_months,
    'hour' : hours,
    'is_holiday' : is_holiday,
    'is_weekend' : is_weekend
})#second step: concat with one-hot encode typed features
features = pd.concat([features, days, dayparts, weathers], axis = 1)
# target columntarget = raw.traffic_volume

在我们将数据输入模型之前,我们需要分割数据(训练集和测试集)。请注意,下面我们不随机化我们的数据,这是由于我们的数据具有时间序列特征。

#split data into training and test data
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.1, shuffle = False)

建立回归预测模型

现在我们准备建立我们的模型来预测地铁州际交通量。在这项工作中,我们将使用Gradient Boosting回归模型。

该模型的理论和具体细节超出了本文的讨论范围。但是简单来说,gradient-boosting模型属于集成模型,它使用梯度下降算法来降低弱学习模型(决策树)中的预测损失。

训练模型

让我们在训练数据上实例化模型并训练模型!

from sklearn import datasets, ensemble
# define the model parametersparams = {'n_estimators': 500,
          'max_depth': 4,
          'min_samples_split': 5,
          'learning_rate': 0.01,
          'loss': 'ls'}
# instantiate and train the modelgb_reg = ensemble.GradientBoostingRegressor(**params)gb_reg.fit(X_train, y_train)

评价模型

我们选择两个指标来评价模型:MAPE 和 R2得分。在测试集上使用训练完成的模型进行预测,然后计算这两个指标。

# define MAPE function
def mape(true, predicted):        
    inside_sum = np.abs(predicted - true) / true
    return round(100 * np.sum(inside_sum ) / inside_sum.size,2)
# import r2 score
from sklearn.metrics import r2_score
# evaluate the metricsy_true = y_testy_pred = gb_reg.predict(X_test)#print(f"GB model MSE is {round(mean_squared_error(y_true, y_pred),2)}")
print(f"GB model MAPE is {mape(y_true, y_pred)} %")
print(f"GB model R2 is {round(r2_score(y_true, y_pred)* 100 , 2)} %")
特征工程之处理时间序列数据

 

测试集上的评价指标结果

我们可以看出我们的模型性能相当不错。我们的MAPE低于15%,而R2得分略高于95%。

结果可视化

为了直观理解模型性能,结果可视化很有必要。

由于我们的测试数据(4820个数据点)的长度,我们只绘制了最后100个数据点上的实际值和模型预测值。此外,我们还包括另一个模型(在下面的绘图代码中称为gb_reg_lite),它不包含日期时间特征作为其预测因子(它只包含非日期时间列作为特征,包括temp、weather等)。

fig, ax = plt.subplots(figsize = (12,6))
index_ordered = raw.date_time.astype('str').tolist()[-len(X_test):][-100:]
ax.set_xlabel('Date')
ax.set_ylabel('Traffic Volume') 
# the actual valuesax.plot(index_ordered, y_test[-100:].to_numpy(), color='k', ls='-', label = 'actual')
# predictions of model with engineered featuresax.plot(index_ordered, gb_reg.predict(X_test)[-100:], color='b', ls='--', label = 'predicted; with date-time features')
# predictions of model without engineered featuresax.plot(index_ordered, gb_reg_lite.predict(X_test_lite)[-100:], color='r', ls='--', label = 'predicted; w/o date-time features')
every_nth = 5
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        label.set_visible(False)ax.tick_params(axis='x', labelrotation= 90)
plt.legend()plt.title('Actual vs predicted on the last 100 data points')
plt.draw()
特征工程之处理时间序列数据

 

后100个点的预测结果

该图中蓝色虚线与黑色实线十分接近。也就是说,我们提出的gradient-boosting模型可以很好地预测地铁交通量。

同时,我们看到不使用日期时间特征的模型在性能上出现了差异(红色虚线)。为什么会这样?只是因为我们会依赖交通工具,交通流量在周末趋于减少,但在高峰时段出现高峰。因此,如果我们不对日期时间数据进行特征工程处理,我们将错过这些重要的预测因子!

作者:Pararawendy Indarjo

 

deephub翻译组 OliverLee



Tags:时间序列数据   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
背景这两年互联网行业掀着一股新风,总是听着各种高大上的新名词。大数据、人工智能、物联网、机器学习、商业智能、智能预警啊等等。以前的系统,做数据可视化,信息管理,流程控制...【详细内容】
2020-11-25  Tags: 时间序列数据  点击:(603)  评论:(0)  加入收藏
时间序列数据在许多不同的行业中都非常重要。它在研究、金融行业、制药、社交媒体、网络服务等领域尤为重要。对时间序列数据的分析也变得越来越重要。在分析中有什么比一...【详细内容】
2020-11-20  Tags: 时间序列数据  点击:(68)  评论:(0)  加入收藏
维基百科对于特征工程的定义是:利用相关领域知识,通过数据挖掘技术从原始数据中提取特征的过程。这些特征可以用来提高机器学习算法的性能。不过,特征工程不一定非得很花哨。...【详细内容】
2020-09-07  Tags: 时间序列数据  点击:(120)  评论:(0)  加入收藏
▌简易百科推荐
张欣安科瑞电气股份有限公司 上海嘉定 201801 摘要:随着电力行业各系统接入,海量数据涌现,如何利用电网信息化中大量数据,对客户需求进行判断分析,服务于营销链条,提升企业市场竞...【详细内容】
2021-12-14  安科瑞张欣    Tags:大数据   点击:(9)  评论:(0)  加入收藏
1、什么是数据分析结合分析工具,运用数据分析思维,分析庞杂数据信息,为业务赋能。 2、数据分析师工作的核心流程:(1)界定问题:明确具体问题是什么;●what 发生了什么(是什么)●why 为...【详细内容】
2021-12-01  逆风北极光    Tags:大数据   点击:(25)  评论:(0)  加入收藏
在实际工作中,我们经常需要整理各个业务部门发来的数据。不仅分散,而且数据量大、格式多。单是从不同地方汇总整理这些原始数据就花了大量的时间,更不用说还要把有效的数据收集...【详细内容】
2021-11-30  百数    Tags:数据   点击:(21)  评论:(0)  加入收藏
数据作为新的生产要素,其蕴含的价值日益凸显,而安全问题却愈发突出。密码技术,是实现数据安全最经济、最有效、最可靠的手段,对数据进行加密,并结合有效的密钥保护手段,可在开放环...【详细内容】
2021-11-26  炼石网络    Tags:数据存储   点击:(17)  评论:(0)  加入收藏
导读:网易大数据平台的底层数据查询引擎,选用了Impala作为OLAP查询引擎,不但支撑了网易大数据的交互式查询与自助分析,还为外部客户提供了商业化的产品与服务。今天将为大家分享...【详细内容】
2021-11-26  DataFunTalk    Tags:大数据   点击:(15)  评论:(0)  加入收藏
导读:数据挖掘是一种发现知识的手段。数据挖掘要求数据分析师通过合理的方法,从数据中获取与挖掘项目相关的知识。作者:赵仁乾 田建中 叶本华 常国珍来源:华章科技数据挖掘是一...【详细内容】
2021-11-23  华章科技  今日头条  Tags:数据挖掘   点击:(20)  评论:(0)  加入收藏
今天再给大家分享一个不错的可视化大屏分析平台模板DataColour。 data-colour 可视化分析平台采用前后端分离模式,后端架构设计采用微服务架构模式。 前端技术:Angularjs、Jq...【详细内容】
2021-11-04  web前端进阶    Tags:DashboardClient   点击:(39)  评论:(0)  加入收藏
在Kubernetes已经成了事实上的容器编排标准之下,微服务的部署变得非常容易。但随着微服务规模的扩大,服务治理带来的挑战也会越来越大。在这样的背景下出现了服务可观测性(obs...【详细内容】
2021-11-02  大数据推荐杂谈    Tags:Prometheus   点击:(40)  评论:(0)  加入收藏
同一产品对老客户的要价竟然比新客户要高?这是当下“大数据杀熟”的直接结果。近年来,随着平台经济的蓬勃发展,大数据在为用户服务之外,也引发了多种不合理现象。为了有效遏制“...【详细内容】
2021-10-29    海外网   Tags:大数据   点击:(31)  评论:(0)  加入收藏
本人03年开始从事贸易行业,多年来一直致力于外贸获客和跨境电商选品等领域,最近有些小伙伴反馈海关数据演示的都挺好为啥用起来不是那么回事?大家看到数据时关注的有产品、采购...【详细内容】
2021-10-28  QD云龙    Tags:数据   点击:(33)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条