【问题标题】:Normalizations in sklearn and their differencessklearn 中的规范化及其差异
【发布时间】:2019-12-21 16:52:30
【问题描述】:
我看过很多文章建议这个公式
N = (x - min(x))/(max(x)-min(x))
标准化
但是当我在某个地方深入研究 sklearn 的规范化器时,我发现他们正在使用这个公式
x / np.linalg.norm(x)
因为后面默认使用 l2-norm。我应该使用哪一个?为什么两者有区别?
【问题讨论】:
标签:
python
machine-learning
scikit-learn
normalization
【解决方案1】:
np.ling.norm 由以下给出:
np.linalg.norm(x) = sqrt((sum_i_j(abs(x_i_j)))^2)
假设你有:
X= (1 2
0 -1)
那么你将拥有:
np.linalg.norm(x)= sqr((1+2+0+1)^2)= sqr(16)=4
X = (0.25 0.5
0 -0.25)
使用其他方法:
min(x)= -1
max(x)= 2
max(x)-min(x)=3
X = (0.66 1
0.33 0)
所以 min(x)/max(x) 也被称为 MinMaxScaler,所有的值总是在 0-1 之间,其他方法标准化你的值,但你仍然可以有负值。根据您的后续步骤,您需要决定使用哪一个。
【解决方案3】:
有不同的规范化技术,sklearn 提供了其中的许多技术。请注意,我们在这里查看一维数组。对于矩阵,这些操作适用于每个列(请查看这篇文章以获取深入的示例Scaling features for machine learning)让我们来看看其中的一些:
- Scikit-learn 的
MinMaxScaler 执行 (x - min(x))/(max(x)-min(x)) 这会缩放您的数组,使您只有 0 和 1 之间的值。如果您想在之后进行一些不允许负值的转换(例如对数变换或缩放 RGB 像素,就像在一些 MNIST 示例中所做的那样)
scikit-learns StandardScaler 执行 (x-x.mean())/x.std() 将数组围绕零居中并根据特征的方差进行缩放。这是一种标准转换,适用于许多情况,但请记住,您将获得负值。当您拥有不以 0 为中心和/或没有单位方差的高斯采样数据时,这尤其有用。
Scikit-learn 的 Normalizer 执行 x / np.linalg.norm(x)。这会将你的数组/向量的长度设置为 1。如果你想做一些线性代数的事情,比如你想实现 Gram-Schmidt 算法,可能会派上用场。
Scikit-learn 的 RobustScaler 可用于缩放具有异常值的数据。均值和标准差对异常值不稳健,因此该缩放器使用中位数并将数据缩放到分位数范围。
还有其他非线性变换,例如 QuantileTransformer 可以缩放为分位数范围,PowerTransformer 可以将任何分布映射到类似于高斯分布的分布。
机器学习中还使用了许多其他规范化,其中大量可能令人困惑。在 ML 中标准化数据背后的想法通常是,您不希望您的模型仅仅因为它具有更高的均值或更大的方差而将一个特征与其他特征区别对待。对于大多数标准情况,我使用MinMaxScaler 或StandardScaler,具体取决于根据方差进行缩放对我来说是否重要。