【机器学习】特征工程:时间特征构造以及时间序列特征构造(含源代码理解)

news2024/11/19 1:54:49

目录:特征工程—时间特征构造以及时间序列特征构造

  • 一、前言
  • 二、特征构造介绍
  • 三、时间特征构造
    • 3.1 连续值时间特征
    • 3.2 离散值时间特征
      • 3.2.1 时间特征拆解
      • 3.2.2 时间特征判断
      • 3.2.3 结合时间维度的聚合特征
  • 四、时间序列特征构造
    • 4.1 时间序列聚合特征
    • 4.2 时间序列历史特征
    • 4.3 时间序列复合特征
      • 4.3.1 趋势特征
      • 4.3.2 窗口差异值特征
      • 4.3.3 自相关性特征
  • 五、总结

一、前言

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。

那特征工程是什么?

特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。

特征工程又包含了 Data PreProcessing(数据预处理)Feature Extraction(特征提取)Feature Selection(特征选择)Feature construction(特征构造)等子问题。

在这里插入图片描述

创造新的特征是一件十分困难的事情,需要丰富的专业知识和大量的时间。机器学习应用的本质基本上就是特征工程。 ——Andrew Ng

二、特征构造介绍

时间特构造以及时间序列特征构造的具体方法:

在这里插入图片描述

三、时间特征构造

对于时间型数据来说,即可以把它转换成连续值,也可以转换成离散值。

3.1 连续值时间特征

  1. 持续时间(单页浏览时长);
  2. 间隔时间;
  3. 上次购买/点击离现在的时长;
  4. 产品上线到现在经过的时长。

3.2 离散值时间特征

3.2.1 时间特征拆解

  • 一天中的第几分钟
  • 星期几
  • 一年中的第几天
  • 一年中的第几个周
  • 一天中哪个时间段:凌晨、早晨、上午、中午、下午、傍晚、晚上、深夜
  • 一年中的哪个季度

程序实现:

import pandas as pd
# 构造时间数据
date_time_str_list = [
    '2019-01-01 01:22:26', '2019-02-02 04:34:52', '2019-03-03 06:16:40',
    '2019-04-04 08:11:38', '2019-05-05 10:52:39', '2019-06-06 12:06:25',
    '2019-07-07 14:05:25', '2019-08-08 16:51:33', '2019-09-09 18:28:28',
    '2019-10-10 20:55:12', '2019-11-11 22:55:12', '2019-12-12 00:55:12',
]
df = pd.DataFrame({'时间': date_time_str_list})
# 把字符串格式的时间转换成Timestamp格式
df['时间'] = df['时间'].apply(lambda x : pd.Timestamp(x))
# 年份
df['年'] = df['时间'].apply(lambda x : x.year)
# 月份
df['月'] = df['时间'].apply(lambda x : x.month)
# 日
df['日'] = df['时间'].apply(lambda x : x.day)
# 小时
df['时'] = df['时间'].apply(lambda x : x.hour)
# 分钟
df['分'] = df['时间'].apply(lambda x : x.minute)
# 秒数
df['秒'] = df['时间'].apply(lambda x : x.second)
# 一天中的第几分钟
df['一天中的第几分钟'] = df['时间'].apply(lambda x : x.minute + x.hour * 60)
# 星期几;
df['星期几'] = df['时间'].apply(lambda x : x.dayofweek)
# 一年中的第几天
df['一年中的第几天'] = df['时间'].apply(lambda x : x.dayofyear)
# 一年中的第几周
df['一年中的第几周'] = df['时间'].apply(lambda x : x.week)
# 一天中哪个时间段:凌晨、早晨、上午、中午、下午、傍晚、晚上、深夜;
period_dict = {
    23: '深夜', 0: '深夜', 1: '深夜',
    2: '凌晨', 3: '凌晨', 4: '凌晨',
    5: '早晨', 6: '早晨', 7: '早晨',
    8: '上午', 9: '上午', 10: '上午', 11: '上午',
    12: '中午', 13: '中午',
    14: '下午', 15: '下午', 16: '下午', 17: '下午',
    18: '傍晚',
    19: '晚上', 20: '晚上', 21: '晚上', 22: '晚上',
}
df['时间段'] = df['时'].map(period_dict)
# 一年中的哪个季度
season_dict = {
    1: '春季', 2: '春季', 3: '春季',
    4: '夏季', 5: '夏季', 6: '夏季',
    7: '秋季', 8: '秋季', 9: '秋季',
    10: '冬季', 11: '冬季', 12: '冬季',
}
df['季节'] = df['月'].map(season_dict)
df

