谁能给我解释一下 StandardScaler?
Can anyone explain me StandardScaler?
我无法理解 sklearn
文档中 StandardScaler
的 page。
任何人都可以简单地向我解释一下吗?
当您想要比较对应于不同单位的数据时,这很有用。在这种情况下,您想要删除这些单位。要以所有数据的一致方式做到这一点,您可以以方差单一且序列均值为 0 的方式转换数据。
StandardScaler
背后的想法是,它将转换您的数据,使其分布的平均值为 0,标准差为 1。
在多变量数据的情况下,这是按特征完成的(换句话说,对于数据的每一列都是独立的)。
给定数据的分布,数据集中的每个值将减去平均值,然后除以整个数据集(或多变量情况下的特征)的标准差。
计算方法:
您可以在此处阅读更多内容:
应用 StandardScaler()
后,X 中的每一列 均值为 0,标准差为 1。
此页面上其他人列出的公式。
基本原理:一些算法要求数据看起来像这样(参见 sklearn docs)。
简介
我假设你有一个矩阵 X
其中每个 row/line 是一个 sample/observation 并且每个 列 是一个 variable/feature(顺便说一下,这是任何 sklearn
ML 函数的预期输入 - - X.shape
应该是 [number_of_samples, number_of_features]
).
方法核心
主要思想是 normalize/standardize 即 μ = 0
和 σ = 1
你的 features/variables/columns of X
, 单独,在应用任何机器学习模型之前。
StandardScaler()
will normalize the features i.e. each
column of X, INDIVIDUALLY, so that each column/feature/variable will have μ = 0
and σ = 1
.
P.S: 我发现此页面上投票最多的答案是错误的。
我引用“数据集中的每个值都会减去样本平均值”——这既不正确也不正确。
另请参阅:How and why to Standardize your data: A python tutorial
代码示例
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.]]
验证每个特征(列)的均值为0:
scaled_data.mean(axis = 0)
array([0., 0.])
验证每个特征(列)的std为1:
scaled_data.std(axis = 0)
array([1., 1.])
附录:数学
更新 08/2020:关于输入参数 with_mean
和 with_std
到 False
/True
,我有在这里提供了答案:StandardScaler difference between “with_std=False or True” and “with_mean=False or True”
StandardScaler 执行标准化的任务。通常一个数据集包含不同尺度的变量。例如Employee 数据集将包含 AGE 列,其值 范围为 20-70 和 SALARY 列,其范围为 范围为 10000-80000.
由于这两列的比例不同,因此在构建机器学习模型时将它们标准化为具有共同的比例。
上面的答案很好,但我需要一个简单的例子来减轻我过去的一些顾虑。我想确保它确实在分别处理每一列。我现在放心了,找不到让我担心的例子。所有列 ARE 均按上述说明分别缩放。
代码
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
以下是一个简单的工作示例,用于说明标准化计算的工作原理。理论部分已经在其他答案中得到很好的解释。
>>>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。
参考文献
我们按行应用 StandardScalar()
。
因此,对于列中的每一行(我假设您正在使用 Pandas DataFrame):
x_new = (x_original - mean_of_distribution) / std_of_distribution
几点-
它被称为标准标量,因为我们将它除以分布的标准差(特征的分布)。同样,你可以猜测 MinMaxScalar()
.
应用StandardScalar()
后原始分布保持不变。将分布更改为正态分布是一种常见的误解。我们只是将范围压缩到 [0, 1].
我无法理解 sklearn
文档中 StandardScaler
的 page。
任何人都可以简单地向我解释一下吗?
当您想要比较对应于不同单位的数据时,这很有用。在这种情况下,您想要删除这些单位。要以所有数据的一致方式做到这一点,您可以以方差单一且序列均值为 0 的方式转换数据。
StandardScaler
背后的想法是,它将转换您的数据,使其分布的平均值为 0,标准差为 1。
在多变量数据的情况下,这是按特征完成的(换句话说,对于数据的每一列都是独立的)。
给定数据的分布,数据集中的每个值将减去平均值,然后除以整个数据集(或多变量情况下的特征)的标准差。
计算方法:
您可以在此处阅读更多内容:
应用 StandardScaler()
后,X 中的每一列 均值为 0,标准差为 1。
此页面上其他人列出的公式。
基本原理:一些算法要求数据看起来像这样(参见 sklearn docs)。
简介
我假设你有一个矩阵 X
其中每个 row/line 是一个 sample/observation 并且每个 列 是一个 variable/feature(顺便说一下,这是任何 sklearn
ML 函数的预期输入 - - X.shape
应该是 [number_of_samples, number_of_features]
).
方法核心
主要思想是 normalize/standardize 即 μ = 0
和 σ = 1
你的 features/variables/columns of X
, 单独,在应用任何机器学习模型之前。
StandardScaler()
will normalize the features i.e. each column of X, INDIVIDUALLY, so that each column/feature/variable will haveμ = 0
andσ = 1
.
P.S: 我发现此页面上投票最多的答案是错误的。 我引用“数据集中的每个值都会减去样本平均值”——这既不正确也不正确。
另请参阅:How and why to Standardize your data: A python tutorial
代码示例
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.]]
验证每个特征(列)的均值为0:
scaled_data.mean(axis = 0)
array([0., 0.])
验证每个特征(列)的std为1:
scaled_data.std(axis = 0)
array([1., 1.])
附录:数学
更新 08/2020:关于输入参数 with_mean
和 with_std
到 False
/True
,我有在这里提供了答案:StandardScaler difference between “with_std=False or True” and “with_mean=False or True”
StandardScaler 执行标准化的任务。通常一个数据集包含不同尺度的变量。例如Employee 数据集将包含 AGE 列,其值 范围为 20-70 和 SALARY 列,其范围为 范围为 10000-80000.
由于这两列的比例不同,因此在构建机器学习模型时将它们标准化为具有共同的比例。
上面的答案很好,但我需要一个简单的例子来减轻我过去的一些顾虑。我想确保它确实在分别处理每一列。我现在放心了,找不到让我担心的例子。所有列 ARE 均按上述说明分别缩放。
代码
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
以下是一个简单的工作示例,用于说明标准化计算的工作原理。理论部分已经在其他答案中得到很好的解释。
>>>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。
参考文献
我们按行应用 StandardScalar()
。
因此,对于列中的每一行(我假设您正在使用 Pandas DataFrame):
x_new = (x_original - mean_of_distribution) / std_of_distribution
几点-
它被称为标准标量,因为我们将它除以分布的标准差(特征的分布)。同样,你可以猜测
MinMaxScalar()
.应用
StandardScalar()
后原始分布保持不变。将分布更改为正态分布是一种常见的误解。我们只是将范围压缩到 [0, 1].