预处理:StandardScaler() 我们真的需要均值为零吗?

数据挖掘 scikit-学习 数据清理 支持向量机 预处理
2022-01-30 11:08:07

例如,学习算法的目标函数中使用的许多元素(例如支持向量机的 RBF 核或线性模型的 l1 和 l2 正则化器)假设所有特征都以零为中心并且具有相同顺序的方差。

这是来自scikit-learn

当有人说平均值预计为零时,有人可以指定他们指的是哪些元素。

我知道算法的方差应该在相似的范围内,以便为每个特征赋予相同的意义。但是有什么东西也必然期望数据中的均值为零吗?

换句话说,如果我知道每个特征的方差已经在同一范围内,那么仍然会出现问题,因为它说一些“元素”期望零均值

2个回答

原因是一样的。
我假设您了解不同比例的特征如何产生问题

但仅缩放并不总是使它们具有相似的比例,因为标准偏差取决于特征的范围
因此,如果一个特征非常大但范围很小,那么简单地缩放它不会有帮助。

让我们看一个有两个特征的例子

import numpy as np
np.set_printoptions(precision=2)

feat_A = np.array([1,2,3,4,5])
feat_B = np.array([10000000,10000001,10000002,10000003,10000005])

# Case I  - Only Std
print(feat_A/feat_A.std())
print(feat_B/feat_B.std())

# Case II - Mean and Std
print((feat_A-feat_A.mean())/feat_A.std())
print((feat_B-feat_B.mean())/feat_B.std())

输出

案例 - 我- [你可能会看到,这并不能解决问题]

[0.71 1.41 2.12 2.83 3.54]
[5812381.94 5812382.52 5812383.1 5812383.68 5812384.84]

案例 - II - [这就是我们要找的]

[-1.41 -0.71 0. 0.71 1.41]
[-1.28 -0.7 -0.12 0.46 1.63]

居中似乎不太可能会受到伤害,所以我建议无论如何都要这样做。

从理论上讲,在具有正则化的广义线性模型中,不,居中不会改变任何东西。这是因为截距项可以吸收任何变化;换档x通过 100 可以简单地重写:

15+0.2(x100)=150.2100+0.2x=5+0.2x,
因此对于具有相同系数惩罚 的移位数据存在基本相同的模型当然,这表明了第一个不居中损害性能的重要示例:如果您不适合截距项!

但是,在尝试在 中进行测试时sklearn,我遇到了一些麻烦(笔记本):使用和不使用居中进行缩放会在惩罚逻辑回归中给出不同的结果,具体取决于求解器!saga给出不同的结果,但lbfgs给出几乎相同的系数。)我还不确定这是否是一些数字问题(我以前见过,但数据集的规模更大)还是我的误解。惩罚线性回归似乎工作正常。

最后,对于带有 rbf 内核的 SVM。我对非线性内核 SVM 的理解相当有限,但是 rbf 内核应该对中心保持不变。但是,请参阅特征空间中的数据中心( pdf ),它假定在内核空间中居中可能会有所帮助。无论是出于理论还是数值原因,上述笔记本中的分类和回归版本在居中后都显示出不同的结果。