在这里插入图片描述

3.2.2 时间特征判断

  • 是否闰年
  • 是否月初
  • 是否月末
  • 是否季节初
  • 是否季节末
  • 是否年初
  • 是否年尾
  • 是否周末
  • 是否公共假期
  • 是否营业时间
  • 两个时间间隔之间是否包含节假日/特殊日期

程序实现:

import pandas as pd
# 构造时间数据
date_time_str_list = [
    '2010-01-01 01:22:26', '2011-02-03 04:34:52', '2012-03-05 06:16:40',
    '2013-04-07 08:11:38', '2014-05-09 10:52:39', '2015-06-11 12:06:25',
    '2016-07-13 14:05:25', '2017-08-15 16:51:33', '2018-09-17 18:28:28',
    '2019-10-07 20:55:12', '2020-11-23 22:55:12', '2021-12-25 00:55:12',
    '2022-12-27 02:55:12', '2023-12-29 03:55:12', '2024-12-31 05:55:12',
]
df = pd.DataFrame({'时间': date_time_str_list})
# 把字符串格式的时间转换成Timestamp格式
df['时间'] = df['时间'].apply(lambda x: pd.Timestamp(x))

# 是否闰年
df['是否闰年'] = df['时间'].apply(lambda x: x.is_leap_year)

# 是否月初
df['是否月初'] = df['时间'].apply(lambda x: x.is_month_start)

# 是否月末
df['是否月末'] = df['时间'].apply(lambda x: x.is_month_end)

# 是否季节初
df['是否季节初'] = df['时间'].apply(lambda x: x.is_quarter_start)

# 是否季节末
df['是否季节末'] = df['时间'].apply(lambda x: x.is_quarter_end)

# 是否年初
df['是否年初'] = df['时间'].apply(lambda x: x.is_year_start)

# 是否年尾
df['是否年尾'] = df['时间'].apply(lambda x: x.is_year_end)

# 是否周末
df['是否周末'] = df['时间'].apply(lambda x: True if x.dayofweek in [5, 6] else False)

# 是否公共假期
public_vacation_list = [
    '20190101', '20190102', '20190204', '20190205', '20190206',
    '20190207', '20190208', '20190209', '20190210', '20190405',
    '20190406', '20190407', '20190501', '20190502', '20190503',
    '20190504', '20190607', '20190608', '20190609', '20190913',
    '20190914', '20190915', '20191001', '20191002', '20191003',
    '20191004', '20191005', '20191006', '20191007',
] # 此处未罗列所有公共假期
df['日期'] = df['时间'].apply(lambda x: x.strftime('%Y%m%d'))
df['是否公共假期'] = df['日期'].apply(lambda x: True if x in public_vacation_list else False)

# 是否营业时间
df['是否营业时间'] = False
df['小时']=df['时间'].apply(lambda x: x.hour)
df.loc[((df['小时'] >= 8) & (df['小时'] < 22)), '是否营业时间'] = True

df.drop(['日期', '小时'], axis=1, inplace=True)
df

在这里插入图片描述

3.2.3 结合时间维度的聚合特征

具体就是指结合时间维度来进行聚合特征构造。

四、时间序列特征构造

