文章目录
- 0 写在前面
- 1 特征工程(Feature Engineering)概述
- 2 特征提取(Feature Extraction)
- 2.1 降维算法
- 2.1 组合相似特征
- 2.2 特征提取
- 2.3 多项式特征
- 2.4 例子
- 2.5 统计特征
- 2.6 推荐领域
- 2.7 时间特征处理
- 2.8 文本特征提取
- 三、特征选择(Feature Selection)
- 一些启示
特征决定你的上限,模型只不过在无限逼近这个值罢了。
0 写在前面
参考资料:
- 特征选择,王贺(鱼佬)
- 《机器学习》周志华
- 阿水总结的数据竞赛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 统计特征
.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'])
.groupby.last()
:对于初始特征的重复数据保留其最后一条数据。
2.6 推荐领域
2.6.1 User-Item特征
2.6.1.1 时间序列上的特征
- 时间序列中User累积对某个Item的行为次数(绝对兴趣值),不同的时间序列可以构造不同的特征
- 时间序列上User对Item是否有重复的行为(深度兴趣值)
- 时间序列上User对Item是否有行为(是否感兴趣)
- 时间序列上User对Item的行为分布(相对兴趣值)
2.6.1.2 时间特征
- User对Item的最后行为时间(最近时间),可以归一化为一个0—1的标量,越接近于1表示User对这个Item具有越强的新鲜度
- User对某个Item的平均行为时间间隔(行为频度)用来刻画User对Item的活跃频率,时间间隔越小说明对用户的吸引力越大
- User对Item的行为时间间隔方差(行为稳定性)可以用来刻画User对Item的喜好的稳定性。
2.6.1.3 趋势特征
- User一天对Item的行为次数/User三天对Item的行为次数的均值,表示短期User对Item的热度趋势,大于1表示活跃逐渐在提高,以此类推。
2.6.2 User特征
2.6.2.1 时间序列上的特征
- 时间序列上User行为次数总和(User总活跃),在划分成三个时间细粒度的情况下,可以翻译成三个特征,分别是一天,三天和七天User的行为总和,来表示User在当前时间段上的活跃。
- 时间序列上User重复行为次数(用户深度活跃)用来刻画用户真实的活跃深度。
- 时间序列上User有行为的Item的数量(Item覆盖度),可以用来刻画用户的活跃广度,来表示用户是否有足够的意愿尝试新的Item。
2.6.2.2 时间特征
主要从三个角度(最近时间,行为频度,行为稳定性)来刻画用户的活跃度,和上面类似。
2.6.2.3 趋势特征
和上面类似。
2.6.2.4 属性特征
主要用来刻画用户的一些属性特征包括性别、年龄、学历以及使用机型等。
2.6.3 Item特征
2.6.3.1 时间序列上的特征
- 时间序列上Item行为次数总和(Item的行为热度),不同的时间序列可以构造不同的特征
- 时间序列上Item被重复点击次数(Item的热度深度)用来刻画Item真实的热度深度
- 时间序列上和当前Item发生行为的User的数量(去重)(热度广度)刻画了Item的热度的广度。
- 时间序列上Item的点击和曝光的比值(User不去重)—CTR,刻画了Item在相同曝光下被点击的概率。
- 时间序列上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属性(如年龄)上的分布特征
- 通过计算Item在年龄段上的行为数量(User去重和不去重)来刻画Item在不同年龄段上的热度
- Item在年龄段上的行为数量/Item总的行为数量来表示User在年龄上的热度分布
- Item在不同年龄段上的点击和Item在相应的年龄段上的曝光之间的比值来刻画Item在不同的年龄段上的CTR。
2.6.4.2 时间序列上User在Item属性上的分布特征
- 通过计算User在不同的ItemType上的行为数量来刻画Use对不同的ItemType的喜好
- 计算User在不同的ItemType上是否有行为来刻画在时间段上User是否对当前的Item的类型感兴趣
- 计算User的行为在不同的Item上的分布来刻画对不同的ItemType的喜好程度
- User在一段时间内,是否在ItemType上有重复行为,来刻画用户是否对当前ItemType深度感兴趣。
2.6.4.3 时间序列上ItemType在Age上的分布特征
- 通过计算ItemType在不同年龄段上的行为数量(User不去重和不去重)来刻画ItemType在不同年龄段上的热度
- ItemType在不同年龄段上的行为数量/ItemType在年龄段上的用户数量来刻画当前ItemType对这个年龄段的User的吸引程度
- ItemType在不同年龄段上的点击和ItemType在相应的年龄段上的曝光之间的比值来刻画ItemType在不同的年龄段上的CTR。
2.7 时间特征处理
.to_datetime
处理后切片成年、周、日、小时等新特征。然后可以用.dt.days/years
等来调用。datetime.timedelta(days=180)
:时间间隔- 可以利用时间特征来划分数据集,滑动窗口,
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 单词包法
- 标记字符串并为每个可能的标记提供整数ID,例如使用空格和标点作为标记分隔符。
- 计算每个文档中标记的出现次数。
- 使用出现在大多数示例/文档中的重要性递减标记进行规范化和加权。
2.8.2 计算权重的方法
2.8.2.1 Tf–idf 项权重
三、特征选择(Feature Selection)
3.1 过滤法(filter)
先选择后训练。按照评估准则对各个特征进行评分,然后按照筛选准则来选择特征。
3.1.1 评估准则
- 线性-Pearson相关系数
- 卡方值
- 互信息和最大信息系数(MIC)
- 距离相关系数
- 方差:删除方差不足阈值的特征;
- F-p值
- Relief相关统计量: ,其中 表示第i个样本在属性j上的取值, 为“猜中近邻”(near-hit),即 最近邻的同类样本,而 为“猜错近邻”(near-miss),即 最近邻的异类样本, ,若属性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
来源:知乎