【发布时间】:2016-12-31 10:46:52
【问题描述】:
sklearn.preprocessing 模块中的standardscaler和normalizer有什么区别? 两者不做同样的事情吗?即使用偏差去除均值和尺度?
【问题讨论】:
标签: machine-learning statistics scikit-learn
sklearn.preprocessing 模块中的standardscaler和normalizer有什么区别? 两者不做同样的事情吗?即使用偏差去除均值和尺度?
【问题讨论】:
标签: machine-learning statistics scikit-learn
来自Normalizer 文档:
具有至少一个非零分量的每个样本(即数据矩阵的每一行)独立于其他样本重新缩放,使其范数(l1 或 l2)等于 1。
通过去除均值和缩放到单位方差来标准化特征
换句话说,Normalizer 作用于 row-wise 和 StandardScaler column-wise。归一化器不会通过偏差去除均值和比例,而是将整行缩放到单位范数。
【讨论】:
Ben 的 visualization 和 article 非常有助于说明这个想法。
StandardScaler 假定您的数据通常分布在每个特征中。通过“去除均值并缩放到单位方差”,您现在可以在图片中看到它们具有相同的“比例”,而不管其原始比例如何。
【讨论】:
StandardScaler() 通过去除均值并缩放到单位方差来标准化特征(例如人物数据的特征,即身高、体重)。
(单位方差:单位方差意味着样本的标准差以及方差会随着样本量趋于无穷大而趋于1。)
Normalizer() 重新调整每个样本。例如,独立地重新调整每家公司的股票价格。
有些股票比其他股票贵。为了解决这个问题,我们将其标准化。 Normalizer 将分别将每家公司的股票价格转换为相对规模。
【讨论】:
主要区别在于标准标量应用于列,而规范化器应用于行,因此请确保在规范化之前重塑数据。
【讨论】:
StandardScaler 通过去除均值和缩放到单位方差来标准化特征,Normalizer 重新缩放每个样本。
【讨论】:
也许是一个有用的例子:
使用 Normalizer,默认操作似乎是将一行中的每个数据点除以该行的 范数。
例如,给定一行[4,1,2,2], 范数为:。
那么规范化的行是:
[4/5, 1/5, 2/5, 2/5]= [0.8, 0.2, 0.4, 0.4]
这是 SKLearn 文档中示例的第一行。
【讨论】:
根据@TerrenceJ 的答案,这里是手动计算来自第一个SKLearn documentation 示例的Normalizer 转换结果的代码(请注意,这反映了默认的“l2”归一化)。
# create the original example
X = [[4, 1, 2, 2],
[1, 3, 9, 3],
[5, 7, 5, 1]]
# Manual Method:
# get the square root of the sum of squares for each record ("row")
import numpy as np
div = [np.sqrt(np.sum(np.power(X[i], 2))) for i in range(len(X))]
# divide each value by its record's respective square root of the sum of squares
np.array([X[k] / div[k] for k in range(len(X))])
# array([[0.8, 0.2, 0.4, 0.4],
# [0.1, 0.3, 0.9, 0.3],
# [0.5, 0.7, 0.5, 0.1]])
# SKLearn API Method:
from sklearn.preprocessing import Normalizer
Normalizer().fit_transform(X)
# array([[0.8, 0.2, 0.4, 0.4],
# [0.1, 0.3, 0.9, 0.3],
# [0.5, 0.7, 0.5, 0.1]])
【讨论】: