142

我无法理解. _StandardScalersklearn

谁能用简单的语言向我解释一下?

4

9 回答 9

150
于 2018-06-15T16:27:11.913 回答
135

背后的想法StandardScaler是,它将转换您的数据,使其分布的平均值为 0,标准差为 1。
在多变量数据的情况下,这是按特征完成的(换句话说,对于数据的每一列都是独立的) .
给定数据的分布,数据集中的每个值都会减去平均值,然后除以整个数据集(或多变量情况下的特征)的标准差。

于 2016-11-23T14:29:46.633 回答
33

StandardScaler 执行标准化的任务。通常,数据集包含规模不同的变量。例如,员工数据集将包含 AGE 列,其值在 20-70 范围内,而 SALARY 列,其值在 10000-80000 范围内
由于这两个列的规模不同,因此在构建机器学习模型时将它们标准化为具有共同的规模。

于 2018-10-08T05:04:12.460 回答
31

如何计算:

在此处输入图像描述

你可以在这里阅读更多:

于 2016-11-28T21:38:40.040 回答
12

当您想要比较对应于不同单位的数据时,这很有用。在这种情况下,您要删除这些单位。要以一致的方式对所有数据执行此操作,您需要以方差是单一的且序列均值为 0 的方式转换数据。

于 2016-11-23T07:53:22.203 回答
10

以下是一个简单的工作示例,用于解释标准化计算的工作原理。理论部分已经在其他答案中得到了很好的解释。

>>>import numpy as np
>>>data = [[6, 2], [4, 2], [6, 4], [8, 2]]
>>>a = np.array(data)

>>>np.std(a, axis=0)
array([1.41421356, 0.8660254 ])

>>>np.mean(a, axis=0)
array([6. , 2.5])

>>>from sklearn.preprocessing import StandardScaler
>>>scaler = StandardScaler()
>>>scaler.fit(data)
>>>print(scaler.mean_)

#Xchanged = (X−μ)/σ  WHERE σ is Standard Deviation and μ is mean
>>>z=scaler.transform(data)
>>>z

计算

正如您在输出中看到的,均值是 [6. , 2.5] 和标准偏差是 [1.41421356, 0.8660254 ]

数据为 (0,1) 位置为 2 标准化 = (2 - 2.5)/0.8660254 = -0.57735027

(1,0) 位置的数据是 4 标准化 = (4-6)/1.41421356 = -1.414

标准化后的结果

在此处输入图像描述

标准化后检查均值和标准偏差

在此处输入图像描述

注意:-2.77555756e-17 非常接近于 0。

参考

  1. 比较不同缩放器对具有异常值的数据的影响

  2. 标准化和标准化有什么区别?

  3. 使用 sklearn StandardScaler 缩放的数据平均值不为零

于 2019-03-06T21:25:38.503 回答
4

上面的答案很好,但我需要一个简单的例子来减轻我过去的一些担忧。我想确保它确实是分别处理每一列。我现在放心了,找不到让我担心的例子。如上所述,所有列都单独缩放。

代码

import pandas as pd
import scipy.stats as ss
from sklearn.preprocessing import StandardScaler


data= [[1, 1, 1, 1, 1],[2, 5, 10, 50, 100],[3, 10, 20, 150, 200],[4, 15, 40, 200, 300]]

df = pd.DataFrame(data, columns=['N0', 'N1', 'N2', 'N3', 'N4']).astype('float64')

sc_X = StandardScaler()
df = sc_X.fit_transform(df)

num_cols = len(df[0,:])
for i in range(num_cols):
    col = df[:,i]
    col_stats = ss.describe(col)
    print(col_stats)

输出

DescribeResult(nobs=4, minmax=(-1.3416407864998738, 1.3416407864998738), mean=0.0, variance=1.3333333333333333, skewness=0.0, kurtosis=-1.3599999999999999)
DescribeResult(nobs=4, minmax=(-1.2828087129930659, 1.3778315806221817), mean=-5.551115123125783e-17, variance=1.3333333333333337, skewness=0.11003776770595125, kurtosis=-1.394993095506219)
DescribeResult(nobs=4, minmax=(-1.155344148338584, 1.53471088361394), mean=0.0, variance=1.3333333333333333, skewness=0.48089217736510326, kurtosis=-1.1471008824318165)
DescribeResult(nobs=4, minmax=(-1.2604572012883055, 1.2668071116222517), mean=-5.551115123125783e-17, variance=1.3333333333333333, skewness=0.0056842140599118185, kurtosis=-1.6438177182479734)
DescribeResult(nobs=4, minmax=(-1.338945389819976, 1.3434309690153527), mean=5.551115123125783e-17, variance=1.3333333333333333, skewness=0.005374558840039456, kurtosis=-1.3619131970819205)

笔记:

scipy.stats 模块正确报告了“样本”方差,它在分母中使用 (n - 1)。“总体”方差将在分母中使用 n 来计算方差。为了更好地理解,请看下面的代码,它使用了上面数据集第一列的缩放数据:

代码

import scipy.stats as ss

sc_Data = [[-1.34164079], [-0.4472136], [0.4472136], [1.34164079]]
col_stats = ss.describe([-1.34164079, -0.4472136, 0.4472136, 1.34164079])
print(col_stats)
print()

mean_by_hand = 0
for row in sc_Data:
    for element in row:
        mean_by_hand += element
mean_by_hand /= 4

variance_by_hand = 0
for row in sc_Data:
    for element in row:
        variance_by_hand += (mean_by_hand - element)**2
sample_variance_by_hand = variance_by_hand / 3
sample_std_dev_by_hand = sample_variance_by_hand ** 0.5

pop_variance_by_hand = variance_by_hand / 4
pop_std_dev_by_hand = pop_variance_by_hand ** 0.5

print("Sample of Population Calcs:")
print(mean_by_hand, sample_variance_by_hand, sample_std_dev_by_hand, '\n')
print("Population Calcs:")
print(mean_by_hand, pop_variance_by_hand, pop_std_dev_by_hand)

输出

DescribeResult(nobs=4, minmax=(-1.34164079, 1.34164079), mean=0.0, variance=1.3333333422778562, skewness=0.0, kurtosis=-1.36000000429325)

Sample of Population Calcs:
0.0 1.3333333422778562 1.1547005422523435

Population Calcs:
0.0 1.000000006708392 1.000000003354196
于 2018-10-12T18:04:40.127 回答
3

应用 后StandardScaler(), X 中的每一列的平均值为 0,标准差为 1。

此页面上的其他人列出了公式。

基本原理:某些算法要求数据看起来像这样(请参阅sklearn 文档)。

于 2018-06-14T18:40:53.933 回答
1

我们StandardScalar()按行申请。

因此,对于一列中的每一行(我假设您正在使用 Pandas DataFrame):

x_new = (x_original - mean_of_distribution) / std_of_distribution

几点——

  1. 它被称为标准标量,因为我们将它除以分布的标准差(特征的分布)。同样,您可以猜测MinMaxScalar()

  2. 应用后原始分布保持不变StandardScalar()。将分布更改为正态分布是一种常见的误解。我们只是将范围压缩为 [0, 1]。

于 2020-09-15T16:40:38.643 回答