精华内容
下载资源
问答
  • 特征工程系列:时间特征构造以及时间序列特征构造 原创:JunLiang木东居士 0x00 前言 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。...

    特征工程系列:时间特征构造以及时间序列特征构造

    原创: JunLiang 木东居士  

    0x00 前言

    数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。

    那特征工程是什么?

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

    特征工程又包含了 Data PreProcessing(数据预处理)、Feature Extraction(特征提取)、Feature Selection(特征选择)和 Feature construction(特征构造)等子问题,本章内容主要讨论特征构造的方法。

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

    0x01 特征构造介绍

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

    0x02 时间特征构造

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

    1.连续值时间特征

    • 持续时间(单页浏览时长);

    • 间隔时间;

      • 上次购买/点击离现在的时长;

      • 产品上线到现在经过的时长;

    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)
    

    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)
    

    3.结合时间维度的聚合特征

    具体就是指结合时间维度来进行聚合特征构造,聚合特征构造的具体方法可以参考《聚合特征构造以及转换特征构造》中的《聚合特征构造》章节。

    1)首日聚合特征

    例如:注册首日投资总金额、注册首日页面访问时长、注册首日总点击次数等;

    2)最近时间聚合特征

    例如:最近N天APP登录天数、最近一个月的购买金额、最近购物至今天数等;

    3)区间内的聚合特征

    例如:2018年至2019年的总购买金额、每天下午的平均客流量、在某公司工作期间加班的天数等;

    0x03 时间序列特征构造

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

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

    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
    

    注:

    • 上面是单个时间序列的实现代码,多个时间序列的数据集构造特征时需要先进行分组再计算。如IJCAI-17口碑商家客流量预测比赛中,数据集中包含多个商家的历史销售数据,构造特征时需要先按商家分组,然后再构建特征。

    • 上述代码都是使用所有历史数据来构造特征,实际项目中如果待预测目标为t时刻的值,则使用t时刻之前的值来构造特征,不同的t值都可以分别构造训练样本对应的特征。
      如:使用t时刻的y值作为label,则使用t-1时刻之前的y值来构造特征;使用t-1时刻的y值作为label时,则使用t-2时刻之前的y值来构造特征。如此类推,我们可以得到多个训练样本,每个样本有多个特征。

    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))
    

    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))
    

    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))
    

    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
    

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

    0x0FF 总结

    1.时间特征主要有两大类:

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

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

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

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

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

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

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

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

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

    预告:下一篇文章将介绍空间特征构造以及文本特征构造。

    参考文献

    [1] https://machinelearning-notes.readthedocs.io/zh_CN/latest/feature/%E7%89%B9%E5%BE%81%E5%B7%A5%E7%A8%8B%E2%80%94%E2%80%94%E6%97%B6%E9%97%B4.html
    [2] https://www.cnblogs.com/nxf-rabbit75/p/11141944.html#_nav_12
    [3] https://gplearn.readthedocs.io/en/stable/examples.html#symbolic-classifier
    [4] 利用 gplearn 进行特征工程. https://bigquant.com/community/t/topic/120709
    [5] Practical Lessons from Predicting Clicks on Ads at Facebook. https://pdfs.semanticscholar.org/daf9/ed5dc6c6bad5367d7fd8561527da30e9b8dd.pdf
    [6] Feature Tools:可自动构造机器学习特征的Python库. https://www.jiqizhixin.com/articles/2018-06-21-2
    [7] 各种聚类算法的系统介绍和比较. https://blog.csdn.net/abc200941410128/article/details/78541273

    特征工程系列文章

    特征工程系列:数据清洗

    特征工程系列:特征筛选的原理与实现(上)

    特征工程系列:特征筛选的原理与实现(下)

    特征工程系列:特征预处理(上)

    特征工程系列:特征预处理(下)

    特征工程系列:特征构造之概览篇

    特征工程系列:聚合特征构造以及转换特征构造

    特征工程系列:笛卡尔乘积特征构造以及遗传编程特征构造

    特征工程系列:GBDT特征构造以及聚类特征构造

     

     

    热门文章

    直戳泪点!数据从业者权威嘲讽指南!

    AI研发工程师成长指南

    数据分析师做成了提数工程师,该如何破局?

    算法工程师应该具备哪些工程能力

    数据团队思考:如何优雅地启动一个数据项目!

    数据团队思考:数据驱动业务,比技术更重要的是思维的转变

     


     

    阅读 602

     在看14

    展开全文
  • 时间序列特征工程

    2020-12-29 23:44:37
    时间序列的特征工程大体上分为:基础特征、转换特征、分类特征这三大类,涉及统计分析、机器学习、深度学习等多个领域。这里要注意的是,特征工程技巧是一方面,更重要的是看实际问题背景,不同问题有不同问题适合的...

    关注微信公众号“时序人”获取更好的阅读体验
    在这里插入图片描述

    时间序列知识整理系列

    1. 时间序列统计分析
    2. 时间序列聚类
    3. 时间序列预测
    4. 时间序列回归
    5. 时间序列特征工程
    6. 时间序列补缺
    7. 时间序列异常检测

    前几次的文章分享,我们了解了时间序列分析的基础方法以及预测方法。但在使用这些方法一般都需要我们分析时间序列的特征,对原始时序做一定的处理;再者,挖掘时间序列的特征可以提供可解释的信息,让我们更充分了解时间序列。那么,我们如何进行时间序列的特征工程呢?

    时间序列的特征工程大体上分为:基础特征、转换特征、分类特征这三大类,涉及统计分析、机器学习、深度学习等多个领域。这里要注意的是,特征工程技巧是一方面,更重要的是看实际问题背景,不同问题有不同问题适合的方法,甚至需要为其量身打造提取特征的方法,关键在于如果你先抛开对于算法的依赖而是先自己尝试去分析这个问题,并且可以把自己想到的那些特征用算法实现,那也是一次成功的特征工程过程。

    图 | 时间序列基础特征构造

    时间序列预处理

    在正式讲时间序列特征工程之前,我们先聊一聊时间序列的预处理。一般来说,真实世界的时间序列常常取值范围多样,长短不一,形态各异。如果要做统一的分析,需要我们进行初步的处理,将时间序列整合到统一的范畴下,进行分析。这里基本的方法有:标准化、归一化、定量特征二值化。

    1. 标准化

    标准化是使时间序列中的数值符合平均值为0,标准差为1。具体来说,对于给定的时间序列{x1,x2,...,xt,...,xT}\{x_1, x_2, ..., x_t, ..., x_T\},有如下公式:

    xt^=xtavg({xt}tT)std({xt}tT)\hat{x_t} = \frac{x_t - \sf{avg}(\{x_t\}_t^T)}{\sf{std}(\{x_t\}_t^T)}

    标准化的目标是将原始数据分布转换为标准正态分布,它和整体样本分布有关,每个样本点都能对标准化产生影响。这里,如果只考虑将均值缩放到0,不考虑标准差的话,为数据中心化处理。

    2 归一化

    归一化是把数据变成区间 [0, 1] 或 [-1, 1] 其之间的小数,其主要是为了数据处理方便而提出来的。把数据映射到[0, 1]范围之内进行处理,可以更加便捷快速。具体公式如下:

    xt^=xtmin({xt}tT)max({xt}tT)min({xt}tT)\hat{x_t} = \frac{x_t - \min(\{x_t\}_t^T)}{\max(\{x_t\}_t^T) - \min(\{x_t\}_t^T)}

    归一化是将样本的特征值转换到同一范围(量纲)下,把数据映射到 [0,1] 或者 [-1, 1] 区间内,它仅由变量的极值所决定。这里也可以将源数据减去均值,进行平均归一化:

    xt^=xtavg({xt}tT)max({xt}tT)min({xt}tT)\hat{x_t} = \frac{x_t - \sf{avg}(\{x_t\}_t^T)}{\max(\{x_t\}_t^T) - \min(\{x_t\}_t^T)}

    什么时候用归一化?什么时候用标准化?
    1. 如果对输出结果范围有要求,用归一化。
    2. 如果数据较为稳定,不存在极端的最大最小值,用归一化。
    3. 如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。

    3 定量特征二值化

    如果不需要数据的连续信息,只需要对定量的特征进行“好与坏”的划分,我们可以使用定量特征二值化来剔除冗余信息。举个例子,银行对5名客户的征信进行打分,分别为50,60,70,80,90。现在,我们不在乎一个人的征信多少分,只在乎他的征信好与坏(如大于90为好,低于90就不好);再比如学生成绩,大于60及格,小于60就不及格。这种“好与坏”、“及格与不及格”的关系可以转化为0-1变量,这就是二值化。变化方式如下所示:
    在这里插入图片描述

    自然的,我们也可以设计更多的规则,进行多值化的处理。

    时间序列基础特征

    1. 统计特征

    对时间序列进行统计分析是最容易想到的特征提取方法,这里包括的特征有:

    • 简单特征:均值、标准差、极值、分位数、尖峰个数、缺失个数、偏差等等;
    • 高级特征:自相关性、周期性、趋势(斜率)、频率、随机噪音等等。

    2. 维度特征

    维度特征是提取时间序列在时间维度上的信息,包括:

    • 连续型特征:持续时间(比如:单页面浏览时长)、时间间隔(比如:上次购买、距离现在购买的时间)
    • 离散型特征
      • 小时级特征:哪个时间段(0-24)
      • 天级特征:一周中的星期几、工作日、周末、法定假日
      • 星期级特征:一个月中的第几个星期、一年中哪个星期
      • 月份级的特征:第几个月份

    3. 窗口特征

    将时间序列在时间轴上划分窗口是一个常用且有效的方法,包括滑动窗口(根据指定的单位长度来框住时间序列,每次滑动一个单位),与滚动窗口(根据指定的单位长度来框住时间序列,每次滑动窗口长度的多个单位)。窗口分析对平滑噪声或粗糙的数据非常有用,比如移动平均法等,这种方式结合基础的统计方法,即按照时间的顺序对每一个时间段的数据进行统计,从而可以得到每个时间段内目标所体现的特征,进而从连续的时间片段中,通过对同一特征在不同时间维度下的分析,得到数据整体的变化趋势。
    图 | 时间序列滑动窗口

    时间序列转换特征

    我们对时序数据进行分析的时候,常常会发现数据中存在一些问题,使得不能满足一些分析方法的要求(比如:正态分布、平稳性等),其常常需要我们使用一些变换方法对数据进行转换;另一方面,人工的特征分析方法局限于人的观察经验,许多高维且隐秘的特征单单靠人力难以发现。因此,许多工作尝试对时序数据进行转换,从而捕捉更多的特征。

    统计转换特征

    1964年提出的Box-Cox变换可以使得线性回归模型满足线性性独立性方差齐次性正态性的同时又不丢失信息,其变换的目标有两个:一个是变换后,可以一定程度上减小不可观测的误差和预测变量的相关性。主要操作是使得变换后的因变量于回归自变量具有线性相依关系,误差也服从正态分布,误差各分量是等方差且相互独立。第二个是用这个变换来使得因变量获得一些性质,比如在时间序列分析中的平稳性,或者使得因变量分布为正态分布。

    在做线性回归的过程中,一般线性模型假定的前提是

    Y=Xβ+ε,εN(0,σ2I)Y = X * \beta + \varepsilon, \varepsilon \sim N(0, \sigma^2 I)

    • 线性性:E(Y)E(Y)是X中各变量的线性函数
    • 独立性:ε1,ε2,...,εn\varepsilon_1, \varepsilon_2, ..., \varepsilon_n之间互相独立
    • 方差齐次性:D(ε1)=D(ε2)=...=D(εn)=σ2D(\varepsilon_1) = D(\varepsilon_2) = ... = D(\varepsilon_n) = \sigma^2
    • 正态性:ε1,ε2,...,εn\varepsilon_1, \varepsilon_2, ..., \varepsilon_n服从正态分布

    通过各种数据转函数将非正态分布的数据转换为正态分布,例如原始值为xix_i,转换后为yiy_i,常用的几种转换方式为:

    • 对数转换:yi=ln(xi)y_i = ln(x_i)
    • 平方根转换:yi=(xi)y_i = \sqrt{(x_i)}
    • 倒数转换:yi=1xiy_i = \frac{1}{x_i}
    • 平方根后取倒数:yi=1(xi)y_i = \frac{1}{\sqrt{(x_i)}}
    • 平方根后再取反正弦:yi=arcsin((xI))y_i = arcsin(\sqrt{(x_I)})
    • 幂转换:yi=xiλ1x^λ+1y_i = \frac{x_{i}^{\lambda} - 1}{\hat{x}^{\lambda+1}},其中x^=(i=1nxi)1/n\hat{x} = (\prod_{i=1}^{n}x_i)^{1/n},其中参数λ[1.5,1]\lambda \in [-1.5, 1]

    高维空间转换特征

    高维空间转换特征直白点说就是把一维的时序转化到高维。这个高维可能是二维(例如图片),或者更高维(例如相空间重构)。这种转换可以使得时序的信息被放大,从而暴露更多的隐藏信息。同时,这种方法增加了数据分析的计算量,一般不适用于大规模的时序分析。

    格拉姆角场(GAF)
    该转化在笛卡尔坐标系下,将一维时间序列转化为极坐标系表示,再使用三角函数生成GAF矩阵。
    计算过程:

    • 数值缩放:将笛卡尔坐标系下的时间序列缩放到[0,1]或[-1,1]区间
    • 极坐标转换:使用坐标变换公式,将笛卡尔坐标系序列转化为极坐标系时间序列
    • 角度和/差的三角函数变换:若使用两角和的cos函数则得到GASF,若使用两角差的cos函数则得到GADF
      在这里插入图片描述

    马尔科夫随机场(MRF)
    MRF的基本思想是将时间序列的值状态化,然后计算时序的转化概率,其构建的是一个概率图(Graph),一种无向图的生成模型,主要用于定义概率分布函数。

    这里用到了时序窗口分析方法先构建随机场。随机场是由若干个位置组成的整体,当给每一个位置中按照某种分布随机赋予一个值之后,其全体就叫做随机场。举个例子,假如时序划分片段,所有的片段聚成若干的状态,将时序映射回这些状态上,我们便得到了一个随机场。有关这个例子可以参考文章《AAAI 2020 | 时序转化为图用于可解释可推理的异常检测》

    在这里插入图片描述

    马尔科夫随机场是随机场的特例,它假设随机场中某一个位置的赋值仅仅与和它相邻的位置的赋值有关,与其不相邻的位置的赋值无关。例如时序片段XtX_tXt1X_{t-1}有关,与Xt2X_{t-2}没有关系。

    构建马尔科夫随机场,可以更清晰的展现时序分布的转化过程,捕捉更精确的分布变化信息。

    时频分析
    时频分析是一类标准方法,常用在通信领域信号分析中,包括傅里叶变换,短时傅里叶变换,小波变换等,逐步拟合更泛化的时间序列。

    在这里插入图片描述

    傅里叶变换是一种线性的积分变换,常在将信号在时域(或空域)和频域之间变换时使用。其主要处理平稳的时间序列。当时序数据非平稳时,一般的傅里叶变换便不再适用,这里便有了短时傅里叶变换方法,其主要通过窗口分析,把整个时域过程分解成无数个等长的小过程,每个小过程近似平稳,再傅里叶变换,就知道在哪个时间点上出现了什么频率。然而,我们无法保证所有等长的窗口都是平稳的,手动调整窗口的宽窄成本大,耗费人力。小波分解尝试解决这个问题,其直接把傅里叶变换的基给换了——将无限长的三角函数基换成了有限长的会衰减的小波基。这样不仅能够获取频率,还可以定位到时间。

    降维转换特征

    与高维空间转换特征相反,提取时间序列的降维特征常出现在多维时间序列分析方面,其主要是更快捕捉复杂时间序列中的主要特征,提高分析效率与速度,包括主成分分析(PCA),tSNE,张量分解等等,可以帮助我们从相关因素的角度来理解时间序列。

    主成分分析是一种分析、简化数据集的技术。其通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但这也不是一定的,要视具体应用而定。

    张量分解从本质上来说是矩阵分解的高阶泛化,常出现在推荐系统中。在实际应用中,特征张量往往是一个稀疏矩阵,即很多位置上的元素是空缺的,或者说根本不存在。举个例子,如果有10000个用户,同时存在10000部电影,我们以此构造一个用户评分行为的张量,这里不经想问:难道每个用户都要把每部电影都看一遍才知道用户的偏好吗?其实不是,我们只需要知道每个用户仅有的一些评分就可以利用矩阵分解来估计用户的偏好,并最终推荐用户可能喜欢的电影。

    在这里插入图片描述

    基于神经网络的“特征工程”

    最后一种转换特征便是通过神经网络的方式自抽取特征表达。这种方式通常特征的解释性差,但效果很好。一般来说,训练好的网络中间层输出可以被当做特征,例如自编码器模型“Encoder-Decoder”,如果输入输出是时间序列的话,Encoder的输出可以当做一个输入被“压缩”的向量,那么当网络效果得还不错的时候,可以简单看做这个向量具备了这个时序的特征。

    在这里插入图片描述

    分类特征

    分类特征一般结合具体的任务,比如时序预测,时序分类等,常常有标签(Label)信息来引导,其分析的特征也为具体的任务所服务,是一类常用的特征分析方法,一般通过机器学习中的有监督方式进行抽取。

    字典特征 (BoP)
    字典方法旨在将时间序列通过变换,找到划分的阈值,进而将每个时序实值划分开,对应到某个字母表中。其通过滑动窗提取不同“单词”的出现频率,作为分类依据。这种方法的优势在于速度很快,而且抗噪效果好,缺点在于会损失很多有效的时序信息,只能进行粗粒度的时序分类分析。

    在这里插入图片描述

    形态特征(Shapelet)
    形态方法旨在捕捉时间序列分类任务中作为分类依据的有代表性的子序列形状,2012年提出的Shapelet方法就是搜索这些候选的子序列形状以找到分类的依据,因为在真实世界中的时间序列往往存在有特征明显的形状,例如心电图数据一次正常心跳简化一下就是前后两个小的峰中间加一个高峰,那么如果其中缺了一块形状的话,可能就是作为鉴别异常心跳的依据。

    在这里插入图片描述


    更多原创内容与系列分享,欢迎关注微信公众号“时序人”获取。
    在这里插入图片描述

    展开全文
  • 0x00 前言数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。那特...

    0x00 前言

    数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。

    那特征工程是什么?

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

    特征工程又包含了 Data PreProcessing(数据预处理)、Feature Extraction(特征提取)、Feature Selection(特征选择)和 Feature construction(特征构造)等子问题,本章内容主要讨论特征构造的方法。

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

    0x01 特征构造介绍

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

    0x02 时间特征构造

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

    1.连续值时间特征

    • 持续时间(单页浏览时长);

    • 间隔时间;

      • 上次购买/点击离现在的时长;

      • 产品上线到现在经过的时长;

    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)

    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)

    3.结合时间维度的聚合特征

    具体就是指结合时间维度来进行聚合特征构造,聚合特征构造的具体方法可以参考《聚合特征构造以及转换特征构造》中的《聚合特征构造》章节。

    1)首日聚合特征

    例如:注册首日投资总金额、注册首日页面访问时长、注册首日总点击次数等;

    2)最近时间聚合特征

    例如:最近N天APP登录天数、最近一个月的购买金额、最近购物至今天数等;

    3)区间内的聚合特征

    例如:2018年至2019年的总购买金额、每天下午的平均客流量、在某公司工作期间加班的天数等;

    0x03 时间序列特征构造

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

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

    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

    注:

    • 上面是单个时间序列的实现代码,多个时间序列的数据集构造特征时需要先进行分组再计算。如IJCAI-17口碑商家客流量预测比赛中,数据集中包含多个商家的历史销售数据,构造特征时需要先按商家分组,然后再构建特征。

    • 上述代码都是使用所有历史数据来构造特征,实际项目中如果待预测目标为t时刻的值,则使用t时刻之前的值来构造特征,不同的t值都可以分别构造训练样本对应的特征。
      如:使用t时刻的y值作为label,则使用t-1时刻之前的y值来构造特征;使用t-1时刻的y值作为label时,则使用t-2时刻之前的y值来构造特征。如此类推,我们可以得到多个训练样本,每个样本有多个特征。

    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))

    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))

    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))

    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

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

    0x0FF 总结

    1.时间特征主要有两大类:

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

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

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

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

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

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

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

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

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

    参考文献

    [1] https://machinelearning-notes.readthedocs.io/zh_CN/latest/feature/%E7%89%B9%E5%BE%81%E5%B7%A5%E7%A8%8B%E2%80%94%E2%80%94%E6%97%B6%E9%97%B4.html
    [2] https://www.cnblogs.com/nxf-rabbit75/p/11141944.html#_nav_12
    [3] https://gplearn.readthedocs.io/en/stable/examples.html#symbolic-classifier
    [4] 利用 gplearn 进行特征工程. https://bigquant.com/community/t/topic/120709
    [5] Practical Lessons from Predicting Clicks on Ads at Facebook. https://pdfs.semanticscholar.org/daf9/ed5dc6c6bad5367d7fd8561527da30e9b8dd.pdf
    [6] Feature Tools:可自动构造机器学习特征的Python库. https://www.jiqizhixin.com/articles/2018-06-21-2
    [7] 各种聚类算法的系统介绍和比较. https://blog.csdn.net/abc200941410128/article/details/78541273

    展开全文
  • 特征工程时间特征处理方式

    千次阅读 2019-08-25 09:12:52
    时间特征处理方式

    时间特征处理方式 

    展开全文
  • 特征工程

    2021-03-23 00:14:51
    特征工程 数据处理 * 时间序列数据格式处理 * 加入时间步特征time 特征工程 时间序列特征构造 特征筛选 使用 tsfresh 进行时间序列特征处理 # 包导入 import pandas as pd import numpy as np import tsfresh ...
  • PySpark.ml时间序列特征工程
  • 时间特征 时间信息是极其敏感的信息,我们在数据竞赛中看到分数前后排出现较大gap的时候,第一时间需要考虑的就是时间信息,时间特征在很多竞赛中,往往可以决定排名的走势,那么当我们拿到时间相关的特征时,该...
  • 特征工程之处理时间序列数据

    千次阅读 2020-09-05 09:40:25
    特征工程在这个领域的重要性是因为(原始)时间序列数据通常只包含一个表示时间属性的列,即日期时间(或时间戳)。 对于日期时间数据,特征工程可以看作是从独立的(不同的)特征数据中提取有用的信息。例如,从...
  • 时间数据的特征工程

    2020-09-07 21:12:56
    # 时间数据的特征工程 # 将单纯的日期维度扩展成更多维度,构造更多输入给模型的特征,增强数据的可解释性,更接近人的业务逻辑。 # 哪一年 # 哪一个月 # 星期几 # 这个月的第几天 # 月初还是月末 # 一年当中的第几...
  • 特征工程-时间类特征

    2019-11-28 18:41:12
    1 one_hot 2 用 sin(hour*2*pi/24) cos(hour*2*pi/24) 来表示 见http://blog.davidkaleko.com/feature-engineering-cyclical-features.html
  • 维基百科对于特征工程的定义...特征工程在这个领域的重要性是因为(原始)时间序列数据通常只包含一个表示时间属性的列,即日期时间(或时间戳)。对于日期时间数据,特征工程可以看作是从独立的(不同的)特征数据中提取...
  • 特征工程 一:特征工程介绍 俗话说,“巧妇难为无米之炊”。在机器学习中,数据和特征便是“米”,模型和算法便是“巧妇”。没有充足的数据、合适的特征,再强大的模型也是没有任何作用的。对于一个机器学习问题,...
  • 时间序列树模型特征工程汇总

    千次阅读 2020-01-18 14:10:02
    时间序列特征汇总特征一、时间特征特征二、类别mean encoding特征特征三、统计特征特征四:滞后历史特征特征五:高阶特征特征六:外部特征 稍微总结一下,时间序列中的特征,主要针对机器学习树模型,因为是时序...
  • 前几次的分享,我们了解了时间序列分析的基础方法以及预测方法。在使用这些方法之前,一般需要我们对原始时序做一定的处理,抽取若干特征;再者,为了更充分了解时间序列,我们也需要挖掘时间序列的特...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,066
精华内容 826
关键字:

时间特征工程