谁能解释一下StandardScaler?

nit*_*y23 70 python scaling machine-learning standardized scikit-learn

我无法理解网页StandardScaler的文档中sklearn.

有人能用简单的语言向我解释一下吗?

use*_*745 76

背后的想法StandardScaler是它将转换您的数据,使其分布的平均值为0,标准差为1.给定数据的分布,数据集中的每个值将减去样本均值,然后除以整个数据集的标准差.

  • 我发现这个答案不正确。“数据集中的每个值都会减去样本平均值”——这是不正确的。每个特征/列的平均值将从特定列的值中减去。这是按列完成的。没有“减去样本平均值” - 请参阅下面的我的答案 (10认同)

mak*_*kis 61

主要思想是在应用机器学习技术之前规范化/标准化(mean = 0standard deviation = 1)您的功能.

您应该记住的一件重要事情是大多数(如果不是全部)X模型/类/函数,期望输入scikit-learn具有尺寸/形状的矩阵X.这是非常重要的.其他一些库期望作为输入反向.

[number_of_samples, number_of_features]将标准化特征(X的每一列),以便每个列/特征/变量将具有StandardScaler()mean = 0.


例:

from sklearn.preprocessing import StandardScaler
import numpy as np

# 4 samples/observations and 2 variables/features
data = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

print(data)
[[0, 0],
 [1, 0],
 [0, 1],
 [1, 1]])

print(scaled_data)
[[-1. -1.]
 [ 1. -1.]
 [-1.  1.]
 [ 1.  1.]]
Run Code Online (Sandbox Code Playgroud)

验证每个要素(列)的平均值是否为0:

scaled_data.mean(axis = 0)
array([0., 0.])
Run Code Online (Sandbox Code Playgroud)

验证每个功能(列)的std是否为1:

scaled_data.std(axis = 0)
array([1., 1.])
Run Code Online (Sandbox Code Playgroud)


kri*_*_na 17

StandardScaler执行标准化任务.通常,数据集包含规模不同的变量.例如,Employee数据集将包含AGE列,其值为20-70,SALARY列的值为10000-80000.
由于这两列的规模不同,它们在建立机器学习模型时具有标准化,具有共同的规模.


LCJ*_*LCJ 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
Run Code Online (Sandbox Code Playgroud)

计算

正如您在输出中看到的,均值是 [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 缩放的数据均值不为零


Ric*_*lia 7

当您想要比较对应于不同单位的数据时,这很有用。在这种情况下,您要删除单元。要以一致的方式处理所有数据,请以方差为单位且序列的均值为0的方式转换数据。


Tho*_*ves 6

上面的答案很好,但是我需要一个简单的例子来减轻过去的担忧。我想确保它确实单独处理了每一列。现在,我可以放心了,找不到什么例子引起了我的关注。如上所述,所有列均按比例缩放。

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)
Run Code Online (Sandbox Code Playgroud)

输出值

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)
Run Code Online (Sandbox Code Playgroud)

  • 为什么方差不是 1? (2认同)