时间序列不仅包含一维时间变量,还有一维其他变量,如股票价格、天气温度、降雨量、订单量等。时间序列分析的主要目的是基于历史数据来预测未来信息。对于时间序列,我们关心的是长期的变动趋势、周期性的变动(如季节性变动)以及不规则的变动。

按固定时间长度把时间序列划分成多个时间窗,然后构造每个时间窗的特征。

4.1 时间序列聚合特征

按固定时间长度把时间序列划分成多个时间窗,然后使用聚合操作构造每个时间窗的特征。

1)平均值

例子:历史销售量平均值、最近N天销售量平均值。

2)最小值

例子:历史销售量最小值、最近N天销售量最小值。

3)最大值

例子:历史销售量最大值、最近N天销售量最大值。

4)扩散值

分布的扩散性,如标准差、平均绝对偏差或四分位差,可以反映测量的整体变化趋势。

5)离散系数值

离散系数是策略数据离散程度的相对统计量,主要用于比较不同样本数据的离散程度。

6)分布性

时间序列测量的边缘分布的高阶特效估计(如偏态系数或峰态系数),或者更进一步对命名分布进行统计测试(如标准或统一性),在某些情况下比较有预测力。

程序实现:洗发水销售数据

import pandas as pd
# 加载洗发水销售数据集
df = pd.read_csv('shampoo-sales.csv')
df.dropna(inplace=True)
df.rename(columns={'Sales of shampoo over a three year period': 'value'}, inplace=True)

# 平均值
mean_v = df['value'].mean()
print('mean: {}'.format(mean_v))

# 最小值
min_v = df['value'].min()
print('min: {}'.format(min_v))

# 最大值
max_v = df['value'].max()
print('max: {}'.format(max_v))

# 扩散值:标准差
std_v = df['value'].std()
print('std: {}'.format(std_v))

# 扩散值:平均绝对偏差
mad_v = df['value'].mad()
print('mad: {}'.format(mad_v))

# 扩散值:四分位差
q1 = df['value'].quantile(q=0.25)
q3 = df['value'].quantile(q=0.75)
irq = q3 - q1
print('q1={}, q3={}, irq={}'.format(q1, q3, irq))

# 离散系数
variation_v = std_v/mean_v
print('variation: {}'.format(variation_v))

# 分布性:偏态系数
skew_v = df['value'].skew()
print('skew: {}'.format(skew_v))
# 分布性:峰态系数
kurt_v = df['value'].kurt()
print('kurt: {}'.format(kurt_v))

# 输出:
mean: 312.59999999999997
min: 119.3
max: 682.0
std: 148.93716412347473
mad: 119.66666666666667
q1=192.45000000000002, q3=411.1, irq=218.65
variation: 0.47644646232717447
skew: 0.8945388528534595
kurt: 0.11622821118738624

4.2 时间序列历史特征

1)前一(或n)个窗口的取值

例子:昨天、前天和3天前的销售量。

2)周期性时间序列前一(或n)周期的前一(或n)个窗口的取值

例子:写字楼楼下的快餐店的销售量一般具有周期性,周期长度为7天,7天前和14天前的销售量。

程序实现:洗发水销售数据

import pandas as pd
# 加载洗发水销售数据集
df = pd.read_csv('shampoo-sales.csv')
df.dropna(inplace=True)
df.rename(columns={'Sales of shampoo over a three year period': 'value'}, inplace=True)


df['-1day'] = df['value'].shift(1)
df['-2day'] = df['value'].shift(2)
df['-3day'] = df['value'].shift(3)

df['-1period'] = df['value'].shift(1*12)
df['-2period'] = df['value'].shift(2*12)

display(df.head(60))

在这里插入图片描述

4.3 时间序列复合特征

4.3.1 趋势特征

趋势特征可以刻画时间序列的变化趋势。

