本文总结了常用的特征构造方法。



有的时候,已有的特征可能并没有有效的表征特征,尤其是针对特殊的业务的时候,极有可能需要对已有的特征进行变换,从而让特征更加能够表征特有的业务。这里介绍几种常用的特征构造方法。

(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变换


\[\hat x=\left\{\begin{aligned} & \frac{x^\lambda-1}{\lambda} &(\lambda \neq0) \\ & ln(x) & (\lambda = 0) \\ \end{aligned} \right. \]


(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的库,可以遗传算法和符号回归,自动的去探索各种可能的特征组合,从而发现更好的特征。具体使用方式可以查看官方文档。