监督学习之十一——特征工程(最近更新:2020/1/4)

特征决定你的上限,模型只不过在无限逼近这个值罢了。

0 写在前面

参考资料:

  1. 特征选择,王贺(鱼佬)
  2. 《机器学习》周志华
  3. 阿水总结的数据竞赛Tricks

1 特征工程(Feature Engineering)概述

有人总结 Kaggle 比赛是 “Feature 为主,调参和 Ensemble 为辅”,我觉得很有道理。Feature Engineering 能做到什么程度,取决于对数据领域的了解程度。比如在数据包含大量文本的比赛中,常用的 NLP 特征就是必须的。怎么构造有用的 Feature,是一个不断学习和提高的过程。

特征工程与EDA联系紧密,可以说是EDA具体的操作吧。因为数据分析本身就是“假设”-“分析”-“验证”的过程,这个验证的过程一般是指构建特征并进行本地CV验证。

特征工程本质做的工作是,将数据字段转换成适合模型学习的形式,降低模型的学习难度。

2 特征提取(Feature Extraction)

2.1 降维算法

非监督学习之四——降维算法/矩阵分解问题

2.1 组合相似特征

-如对于父母,子女,兄弟姐妹类的可以组合成一个特征家人

2.2 特征提取

  • 正则提取
  • str.split分割字符,再用pandas.DataFrame.add_prefix添加前缀成为新变量

2.3 多项式特征

  • 自身的变换
  • 多个特征的联合

2.4 例子

  • 把name特征的长度作为一个新特征。
  • 对于有几个亲人,有几个好朋友之类的特征,可以添加一个是否有亲人/好朋友的特征,取值仅0/1。

2.5 统计特征

  1. .groupby.agg():生成统计特征(count,max,min,sum,mean,极差),用法如下
    data['count'] = 1
    tmp = data[data['goods_has_discount']==1].groupby(['customer_id'])['count'].agg({'goods_has_discount_counts':'count'}).reset_index()
    customer_all = customer_all.merge(tmp,on=['customer_id'],how='left')
# 构造基本特征
for col in ['aid','goods_id','account_id']:
    result = logs.groupby([col,'day'], as_index=False)['isExp'].agg({
        col+'_cnts'      : 'count',
        col+'_sums'      : 'sum',
        col+'_rate'      : 'mean'
        })
    result[col+'_negs'] = result[col+'_cnts'] - result[col+'_sums']
    data = data.merge(result, how='left', on=[col,'day'])
  1. .groupby.last():对于初始特征的重复数据保留其最后一条数据。

2.6 推荐领域

在这里插入图片描述

2.6.1 User-Item特征

在这里插入图片描述

2.6.1.1 时间序列上的特征

  1. 时间序列中User累积对某个Item的行为次数(绝对兴趣值),不同的时间序列可以构造不同的特征
  2. 时间序列上User对Item是否有重复的行为(深度兴趣值)
  3. 时间序列上User对Item是否有行为(是否感兴趣)
  4. 时间序列上User对Item的行为分布(相对兴趣值)

2.6.1.2 时间特征

  1. User对Item的最后行为时间(最近时间),可以归一化为一个0—1的标量,越接近于1表示User对这个Item具有越强的新鲜度
  2. User对某个Item的平均行为时间间隔(行为频度)用来刻画User对Item的活跃频率,时间间隔越小说明对用户的吸引力越大
  3. User对Item的行为时间间隔方差(行为稳定性)可以用来刻画User对Item的喜好的稳定性。

2.6.1.3 趋势特征

  1. User一天对Item的行为次数/User三天对Item的行为次数的均值,表示短期User对Item的热度趋势,大于1表示活跃逐渐在提高,以此类推。

2.6.2 User特征

2.6.2.1 时间序列上的特征

  1. 时间序列上User行为次数总和(User总活跃),在划分成三个时间细粒度的情况下,可以翻译成三个特征,分别是一天,三天和七天User的行为总和,来表示User在当前时间段上的活跃。
  2. 时间序列上User重复行为次数(用户深度活跃)用来刻画用户真实的活跃深度。
  3. 时间序列上User有行为的Item的数量(Item覆盖度),可以用来刻画用户的活跃广度,来表示用户是否有足够的意愿尝试新的Item。

2.6.2.2 时间特征

主要从三个角度(最近时间,行为频度,行为稳定性)来刻画用户的活跃度,和上面类似。

2.6.2.3 趋势特征

和上面类似。

2.6.2.4 属性特征

主要用来刻画用户的一些属性特征包括性别、年龄、学历以及使用机型等。

2.6.3 Item特征

2.6.3.1 时间序列上的特征

  1. 时间序列上Item行为次数总和(Item的行为热度),不同的时间序列可以构造不同的特征
  2. 时间序列上Item被重复点击次数(Item的热度深度)用来刻画Item真实的热度深度
  3. 时间序列上和当前Item发生行为的User的数量(去重)(热度广度)刻画了Item的热度的广度。
  4. 时间序列上Item的点击和曝光的比值(User不去重)—CTR,刻画了Item在相同曝光下被点击的概率。
  5. 时间序列上Item的点击和曝光的比值(User去重)—CTR,刻画了Item在相同曝光下被点击的概率,剔除了某些特殊情况某个User对某个Item的行为过于集中的情况。

2.6.3.2 时间特征

和上面类似。

2.6.3.3 趋势特征

和上面类似。

2.6.3.4 属性特征

2.6.4 User和Item之间的属性分布特征

2.6.4.1 时间序列上Item在User属性(如年龄)上的分布特征

  1. 通过计算Item在年龄段上的行为数量(User去重和不去重)来刻画Item在不同年龄段上的热度
  2. Item在年龄段上的行为数量/Item总的行为数量来表示User在年龄上的热度分布
  3. Item在不同年龄段上的点击和Item在相应的年龄段上的曝光之间的比值来刻画Item在不同的年龄段上的CTR。