例子:每个用户每天对某个Item行为次数的时间序列中,User一天对Item的行为次数/User三天对Item的行为次数的均值,表示短期User对Item的热度趋势,大于1表示活跃逐渐在提高;三天User对Item的行为次数的均值/七天User对Item的行为次数的均值表示中期User对Item的活跃度的变化情况;七天User对Item的行为次数的均值/ 两周User对Item的行为次数的均值表示“长期”(相对)User对Item的活跃度的变化情况。

程序实现:

import pandas as pd
# 加载洗发水销售数据集
df = pd.read_csv('shampoo-sales.csv')
df.dropna(inplace=True)
df.rename(columns={'Sales of shampoo over a three year period': 'value'}, inplace=True)

df['last 3 day mean'] = (df['value'].shift(1) + df['value'].shift(2) + df['value'].shift(3))/3
df['最近3天趋势'] = df['value'].shift(1)/df['last 3 day mean']
display(df.head(60))

在这里插入图片描述

4.3.2 窗口差异值特征

一个窗口到下一个窗口的差异。例子:商店销售量时间序列中,昨天的销售量与前天销售量的差值。

程序实现:

import pandas as pd
# 加载洗发水销售数据集
df = pd.read_csv('shampoo-sales.csv')
df.dropna(inplace=True)
df.rename(columns={'Sales of shampoo over a three year period': 'value'}, inplace=True)

df['最近两月销量差异值'] = df['value'].shift(1) - df['value'].shift(2)
display(df.head(60))

在这里插入图片描述

4.3.3 自相关性特征

原时间序列与自身左移一个时间空格(没有重叠的部分被移除)的时间序列相关联。

程序实现:

import statsmodels.tsa.api as smt
import pandas as pd
# 加载洗发水销售数据集
df = pd.read_csv('shampoo-sales.csv')
df.dropna(inplace=True)
df.rename(columns={'Sales of shampoo over a three year period': 'value'}, inplace=True)

print('滞后数为1的自相关系数:{}'.format(df['value'].autocorr(1)))
print('滞后数为2的自相关系数:{}'.format(df['value'].autocorr(2)))
# 输出:
滞后数为1的自相关系数:0.7194822398024308
滞后数为2的自相关系数:0.8507433352850972

除了上面描述的特征外,时间序列还有历史波动率、瞬间波动率、隐含波动率、偏度、峰度、瞬时相关性等特征。

五、总结

1)从时间变量提取出来的特征

  • 如果每条数据为一条训练样本,时间变量提取出来的特征可以直接作为训练样本的特征使用。

例子:用户注册时间变量。对于每个用户来说只有一条记录,提取出来的特征可以直接作为训练样本的特征使用,不需要进行二次加工。

  • 如果每条数据不是一条训练样本,时间变量提取出来的特征需要进行二次加工(聚合操作)才能作为训练样本的特征使用。

例子:用户交易流水数据中的交易时间。由于每个用户的交易流水数量不一样,从而导致交易时间提取出来的特征的数据不一致,所以这些特征不能直接作为训练样本的特征来使用。我们需要进一步进行聚合操作才能使用,如先从交易时间提取出交易小时数,然后再统计每个用户在每个小时(1-24小时)的交易次数来作为最终输出的特征。

2)对时间变量进行条件过滤,然后再对其他变量进行聚合操作所产生的特征

主要是针对类似交易流水这样的数据,从用户角度进行建模时,每个用户都有不定数量的数据,因此需要对数据进行聚合操作来为每个用户构造训练特征。而包含时间的数据,可以先使用时间进行条件过滤,过滤后再构造聚合特征。

3)时间序列数据可以从带有时间的流水数据统计得到,实际应用中可以分别从带有时间的流水数据以及时间序列数据中构造特征,这些特征可以同时作为模型输入特征。

例如:美团的商家销售量预测中,每个商家的交易流水经过加工后可以得到每个商家每天的销售量,这个就是时间序列数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PoolFormer实战:使用PoolFormer实现图像分类任务(一)

