【数据竞赛】组合特征的构建技巧,如何快速构建百大组合特征池

共 3302字,需浏览 7分钟

 ·

2021-05-24 16:36


作者:尘沙杰少、樱落、新峰、DOTA、谢嘉嘉

特征工程--无序/有序类别/数值特征的组合特征!

前 言

这是一个系列篇,如果有任何问题或者疑问的可添加我的微信一起讨论,备注:“竞赛小册”即可。本文我们接着上一篇组合特征继续讨论无序类别特征和有序类别特征以及无序类别特征和数值特征的组合特征构建策略,这是数据竞赛中的核心部分,本文将介绍如何基于这些特征构建出上百的特征,并介绍其中常见的一些非常有效的黄金组合特征。


无序类别特征+有序类别组合特征

1. 有序类别特征当无序

当我们将有序类别特征当作是无序类别特征的时候,所有无序类别特征+无序类别特征的策略在此便可以被拿过来直接使用。

2. 有序类别特征预处理再组合

有序类别特征,因为存在相对大小关系,可以基于大小判断先对有序类别特征进行重组,重组的策略有很多,例如:

  • 直接使用现有的工具包分箱;
  • 基于业务理解进行分组。

我们以用户的消费为例,假设我们有一列特征为用户的消费范围,共分为十组:0-1000、1001-3000、3001-5000、5001-10000、10001-20000、2001-50000、50001-100000、、100001-200000、200001-500000、500001以上。如果我们知道部分业务消息,消费金额在5000以下的为普通用户,在5001-20000之间的为白银用户,在20001-100000之间的为黄金用户,100001及之上的为钻石用户。分完组之后将有序类别特征当无序类别特征处理即可。

3. 有序类别特征当做数值特征处理

此处的内容我们会在无序类别特征和数值特征的组合特征处一起介绍。

无序类别特征+数值特征


该小节内的为了方便表示我们将A作为无序类别特征,B作为数值特征

1. 数值特征当做有序类别特征

数值特征可以作为高基数的有序类别特征来对待,所以在之前用于无序类别特征和有序类别特征的策略在此可以直接使用。

2. 基于A/B的统计特征

我们将可以直接使用工具包进行计算得到的统计特征df.groupby(A)[B].transform(sts)称之为:A关于B的传统统计特征。这是非常通用的一组特征,其构建的思路也非常简单,就是计算组内(无序类别特征)数值特征的统计信息,例如:

  • 均值;
  • 方差;
  • 最大值;
  • 最小值;
  • 中位数;
  • 偏度;
  • 分位数(四分位数等);
  • 众数;
  • skewness;
  • 峰度系数;
  • 求和;
  • 其它统计特征。

改组特征几乎在所有的竞赛中都会被使用和构建,而且往往能带来非常大的提升。很多朋友会在这里枚举十几甚至更多的统计特征。

df['A_B_mean']   = df.groupby('A')['B'].transform('mean').values
df['B_A_median'] = df.groupby('B')['A'].transform('median').values
df['A_B_std']    = df.groupby('A')['B'].transform('std').values 
df['A_B_max']    = df.groupby('A')['B'].transform('max').values 
df['A_B_min']    = df.groupby('A')['B'].transform('min').values 
......

3. B+A/B的统计演变特征

此处我们讲的 B+A关于B统计演变特征是基于原始B特征和A关于B的统计特征衍生而来,相对复杂一些。下面我们列举一些常见的有效特征。

3.1.流量平滑特征

该特征也是较为通用的特征之一,直接用数值特征处于统计均值或者中位数即可,几乎所有的数据竞赛都可以直接使用。

df['B_div_A_B_mean']   = df['B'] / (df['A_B_mean']  + 1e-5)
df['B_div_A_B_median']   = df['B'] / (df['A_B_median']  + 1e-5)

3.2.黄金组合特征

该特征是之前Kaggle GM在kaggle论坛分享的,称其为黄金组合特征,一共有三个特征。

  • 原始的数值特征;
  • 基于A关于B的均值特征;
  • B减去A关于B的均值特征;

这三个一起使用时得到的效果往往是最佳的

df['B_minus_A_B_mean']   = df['B'] - df['A_B_mean']

3.3.组内归一化特征

该特征的构建和我们平时在对数据进行归一化是类似的,减去组内的均值再除以标准差。

df['B_minus_A_B_mean']   = (df['B'] - df['A_B_mean']) / (df['A_B_std'] + 1e-9)

3.4.其它

上面是我们见到目前最为有效的三个特征组合策略,肯定还有其它的特征组合策略,我们只需要将我们的统计特征和B进行其它形式的加减乘除等等变化即可得到成百上千的特征,但是最终的效果如何则不得而知。

4. A/B的统计+A/B统计演变特征

A/B的统计+A/B统计演变特征是直接基于A/B统计特征之后得到的值进行加减乘除等转换之后得到的特征,此处我们重点列举几个常见的有效的特征。

4.1.Gap特征

Gap特征就是计算一些分位数的一些差值信息,这个特征在一些分位数为较强特征的竞赛中可以拿到非常好的效果。

df['A_B_gap1'] = df['A_B_0.9q'] - df['A_B_0.1_q'
df['A_B_gap2'] = df['A_B_0.75q'] - df['A_B_0.25_q']
...

4.2.数据倾斜

  • 均值大于中位数,正倾斜;均值小于中位数,负倾斜。

此处我们用差值和比例值来表示这些信息。

df['magic_feature1_1'] = df['A_B_median'] - df['A_B_mean']
df['magic_feature1_2'] = df['magic_feature1_1'].map(abs)
df['magic_feature2'] = df['A_B_median'] / df['A_B_mean']

4.3.变异系数(CV)

变异系数度量标准差相对于均值的离中趋势,我们用=标准差/均值的方式来计算。

df['cv'] = df['A_B_std'] / df['A_B_mean']

4.4.其它

上面三种在所有的问题中都是非常值得尝试的特征,我们也可以基于其它不同的特征进行组合构建新的特征。



往期精彩回顾





本站qq群851320808,加入微信群请扫码:

浏览 37
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报