【数据竞赛】这篇文章送给想要学习特征交叉的朋友。

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

特征工程--三阶组合特征!

前 言

大家好,我是阿杰,今天我和小伙伴们又继续更新我们的Kaggle竞赛小册的特征工程系列,本文是三阶组合特征的一部分,在数据竞赛中,一般特征构建到三阶就差不多了,所以我们后续的小测将侧重于三阶的特征组合。

在前面的篇章中,我们介绍了单阶特征和二阶特征的组合方式,在实践中90%的特征的一阶二阶组合特征都可以通过之前介绍的方式得到,本章我们介绍三阶组合特征的构建方式。在数据竞赛中,一般特征做到三阶就差的不是很多了,其余的我们也就不再进行过多的介绍。和在介绍二阶组合特征的时候一样,此处我们还是以枚举的方式介绍三阶特征的组合。

无序类别特征(A)+无序类别特征(B) + 无序类别特征 (C)

01


ABC拼接成单一类别特征

将三个类别特征组合成一个类别特征,然后就转变为单个类别特征的特征工程。

df['ABC'] = df['A'].astype(str) + '_'+  df['B'].astype(str) + '_'+  df['C'].astype(str) 

02


转化为1+2的形式

1+2中的1指的是A或者B或者C,2指的是BC,AB,AC,1+2共有下面几种情况,

  • A+BC

  • B+AC

  • C+AB

此处2+1的类别特征指的是,将AB或者AC或者BC进行组合得到一个新的类别特征,然后将剩下的一个作为另外一个类别特征。这样我们的问题就转变为两个类别特征的组合,可以直接套用之前类别特征+类别特征的形式。

03


转化为2+2的形式

2+2中的第一个2指的是AB或者AC或者BC,第二个2和第一个2类似,但

  • AB+AC

  • AB+BC

该类的组合特征一般会出现在其中两个类别变量是非常相关的时候,例如A表示用户ID,B表示商店,C表示商品,这个时候AB表示用户和商店的关系,AC表示用户和商品的关系,那AC出现的次数除以AB出现的次数就表示用户购买某个商品的次数在某家店铺中的分布情况。

df['AB_cnt'] = df.groupby('AB')['C'].transform('count')
df['AC_cnt'] = df.groupby('AC')['B'].transform('count')
df['AB_AC_cntpct'] = df['AB_cnt'] / df['AC_cnt']

04


转化为1+3的形式

1+3中的1指的是A或者B或者C,3指的是ABC拼接之后得到的类别特征,1+3共有下面几种情况,

  • A+ABC

  • B+ABC

  • C+ABC

这是很常见的一类特征,例如A表示用户,B表示商店,C表示商品,那么ABC出现的次数与A出现次数的占比就是用户对每个店铺商品的购买的分布信息。

df['A_cnt']        = df.groupby('A')['C'].transform('count')
df['ABC_cnt']      = df.groupby('ABC')['B'].transform('count')
df['ABC_A_cntpct'] = df['ABC_cnt'] / df['A_cnt']

05


转化为2+3的形式

2+3中的2指的是将其中的任意两个类别特征进行组合得到一个类别特征,3指的是ABC拼接之后得到的类别特征,于是我们有

  • AB+ABC

  • AC+ABC

  • BC+ABC

该类特征较为常见的情况是,A表示商店,B表示品牌,C表示商品,于是ABC出现次数占AB出现次数的百分比就是商店中某个品牌的某件商品占据该商品品牌的百分比。相似的还有A表示用户,B表示商店,C表示商品等,该类组合的特征往往需要有一定的物理可解释性,否则可能会没有任何意义。

df['AB_cnt'] = df.groupby('AB')['C'].transform('count')
df['ABC_cnt'] = df.groupby('ABC')['C'].transform('count')
df['AB_ABC_cntpct'] = df['AB_cnt'] / df['ABC_cnt']

06


ABC热门交互信息

ABC的流行度特征就是A的出现次数,B的出现次数以及C的出现次数的乘积。该特征和ABC共同出现的次数是互补的,例如A表示用户ID,B表示品牌ID,C表示商品ID,则,

  • ABC的出现次数表示的是某用户和某品牌的某商品的交互次数,该值越大可能表明用户对该品牌的某商品比较钟爱程度;

但是A的出现次数B的出现次数C的出现次数,该值越大,则表示某活跃的用户(A出现次数多)对某流行品牌(该品牌出现次数多)的某个流行商品(该商品出现次数多)的一次交互。

df['ABC_cnt2'] = df['A_cnt'] *  df['B_cnt'] *  df['C_cnt'] 

07


ABC的统计矩阵特征

先统计A和B关于C的统计特征,然后展开得到每个A在每个B下C的统计信息,例如:

  • Nunique特征;

  • Count/Nunique特征;

## ABC的Nunique特征展开案例
import pandas as pd
df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
                         "bar", "bar", "bar", "bar"],
                   "B": ["one", "one", "one", "two", "two",
                         "one", "one", "two", "two"],
                   "C": ["small", "large", "large", "small",
                         "small", "large", "small", "small",
                         "large"],
                   "D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
                   "E": [2, 4, 5, 5, 6, 6, 8, 9, 9]})
df_tmp = df.groupby(['A','B'])['C'].nunique().reset_index()
df_tmp.columns = ['A','B','AB_nunique']
table = pd.pivot_table(df_tmp, values='AB_nunique', index=['A'],
                    columns=['B']) #.rename_axis(None, axis=1)

希望本文对新手能带来启发和帮助。

往期精彩回顾



适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑温州大学《机器学习课程》视频
本站qq群851320808,加入微信群请扫码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值