摘要 论文&#xff1a;https://arxiv.org/abs/2111.11418 论文翻译&#xff1a;https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/128281326 官方源码&#xff1a;https://github.com/sail-sg/poolformer 模型代码解析&#xff1a;https://blog.csdn.net/hhhhhhhh…

超店有数给新手Tik Tok选品的三个建议

给新手Tik Tok选品的三个建议 1)避开饱和的红海类目 比如食品类、美妆个护类的产品&#xff0c;因为竞争过于激烈&#xff0c;一般都是有经验的大卖家操作运营&#xff0c;因为他们会有稳定的供应链、以及足够的成本去支撑&#xff0c;短期盈利比较难&#xff0c;也就是为什么…

企业电子招投标采购系统源码之登录页面

信息数智化招采系统 服务框架&#xff1a;Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构&#xff1a;VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术&#xff1a;Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、Stre…

(八)大白话MySQL通过配置多个Buffer Pool来优化数据库的并发性能

文章目录1、多线程在访问Buffer Pool的时候需要加锁吗&#xff1f;2、多线程并发访问会加锁&#xff0c;数据库的性能还能好吗&#xff1f;3、MySQL的生产优化经验&#xff1a;多个Buffer Pool优化并发能力100、创作不易&#xff0c;更多章节&#xff0c;请扫码关注&#xff0c…

学而不固,择善固之-杰克教诲

学而不固,择善固之 我也是第一次知道这个词&#xff0c;是受“杰克”大佬教诲。2022-12-30 解释一 学习有时候不是为了马上用起来&#xff0c;有时候只是让我们不再固执&#xff0c;通过学习知道原来世界上还有这么一说&#xff0c;对很多事情保有好奇心。 不持成见地学习&…

spring中为什么要三级缓存?二级不行吗

这是我看过视频中最能解释的文字表达了 先说bean的创建过程&#xff1a;实例化->依赖注入->初始化 实例化之后会提前暴露到缓存&#xff0c;用于解决循环依赖问题。 以下的解释保证你能看懂&#xff1a; 为什么需要一级缓存ioc容器 总得有个地方放那些单例吧 为什么需…

【决策树】简单介绍+个人理解(一)

∙\bullet∙ 分类模型中除了贝叶斯决策规则&#xff0c;SVM&#xff0c;最近邻分类器&#xff0c;还有决策树 ∙\bullet∙ 决策树就是选一个属性&#xff0c;根据属性的不同取值&#xff0c;将样本划分为不同的类&#xff0c;不断重复下去&#xff0c;直到终止。在叶子节点处&a…

支持图文公式混排的题库软件,Word试卷直接入库

试卷电子化的难题是入库难&#xff0c;只有试卷入库&#xff0c;才能做到后续的监督&#xff0c;复习&#xff0c;错题本等功能。 目前题库软件众多&#xff0c;但大多数题库软件仅支持纯文本题库&#xff0c;而很多试卷都是包括公式&#xff0c;图形&#xff0c;排版复杂。 …

中国外文局文化传播中心借力vLive虚拟直播,打造国际汉文化云讲堂

文明因多样而交流&#xff0c;因交流而互鉴&#xff0c;因互鉴而发展。 近日&#xff0c;中国外文局文化传播中心组织的“中华文化国际传播云讲堂”活动成功举办&#xff0c;本次云讲堂以“世界汉学家看中国文化”为主题&#xff0c;邀请世界汉学家共同探讨汉文化&#xff0c;…

【Git】一文带你入门Git分布式版本控制系统(创建合并分支、解决冲突)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

Kyligence 客户浦发银行、招商银行荣获金融业科技赋能业务创新突出贡献奖

近日&#xff0c;由《金融电子化》杂志社主办的“2022中国金融科技年会暨第十三届金融科技应用创新奖颁奖典礼”成功举办。Kyligence 服务客户上海浦东发展银行股份公司&#xff08;以下简称浦发银行&#xff09;项目「客户旅程万花筒」、招商银行股份有限公司&#xff08;以下…

