《精通特征工程》读书笔记

一、机器学习流程

数据特性:

  • 错误数据:测量时的错误
  • 冗余数据:对同一数据的多次表述
  • 缺失数据

特征:

原始数据的数值表示
正确的特征应该适合当前的任务,并易于被模型所使用

特征工程:

在给定数据、模型和任务的情况下设计出最合适的特征
《精通特征工程》读书笔记

二、数值型数据

  • 合理性检查:正负等
  • 考虑特征的尺度:kmeans、knn、径向基核函数、所有使用欧氏距离的方法均需要,对特征进行标准化、区间计数
  • 数值型特征的分布:对数变换使变量的分布更加接近于高斯分布
  • 交互特征:将多个特征组合在一起

基本概念:

标量:

单独的数值型特征

向量:

标量的有序列表

空间:

向量位于向量空间中
模型的输入通常表示为数值向量

1、处理计数:

1.1 二值化:

《精通特征工程》读书笔记
强壮的用户偏好表示方法是将收听次数二值化,把所有大于1 的次数值设为1。

1.2 区间量化(分箱)

原始数据横跨了若干个数量级,这对很多模型来说都是个问题。
《精通特征工程》读书笔记
可以将点评数量分到多个箱子里面,去掉实际的计数值。区间量化可以将连续型数值映射为离散型数值,我们可以将这种离散型数值看作一种有序的分箱序列,它表示的是对密度的测量。

1.2.1 固定宽度分箱:

通过固定宽度分箱,每个分箱中会包含一个具体范围内的数值。

均匀分箱:
要将计数值映射到分箱,只需用计数值除以分箱的宽度,然后取整数部分。

指数分箱:
当数值横跨多个数量级时,最好按照10 的幂(或任何常数的幂)来进行分组:09、1099、100999、10009999
此时,要将计数值映射到分箱,需要取计数值的对数。

1.2.2 分位数分箱:

固定宽度分箱非常容易计算,但如果计数值中有比较大的缺口,就会产生很多没有任何数据的空箱子
根据数据的分布特点,进行自适应的箱体定位,就可以解决这个问题。

分位数是可以将数据划分为相等的若干份数的值。例如,中位数(即二分位数)可以将数据划分为两半,其中一半数据点比中位数小,另一半数据点比中位数大。
要计算分位数并将数据映射到分位数分箱中, 可以使用Pandas 库。
pandas.DataFrame.quantile 和pandas.Series.quantile 可以计算分位数。pandas.qcut 可以将数据映射为所需的分位数值。

1.3 对数变换

对数函数可以对大数值的范围进行压缩,对小数值的范围进行扩展。
《精通特征工程》读书笔记
对于具有重尾分布的正数值的处理,对数变换是一个非常强大的工具。(与高斯分布相比,重尾分布的概率质量更多地位于尾部。)它压缩了分布高端的长尾,使之成为较短的尾部,并将低端扩展为更长的头部。
《精通特征工程》读书笔记
《精通特征工程》读书笔记

1.4 指数变换:对数变换的推广

《精通特征工程》读书笔记
《精通特征工程》读书笔记
《精通特征工程》读书笔记
当应用Box-Cox 变换或更广义的指数变换时,必须确定参数λ 的值,这可以通过极大似然方法(找到能使变换后信号的高斯似然最大化的λ 值)或贝叶斯方法来完成,SciPy 的stats 包中有Box-Cox 变换的实现方法,并包括找到最优变换参数的功能。
相比对数变换,最优Box-Cox 变换对尾部的压缩更强,它使得尾部变平,跑到了红色等值斜线下面。
《精通特征工程》读书笔记

1.5 特征缩放/归一化

有些数值型特征可以无限制地增加,比如计数值。如果模型对输入特征的尺度很敏感,就需要进行特征缩放。顾名思义,特征缩放会改变特征的尺度,有些人将其称为特征归一化

1.5.1 min-max缩放

min-max 缩放可以将所有特征值压缩(或扩展)到[0, 1]区间中:
《精通特征工程》读书笔记
《精通特征工程》读书笔记

1.5.2 特征标准化/方差缩放

