StandardScaler 给出不均匀的标准偏差

StandardScaler giving non-uniform standard deviation

我的问题设置如下:Python 3.7,Pandas 版本 1.0.3,sklearn 版本 0.22.1。我按照惯例应用 StandardScaler (对浮点矩阵的每一列)。但是,我得到的列没有标准偏差 = 1,而它们的平均值(大约)为 0。

我不确定这里出了什么问题,我检查了 scaler 是否混淆并标准化了行,但事实似乎并非如此。

from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np
np.random.seed(1)
row_size = 5
n_obs = 100
X = pd.DataFrame(np.random.randint(0,1000,n_obs).reshape((row_size,int(n_obs/row_size)))

scaler = StandardScaler()
scaler.fit(X)
X_out = scaler.transform(X)
X_out = pd.DataFrame(X_out)

所有列都有标准偏差 1.1180... 而不是 1。

X_out[0].mean()
>>Out[2]: 4.4408920985006264e-17
X_out[0].std()
>>Out[3]: 1.1180339887498947

编辑: 当我在上面增加 row_size 时,我已经意识到,例如从 5 到 10 和 100,列的标准偏差接近 1。所以这可能与方差估计量的偏差随着 n 的增加而变小有关(?)。但是,我可以通过手动实现 (col[i]- col[i].mean() )/ col[i].std() 来获得单位方差是没有意义的,但是 StandardScaler 却很挣扎...

Numpy 和 Pandas 使用不同的标准差定义(有偏与无偏)。 Sklearn 使用 numpy 定义,因此 scaler.transform(X).std(axis=1) 的结果为 1s.

但随后您将标准化值 X_out 包装在 pandas DataFrame 中,并要求 pandas 为您提供相同值的标准差,然后得出您的观察结果。

在大多数情况下,您只关心具有相同分布的所有列,因此差异并不重要。但是如果你真的想要无偏标准偏差,你不能使用 sklearn 中的 StandardScaler。