户外运动如何安全享受音乐、专业户外运动耳机推荐

想采摘成熟的柿子、苹果、冰糕或栗子吗&#xff1f;出去运动吧在这个不冷不热的金秋季节里&#xff0c;大自然的一切都在等着我们出户外去探险&#xff0c;要说今年的哪一个户外运动最引人注目&#xff0c;露营和登山总是不相上下&#xff0c;但是运动怎么能少了音乐的陪伴呢&a…

智慧楼宇数字孪生应用方案

智慧楼宇也称智能建筑、智能楼宇&#xff0c;是将建筑、物联网感知和控制及结构、系统、管理和服务等各方面的先进科技相互交融结合&#xff0c;是现代化新型建筑发展的必经阶段。通过数字孪生技术&#xff0c;可将楼宇设备之间、系统之间融合数据互通&#xff0c;为组成智慧楼…

PyTorch学习笔记 7.TextCNN文本分类

PyTorch学习笔记 7.TextCNN文本分类一、模型结构二、文本分词与编码1. 分词与编码器2. 数据加载器二、模型定义1. 卷积层2. 池化层3. 全连接层三、训练过程四、测试过程五、预测过程一、模型结构 2014年&#xff0c;Yoon Kim针对CNN的输入层做了一些变形&#xff0c;提出了文本…

Redis事件循环

Redis事件循环文件事件时间事件事件调度和执行客户端部分关于客户端输出缓冲区限制ServerCron周期函数服务器启动流程小结Redis服务器是一个事件驱动程序, 主要处理两类事件: 文件事件 (File Event) : 对套接字操作的抽象&#xff0c;服务器与客户端的通信过程会产生相应的文件…

Java 中的继承和多态

面向对象的三大特性&#xff1a;封装、继承、多态。在这三个特性中&#xff0c;如果没有封装和继承&#xff0c;也不会有多态。 那么多态实现的途径和必要条件是什么呢&#xff1f;以及多态中的重写和重载在JVM中的表现是怎么样&#xff1f;在Java中是如何展现继承的特性呢&am…

常用密码算法介绍

算法种类 根据技术特征&#xff0c;现代密码学可分为三类&#xff1a; 对称算法 说明&#xff1a;加密密钥和解密密钥相同&#xff0c;对明文、密文长度没有限制 子算法&#xff1a; 流密码算法&#xff1a;每次加密或解密一位或一字节的明文或密文 分组密码算法&#xff…

LiveGBS流媒体平台国标GB/T28181功能-国标流媒体服务平台作为上级接入海康大华华为宇视等下级平台及摄像头

LiveGBS国标流媒体服务平台作为上级接入海康大华华为宇视等下级平台及摄像头1、背景说明2、部署国标平台2.1、安装使用说明2.2、服务器网络环境2.3、信令服务配置3、监控摄像头设备接入3.1、海康GB28181接入示例3.2、大华GB28181接入示例3.3、华为IPC GB28181接入示例4、硬件NV…

mysql 存储过程实现从一张表数据迁移到另一种表

通过存储过程迁移数据&#xff1a; 创建表 CREATE TABLE test1 ( idp varchar(255) DEFAULT NULL, brandIdp varchar(255) DEFAULT NULL, namep varchar(1000) DEFAULT NULL, urlp varchar(1000) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETkeybcs2; INSERT INTO t…

2023美国大学生数学建模竞赛(MCM/ICM)报名流程指南

数模乐园作为国内美赛报名最大官方平台&#xff0c;为参加美赛的同学解决国际支付报名难的问题&#xff0c;为同学们省去大部分繁琐流程的同时还附赠纸质证书打印邮寄、美赛赛题解析、美赛专属礼包、赛题翻译等备赛资料 数模乐园已累计为10万同学完成了美赛辅助报名&#xff0…