最近在做时间序列的项目,所以总结一下构造的特征的方法和一些经验。

先放上大纲:

1.时间特征

1.1 连续时间

  • 持续时间:

    • 浏览时长;

  • 间隔时间:

    • 购买/点击距今时长;

    • 距离假期的前后时长(节假日前和节假日后可能会出现明显的数据波动);

1.2 离散时间

  • 年、季度、季节、月、星期、日、时 等;

    • 基本特征,如果用 Xgboost 模型可以进行 one-hot 编码;

    • 如果类别比较多,可以尝试平均数编码(Mean Encoding)。

    • 或者取 cos/sin 将数值的首位衔接起来,比如说 23 点与 0 点很近,星期一和星期天很近。

  • 节假日、节假日第 n 天、节假日前 n 天、节假日后 n 天;

    • 数据可能会随着节假日的持续而发生变化,比如说递减;

    • 节假日前/后可能会出现数据波动;

    • 不放假的人造节日如 5.20、6.18、11.11 等也需要考虑一下;

  • 一天的某个时间段;

    • 上午、中午、下午、傍晚、晚上、深夜、凌晨等;

  • 年初、年末、月初、月末、周内、周末;

    • 基本特征;

  • 高峰时段、是否上班、是否营业、是否双休日;

    • 主要根据业务场景进行挖掘。

# 年、季度、季节、月、星期、日、时
data_df['date'] = pd.to_datetime(data_df['date'], format="%m/%d/%y")
data_df['quarter']=data_df['date'].dt.quarter
data_df['month'] = data_df['date'].dt.month
data_df['day'] = data_df['date'].dt.day
data_df['dayofweek'] = data_df['date'].dt.dayofweek
data_df['weekofyear'] = data_df['date'].dt.week   # 一年中的第几周# Series.dt 下有很多属性,可以去看一下是否有需要的。
data_df['is_year_start'] = data_df['date'].dt.is_year_start
data_df['is_year_end'] = data_df['date'].dt.is_year_end
data_df['is_quarter_start'] = data_df['date'].dt.is_quarter_start
data_df['is_quarter_end'] = data_df['date'].dt.is_quarter_end
data_df['is_month_start'] = data_df['date'].dt.is_month_start
data_df['is_month_end'] = data_df['date'].dt.is_month_end# 是否时一天的高峰时段 8~10
data_df['day_high'] = data_df['hour'].apply(lambda x: 0 if  0 < x < 8  else 1)# 构造时间特征
def get_time_fe(data, col, n, one_hot=False, drop=True):'''data: DataFramecol: column namen: 时间周期'''data[col + '_sin'] = round(np.sin(2*np.pi / n * data[col]), 6)data[col + '_cos'] = round(np.cos(2*np.pi / n * data[col]), 6)if one_hot:ohe = OneHotEncoder()X = OneHotEncoder().fit_transform(data[col].values.reshape(-1, 1)).toarray()df = pd.DataFrame(X, columns=[col + '_' + str(int(i)) for i in range(X.shape[1])])data = pd.concat([data, df], axis=1)if drop:data = data.drop(col, axis=1)return datadata_df = get_time_fe(data_df, 'hour', n=24, one_hot=False, drop=False)
data_df = get_time_fe(data_df, 'day', n=31, one_hot=False, drop=True)
data_df = get_time_fe(data_df, 'dayofweek', n=7, one_hot=True, drop=True)
data_df = get_time_fe(data_df, 'season', n=4, one_hot=True, drop=True)
data_df = get_time_fe(data_df, 'month', n=12, one_hot=True, drop=True)
data_df = get_time_fe(data_df, 'weekofyear', n=53, one_hot=False, drop=True)

2.聚合特征

2.1 统计值

基于历史数据构造长中短期的统计值,包括前 n 天/周期内的:

  • 四分位数;

  • 中位数、平均数、偏差;

  • 偏度、峰度;

    • 挖掘数据的偏离程度和集中程度;

  • 离散系数;

    • 挖掘离散程度

这里可以用自相关系数(autocorrelation)挖掘出周期性。

除了对数据进行统计外,也可以对节假日等进行统计,以刻画历史数据中所含节假日的情况。(还可以统计未来的节假日的情况。)

