0%

特征工程:笔记

《特征工程入门与实践》

3、特征增强:清洗数据

填充缺失值

通常数据集会因为各种原因有所缺失。必须尽可能地了解数据集,以便找到使用其他符号填充的确实数据。公开数据集的文档里面有可能会提到缺失数据的问题。 如果没有文档,缺失值的常见填充方法有: - 0(数值型) - unknown 或 Unknown(类别型) - ?(类别型)

处理缺失值

如果 pandas 将缺失值自动填充了 0(需要自行判断 0 是否缺失值),那么可以先用 python 的 None 填充缺失值,以便使用 pandas 的 fillna, dropna and isnull 等方法。 现在开始介绍方法,处理缺失值的主要办法是:1. 删除缺失值的行;2. 填充缺失值。 1. 最常见也是最容易的方法大概是直接删除存在缺失值的行。通过这种操作,我们会留下具有数据的完整数据点。可以使用 pandas 的 dropna 方法获取新的 DataFrame。 但是我们可能会丢失大量的原始数据(书中的例子使用的是《皮马印第安人糖尿病预测数据集》,丢失 51% 的行)。从机器学习的角度考虑,尽管数据都有值、很干净,但是我们没有利用尽可能多的数据。经书中使用 pandas 分析,某些数据的均值下降严重,所以我们应该保留下尽可能多的数据。 然后此书的作者使用去除缺失值的数据集运行了一个 KNN 模型,最终得到最好的结果为:k=7,acc=74.5%。但是如果用到所有的数据,会不会更好? 2. 填充缺失值是一种更复杂的方法。填充指用现有的知识/数据来确定缺失的数量值,并填充的行为。 我们有几种选择,最常见的是用此列其余部分的均值填充缺失值。可以使用 pandas 的 fillna(mean_value) 方法即可填充,但是这有点麻烦,我们可以选用 scikit-learn 预处理类的 Imputer 模块,它更简单。只需指定策略 \(Imputer = Imputer(strategy='mean')\),再调用 \(pima_imputed = imputer.fit_transform(pima)\) 即可。 那么来验证一下这样填充的 acc 如何。首先全部填充 0 用来充当对照组,发现 KNN 模型的 acc=73.31%,明显低于 74.5%。然后填充均值,发现 acc=65.625%,居然更低了。 这里需要解释一点,其实使用上述的方法去填充缺失值是错误的。我们将整个数据集的一列的均值去填充对应列的缺失值实际上犯了一个错误,即当预测测试集的响应值(即 y)时,不能假设我们已经知道了整个数据集的均值。所以我们应该使用训练集的均值去填充训练集和测试集的缺失值。注:我们假设测试集是未知的,所以它并没有均值,并且我们使用了训练集的信息去训练,所以我们需要使用训练集的均值去填充测试集的缺失值。 但是最 sao 的是,此书中用正确的填充方法,最后得到的 acc=73.18%,比直接填充 0 还低。另外使用中位数填充得到的 acc=73.57%,始终没有高于直接删除缺失值得到的 acc。

标准化与归一化

仔细观察数据,我们发现数据的大小差别很大。而某些机器学习模型受数据尺度(scale)的影响很大。数据工程师可以选用某种归一化操作。我们将重点关注 3 种归一化方法,前两个方法特别用于调整特征,第三个方法虽然操作行,但效果与前两个相当。 - z 分数标准化 - min-max 标准化 - 行归一化

z 分数标准化是最常见的标准化技术,即均值归一化。使得输出会被重新缩放,使均值为 0、标准差为 1。公式为: \[ z = \frac{x - \mu}{\sigma} \] - z 是新的值 - x 是单元格中原来的值 - \(\mu\) 是该列的均值 - \(\sigma\) 是列的标准差

min-max 标准化与 z 分数标准化类似,它也用一个公式替换列中的每个值。它会使得每一列的值都位于 [0,1] 。公式为: \[ m = \frac{(x - x_{min})}{x_{max} - x_{min}} \] - m 是新的值; - x 是单元格原来的值; - \(x_{min}\) 是该列的最小值; - \(x_{max}\) 是该列的最大值。

行归一化是关于行的,而不是关于列的。它不是计算每列的统计值(均值、最小值、最大值),而是保证每行都有单位范数,意味着每行的向量长度相同。计算方式如下所示,即 L2 范数,其他范数方式这里不讨论。 \[ ||x|| = \sqrt{(x^2_1 + x^2_2 + \dots + x^2_n)} \]

整合

最后我们将填充缺失值的方法和标准化(或归一化)的方法结合起来用,在 pima 数据集上发现使用均值填充 + min-max 标准化的交叉验证准确率最高。

4、特征构建:我能生成新特征吗

  1. 填充分类特征
  2. 编码分类变量
  3. 扩展数值特征:多项式
  4. 针对文本:词袋模型、TF-IDF...

5、特征选择:对坏属性说不

6、特征转换:数学显神通

7、特征学习:以AI促AI