特征构建是指通过研究原始数据样本,结合机器学习实战经验和相关领域的专业知识,思考问题的潜在形式和数据结构,人工创造出新的特征,而这些特征对于模型训练又是有益的并且具有一定的工程意义。
特征构建的方式主要有单列操作、多列操作、 分组/聚合操作这三种。
1. 单列操作
在pandas库中,主要利用map()函数进行单列的操作。
map()函数是将目标函数作用于一个Series的每一个元素,而DataFrame的一列就是一个Series, 因此可通过map()来对一列进行四则运算、平方、开方、幂方、指数、对数等操作。
train['DIV_column_i'] = train['column_i'].map(lambda x: x/1024)
train['X2_column_i'] = train['column_i'].map(lambda x: x**2)
train['EXP_column_i'] = train['column_i'].map(lambda x: math.exp(x))
2. 多列操作
在pandas库中,主要利用apply()函数进行多列的操作。
apply()函数是将目标函数作用于一个DataFrame的一行(列)或多行(列),当参数axis=1即为对列操作,因此可通过apply()实现多列求和/求差/求平均、求几列的最大值/最小值等操作。
train['SUM_column'] = train.apply(lambda x: x['column_1']+x['column_2']+x['column_3'], axis=1)
train['DIFF_column'] = train.apply(lambda x: x['column_1']-x['column_2'], axis=1)
train['MEAN_column'] = train.apply(lambda x: (x['column_1']+x['column_2'])/2.0, axis=1)
train['MAX_column'] = train.apply(lambda x: max(x['column_1'],x['column_2'],x['column_3']), axis=1)
train['MIN_column'] = train.apply(lambda x: min(x['column_1'],x['column_2'],x['column_3']), axis=1)
3. 分组/聚合操作
在pandas库中,主要利用groupby()函数进行分组/聚合操作。
前两种操作主要用于一个ID只出现一次的情况,而当题目中一个ID不止出现一次,或者需要按某些属性(如时间段)统计的时候,就需要进行分组/聚合操作。
# 按'gender'的值分组,并统计个数
grouped1 = train.groupby(['gender']).size()
# 按'age','gender'两列属性分组,并统计个数
grouped2 = train.groupby(['age','gender']).size()
# 按属性'gender'分组,并求列'age'的均值
grouped3 = train['age'].astype(float).groupby(train['gender']).mean()
# 按'gender','age'属性分组,并求列'fee'的最大值
grouped4 = train['fee'].astype(float).groupby([train['gender'],train['age']]).max()