有的时候,已有的特征可能并没有有效的表征特征,尤其是针对特殊的业务的时候,极有可能需要对已有的特征进行变换,从而让特征更加能够表征特有的业务。这里介绍几种常用的特征构造方法。
(1) 统计量构造
-
使用常用的统计量构造特征,常用的统计量有:
四分位数、中位数、平均值、标准差、偏差、偏度、偏锋、离散系统
-
通过加大时间周期构造
例如周和月,统计更长周期例如周和月的数据作为特征。
-
权重
通过时间衰减组合新特征。(越靠近观测权重值高)
(2) 周期特征
-
前n个周期/天/月/年的周期值,如过去5天分位数、平均值等
-
同比/环比
(3) 特征组合
可以将几个不同的特征进行组合,新的特征也许能够更好的表征数据,优先考虑强特征维度,有大概一下几种组合方式:
-
离散+离散:笛卡尔积
-
离散+连续:连续特征分桶后进行笛卡尔积或基于类别特征 group by,类似于聚类特征构造
-
连续+连续:加减乘除,二阶差分等
(4)数学变换
- 基础数学变换
## 两个特征相除
autos["stroke_ratio"] = autos.stroke / autos.bore
autos[["stroke", "bore", "stroke_ratio"]].head()
## 几个特征进行复杂数学运算
autos["displacement"] = (
np.pi * ((0.5 * autos.bore) ** 2) * autos.stroke * autos.num_of_cylinders
)
-
对数变换
对于具有重尾分布的正数值的处理,对数变换是一个非常强大的工具。(与高斯分布相比,重尾分布的概率质量更多地位于尾部。)它压缩了分布高端的长尾,使之成为较短的尾部,并将低端扩展为更长的头部。
-
指数变换
指数变换是个变换族,对数变换只是它的一个特例。用统计学术语来说,它们都是方差稳定化变换。
-
Box-Cox 变换
平方根变换和对数变换都可以简单推广为Box-Cox变换
(5) 特征拆解
对于一些字符串,可以通过分解,得到一些特征
-
ID numbers:
'123-45-6789'
-
Phone numbers:
'(999) 555-0123'
-
Street addresses:
'8241 Kaggle Ln., Goose City, NV'
-
Internet addresses:
'http://www.kaggle.com
-
Product codes:
'0 36000 29145 2'
-
Dates and times:
'Mon Sep 30 07:06:05 2013'
customer["Policy"] # from the Policy feature
.str # through the string accessor
.split(" ", expand=True) # by splitting on " "
# and expanding the result into separate columns
customer[["Policy", "Type", "Level"]].head(10)
(6) 降维
降维也是一种常用的特征构造的方法,降维的方法可以查看笔者的sklearn机器学习系列,里面有详细的介绍。
(7) 新特征发现
有时候,可以通过已有的数据,发现一些新的特征,这个特征可以更加明确的帮助进行分类,想要发现新的特征,需要做到如下:
-
理解特征
-
去了解一些关于数据的领域知识,这些知识可以帮你更好的了解特征
-
研究前人的工作,帮助开阔思路
-
使用数据可视化,可以帮助直观的观察数据
(8) 自动构建发现
基于python 和sklearn,有一个称为gplearn的库,可以遗传算法和符号回归,自动的去探索各种可能的特征组合,从而发现更好的特征。具体使用方式可以查看官方文档。
参考
《特征工程入门与实践》
《精通特征工程》