2.6.4.2 时间序列上User在Item属性上的分布特征

  1. 通过计算User在不同的ItemType上的行为数量来刻画Use对不同的ItemType的喜好
  2. 计算User在不同的ItemType上是否有行为来刻画在时间段上User是否对当前的Item的类型感兴趣
  3. 计算User的行为在不同的Item上的分布来刻画对不同的ItemType的喜好程度
  4. User在一段时间内,是否在ItemType上有重复行为,来刻画用户是否对当前ItemType深度感兴趣。

2.6.4.3 时间序列上ItemType在Age上的分布特征

  1. 通过计算ItemType在不同年龄段上的行为数量(User不去重和不去重)来刻画ItemType在不同年龄段上的热度
  2. ItemType在不同年龄段上的行为数量/ItemType在年龄段上的用户数量来刻画当前ItemType对这个年龄段的User的吸引程度
  3. ItemType在不同年龄段上的点击和ItemType在相应的年龄段上的曝光之间的比值来刻画ItemType在不同的年龄段上的CTR。

2.7 时间特征处理

  1. .to_datetime处理后切片成年、周、日、小时等新特征。然后可以用.dt.days/years等来调用。
  2. datetime.timedelta(days=180):时间间隔
  3. 可以利用时间特征来划分数据集,滑动窗口
train_history = train[(train['order_pay_date'].astype(str)<='2013-07-03')]
train_label = train[train['order_pay_date'].astype(str)>='2013-07-04']

2.8 文本特征提取

2.8.1 单词包法

  1. 标记字符串并为每个可能的标记提供整数ID,例如使用空格和标点作为标记分隔符。
  2. 计算每个文档中标记的出现次数。
  3. 使用出现在大多数示例/文档中的重要性递减标记进行规范化和加权。

2.8.2 计算权重的方法

2.8.2.1 Tf–idf 项权重

tf-idf ( t , d ) = tf ( t , d ) × idf ( t ) \operatorname{tf-idf}(\mathrm{t}, \mathrm{d})=\operatorname{tf}(\mathrm{t}, \mathrm{d}) \times \operatorname{idf}(\mathrm{t})
idf ( t ) = log 1 + n 1 + df ( t ) + 1 \operatorname{idf}(t)=\log \frac{1+n}{1+\operatorname{df}(t)}+1

三、特征选择(Feature Selection)

3.1 过滤法(filter)

先选择后训练。按照评估准则对各个特征进行评分,然后按照筛选准则来选择特征。

3.1.1 评估准则

  • 线性-Pearson相关系数
  • 卡方值
  • 互信息和最大信息系数(MIC)
  • 距离相关系数
  • 方差:删除方差不足阈值的特征;
  • F-p值
  • Relief相关统计量: δ j = i ( d i f f ( x i j , x i , n h j ) 2 + d i f f ( x i j , x i , n m j ) 2 ) \delta^j=\sum_i(-diff(x_i^j,x_{i,nh}^j)^2+diff(x_i^j,x_{i,nm}^j)^2) ,其中 x i j x_i^j 表示第i个样本在属性j上的取值, x i , n h x_{i,nh} 为“猜中近邻”(near-hit),即 x i x_i 最近邻的同类样本,而 x i , n m x_{i,nm} 为“猜错近邻”(near-miss),即 x i x_i 最近邻的异类样本, d i f f ( x a j , x b j ) = x a j x b j diff(x_a^j,x_b^j)=|x_a^j-x_b^j| ,若属性j为离散型且该值不为0,则取1,这里的x已经规范化到[0,1]。另外,对于多分类问题,有以下变体,称为Relief-F。

在这里插入图片描述

3.1.2 筛选准则

  • 选择多少个最好的
  • 选择百分之多少最好的
  • 选择FPR(假阳性率),即误判概率不超过多少的。
  • 选择FDR(错误发现率)不超过多少的。
  • 选择FWE(系列错误率)不超过多少的。

3.2 包裹(包装)法(wrapper)

一训练一筛选。根据学习器预测效果评分,每次选择若干特征,或者排除若干特征。一般性能比过滤法好,但计算开销较大。可以分为前向搜索、后向搜索及双向搜索。

3.2.1 LVW(Las Vegas Wrapper)算法

在这里插入图片描述

3.3 嵌入法(embedded)

先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小排序选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。常见的嵌入式方法有L1正则化
另外,该方法常用于处理稀疏表示和字典学习以及压缩感知

一些启示

我在做特征工程的时候主要依靠两条线索。一条从问题本身出发,比如对于点击率预估问题,考虑用户会怎么想,用户会关心什么,同时也考虑商品适合哪些用户,购买这些商品的人有哪些共同点。另一条从特征类型出发,比如考虑做哪些特征交叉;哪些特征在分布上非常诡异,需要做一些预处理;哪些特征是多值类别特征,需要做特殊操作;哪些特征的量纲一致,可以做比较以及求和。在做特征的时候,尽量做得细致全面,不要在比赛初期考虑哪些特征会对模型产生副作用就放弃采用。因为只要严格保证自己的特征在训练集、验证集和测试集是一致的(特征的含义严格一致,同时特征的取值分布也基本一致),理论上这些特征就都不会对模型产生副作用(对于极个别无法保证一致的特征,可以在公榜上实验。换榜时,也要格外注意这些特征)。
作者:腾讯广告算法大赛
链接:https://zhuanlan.zhihu.com/p/66644369
来源:知乎


发布了60 篇原创文章 · 获赞 32 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42297855/article/details/97505444