# 画出自相关性系数图
from pandas.plotting import autocorrelation_plot
autocorrelation_plot(data['value'])# 构造过去 n 天的统计数据
def get_statis_n_days_num(data, col, n):temp = pd.DataFrame()for i in range(n):temp = pd.concat([temp, data[col].shift((i+1)*24)], axis=1)data['avg_'+ str(n) +'_days_' + col] = temp.mean(axis=1)data['median_'+ str(n) +'_days_' + col] = temp.median(axis=1)data['max_'+ str(n) +'_days_' + col] = temp.max(axis=1)data['min_'+ str(n) +'_days_' + col] = temp.min(axis=1)data['std_'+ str(n) +'_days_' + col] = temp.std(axis=1)data['mad_'+ str(n) +'_days_' + col] = temp.mad(axis=1)data['skew_'+ str(n) +'_days_' + col] = temp.skew(axis=1)data['kurt_'+ str(n) +'_days_' + col] = temp.kurt(axis=1)data['q1_'+ str(n) +'_days_' + col] = temp.quantile(q=0.25, axis=1)data['q3_'+ str(n) +'_days_' + col] = temp.quantile(q=0.75, axis=1)data['var_'+ str(n) +'_days_' + col] = data['std_'+ str(n) +'_days_' + col]/data['avg_'+ str(n) +'_days_' + col]  # 离散系数return datadata_df = get_statis_n_days_num(data_df, 'num_events', n=7)
data_df = get_statis_n_days_num(data_df, 'num_events', n=14)
data_df = get_statis_n_days_num(data_df, 'num_events', n=21)
data_df = get_statis_n_days_num(data_df, 'num_events', n=28)

此外,还可以对这些统计值进行分桶,增强模型的鲁棒性。

2.2 同期值

  • 前 n 个周期/天/月/年的同期值;

# n 个星期前同期特征
data_df['ago_7_day_num_events'] = data_df['num_events'].shift(7*24)
data_df['ago_14_day_num_events'] = data_df['num_events'].shift(14*24)
data_df['ago_21_day_num_events'] = data_df['num_events'].shift(21*24)
data_df['ago_28_day_num_events'] = data_df['num_events'].shift(28*24)# 昨天的同期特征
data_df['ago_7_day_num_events'] = data_df['num_events'].shift(1*24)

3.交叉特征

  • 类别特征间组合构成新特征:

    • 笛卡尔积,比如星期和小时:Mon_10(星期一的十点);

  • 类别特征和连续特征:

    • 连续特征分桶后进行笛卡尔积;

    • 基于类别特征进行 groupby 操作,类似聚合特征的构造;

  • 连续特征和连续特征:

    • 同比和环比(一阶差分):反应同期或上一个统计时段的变换大小;

    • 二阶差分:反应变化趋势;

    • 比值;

特征交叉一般从重要特征线下手,慢工出细活。

# 一阶差分
data_df['ago_28_21_day_num_trend'] = data_df['ago_28_day_num_events'] - data_df['ago_21_day_num_events']
data_df['ago_21_14_day_num_trend'] = data_df['ago_21_day_num_events'] - data_df['ago_14_day_num_events']
data_df['ago_14_7_day_num_trend'] = data_df['ago_14_day_num_events'] - data_df['ago_7_day_num_events']
data_df['ago_7_1_day_num_trend'] = data_df['ago_7_day_num_events'] - data_df['ago_1_day_num_events']

4.写在最后

  • 构造时序特征时一定要算好时间窗口,特别是在工作的时候,需要自己去设计训练集和测试集,千万不要出现数据泄露的情况(比如说预测明天的数据时,是拿不到今天的特征的);

  • 针对上面的情况,可以尝试将今天的数据进行补齐;

  • 有些特征加上去效果会变差,大概率是因为过拟合了;

  • 有些特征加上去效果出奇好,第一时间要想到是不是数据泄露了;

  • 拟合不好的时间(比如说双休日)可以分开建模;

  • ont-hot 对 xgboost 效果的提升很显著;

  • 离散化对 xgboost 效果的提升也很显著;

  • 对标签做个平滑效果可能会显著提升;

  • 多做数据分析,多清洗数据;

“干货学习,三连↓