《精通特征工程》读书笔记
缩放后的特征均值为0,方差为1。如果初始特征服从高斯分布,那么缩放后的特征也服从高斯分布。
《精通特征工程》读书笔记
不要“中心化”稀疏数据!

1.5.3 l2l^{2}归一化

将初始特征值除以一个称为ℓ2 范数的量,ℓ2 范数又称为欧几里得范数。
《精通特征工程》读书笔记
《精通特征工程》读书笔记
《精通特征工程》读书笔记
不论使用何种缩放方法,特征缩放总是将特征除以一个常数(称为归一化常数)。因此,它不会改变单特征分布的形状。
与对数变换不同,特征缩放不改变分布的形状,只有数据尺度发生了变化。
《精通特征工程》读书笔记
如果输入特征的尺度差别非常大,就会对模型训练算法带来数值稳定性方面的问题。在这种情况下,就应该对特征进行标准化。

1.6 交互特征

两个特征的乘积可以组成一对简单的交互特征。
可以捕获特征之间的交互作用,因此这些特征对就称为交互特征。
《精通特征工程》读书笔记
如果线性模型中包含有交互特征对,那它的训练时间和评分时间就会从O(n) 增加到O(n2),其中n 是单一特征的数量。

有若干种方法可以绕过高阶交互特征所带来的计算成本。我们可以在构造出所有交互特征之后再执行特征选择,或者,也可以更加精心地设计出少量复杂特征。

精心设计的复杂特征需要昂贵的成本,所以数量不能太多,它们可以减少模型的训练时间,但特征本身会消耗很多计算能力,这增加了模型评分阶段的计算成本。

1.7 特征选择

特征选择技术可以精简掉无用的特征,以降低最终模型的复杂性,它的最终目的是得到一个简约模型,在不降低预测准确率或对预测准确率影响不大的情况下提高计算速度。

为了得到这样的模型,有些特征选择技术需要训练不止一个待选模型。换言之,特征选择不是为了减少训练时间(实际上,一些技术会增加总体训练时间),而是为了减少模型评分时间。
特征选择技术可以分为以下三类:
过滤:
过滤技术对特征进行预处理,以除去那些不太可能对模型有用处的特征。例如,我们可以计算出每个特征与响应变量之间的相关性或互信息,然后过滤掉那些在某个阈值之下的特征。它们有可能无法为模型选择出正确的特征。我们最好谨慎地使用预过滤技术,以免在有用特征进入到模型训练阶段之前不经意地将其删除。
打包技术:
成本非常高昂,但它们可以试验特征的各个子集,这意味着我们不会意外地删除那些本身不提供什么信息但和其他特征组合起来却非常有用的特征。将模型视为一个能对推荐的特征子集给出合理评分的黑盒子。
嵌入式方法:
将特征选择作为模型训练过程的一部分。例如,特征选择是决策树与生俱来的一种功能,因为它在每个训练阶段都要选择一个特征来对树进行分割。另一个例子是ℓ1 正则项,它可以添加到任意线性模型的训练目标中。
ℓ1 正则项鼓励模型使用更少的特征,而不是更多的特征,所以又称为模型的稀疏性约束。
嵌入式方法在计算成本和结果质量之间实现了某种平衡。

五、分类变量

定义: 用来表示类别或标记的,又称无序变量

1、编码

1.1 one-hot编码

使用一组比特位,每个比特位表示一种可能的类别。
如果变量不能同时属于多个类别,那么这组值中就只有一个比特位是开的。
可以通过sklearn.preprocessing.OneHotEncoder实现。
每个比特位表示一个特征,因此,一个可能有k 个类别的分类变量就可以编码为一个长度为k 的特征向量。
《精通特征工程》读书笔记

1.2 虚拟编码

one-hot 编码的问题是它允许有k 个*度,而变量本身只需要k-1 个*度。虚拟编码在进行表示时只使用k-1 个特征,除去了额外的*度。
《精通特征工程》读书笔记
没有被使用的那个特征通过一个全零向量表示,称为参照类。
虚拟编码和one-hot 编码都可以通过Pandas包中的pandas.get_dummies 来实现,指定drop_first标志来生成虚拟编码。
使用虚拟编码的模型结果比使用one-hot 编码的模型结果更具解释性。