​【特征工程】时序特征挖掘的奇技淫巧相关推荐

  1. 机器学习特征工程之特征缩放+无量纲化:数据标准化(StandardScaler)

    机器学习特征工程之特征缩放+无量纲化:数据标准化(StandardScaler) 在Andrew Ng的机器学习课程里面,讲到使用梯度下降的时候应当进行特征缩放(Feature Scaling).进行 ...

  2. 机器学习特征工程之特征缩放+无量纲化:最小最大缩放(MinMaxScaler)

    机器学习特征工程之特征缩放+无量纲化:最小最大缩放(MinMaxScaler) 在Andrew Ng的机器学习课程里面,讲到使用梯度下降的时候应当进行特征缩放(Feature Scaling).进行缩 ...

  3. 机器学习特征工程之特征缩放+无量纲化:最大绝对值缩放(MaxAbsScaler)

    机器学习特征工程之特征缩放+无量纲化:最大绝对值缩放(MaxAbsScaler) 在Andrew Ng的机器学习课程里面,讲到使用梯度下降的时候应当进行特征缩放(Feature Scaling).进行 ...

  4. ML之FE:数据处理—特征工程之特征三化(标准化【四大数据类型(数值型/类别型/字符串型/时间型)】、归一化、向量化)简介、代码实现、案例应用之详细攻略

    ML之FE:数据处理-特征工程之特征三化(标准化[四大数据类型(数值型/类别型/字符串型/时间型)].归一化.向量化)简介.代码实现.案例应用之详细攻略 目录 真正意义的标准化与归一化 1.标准化/Z ...

  5. ML之FE:利用FE特征工程(单个特征及其与标签关系的可视化)对RentListingInquries(Kaggle竞赛)数据集实现房屋感兴趣程度的多分类预测

    ML之FE:利用FE特征工程(单个特征及其与标签关系的可视化)对RentListingInquries(Kaggle竞赛)数据集实现房屋感兴趣程度的多分类预测 目录 输出结果 设计思路 核心代码 输出 ...

  6. AI基础:特征工程-文本特征处理

    0.导语 特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用. 在此之前,我已经写了以下几篇AI基础的快速入门,本篇文章讲解特征工程基础第三部 ...

  7. AI基础:特征工程-数字特征处理

    0.导语 特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用. 在此之前,我已经写了以下几篇AI基础的快速入门,本篇文章讲解特征工程基础第二部 ...

  8. 【特征工程】特征工程技术与方法

    引言 在之前学习机器学习技术中,很少关注特征工程(Feature Engineering),然而,单纯学习机器学习的算法流程,可能仍然不会使用这些算法,尤其是应用到实际问题的时候,常常不知道怎么提取特 ...

  9. 机器学习项目实战-能源利用率 Part-3(特征工程与特征筛选)

    博主前期相关的博客可见下: 机器学习项目实战-能源利用率 Part-1(数据清洗) 机器学习项目实战-能源利用率 Part-2(探索性数据分析) 这部分进行的特征工程与特征筛选. 三 特征工程与特征筛 ...

  10. 特征工程——文本特征

    目录 文本特征 1.expansion编码 2.consolidation编码 3.文本长度特征 4.标点符号特征 5.词汇属性特征 6.特殊词汇特征 7.词频特征 8.TF-IDF特征 9.LDA特 ...

最新文章

  1. 改变服务器控件的显示属性,2.6.1 设置Style特性和其他属性
  2. float排版c语言,如何解决因float带来的排版问题?
  3. KMP 深度讲解next数组的求解
  4. xampp mysql 卸载_卸载Xampp并安装apache + mysql + php 过程
  5. elasticsearch实现远程索引复制
  6. python乘积函数_龙贝格求积公式(Python实现)
  7. python实现seo疯狂外链发送工具
  8. 如何生成SSH key?
  9. 第十二周项目四:银行系统(一)
  10. 【最大公约数】欧几里得算法
  11. 美颜SDK是什么?美颜SDK和美颜APP有什么区别?
  12. 【知识兔】自学Excel之1:了解Excel 中的基本功能
  13. 基于java线上教学平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  14. K-means聚类以及利用K-means来压缩图像
  15. 国开《国家开放大学学习指南》形考任务1-5
  16. 微信视频号信用分是什么?一起来解读一下吧
  17. 广告公司不会被MCN干掉,但会被打残
  18. 小型数控雕刻机制作Arduino_自己动手DIY一部小型激光雕刻机
  19. uniapp 移动端 两种横竖屏切换方案
  20. 香港:禁止中国内地参与虚拟资产交易!散户不可交易稳定币,放开不意味着放松!

热门文章

  1. how to write Makefile
  2. 记录下,我们平时开发当中不得不知道的HTTP状态码
  3. 最先进的开源游戏引擎KlayGE 3.12.0发布
  4. 秦州:西瓜书 + 南瓜书 吃瓜系列 10. 集成学习(下)
  5. 分享 10 个超实用的 Python 编程技巧
  6. 谁是 2021「IT 圈」年度 C 位?快来报名,彰显你的影响力!
  7. 英特尔第三代 Ice Lake 发布正面与 AMD EPYC PK,结果令人大跌眼镜!
  8. AI视觉大牛朱松纯担任北大AI研究院院长,提出通过构建大任务平台走向通用AI...
  9. 万字长文总结机器学习的模型评估与调参 | 附代码下载
  10. 福利直投!这个活动承包你2020全年技术干货