[英]Sklearn StandardScaler showing incorrect values
我正在使用StandardScaler()
對 Pandas 數據框進行標准化,但是當我手動計算它時,我得到了不同的結果。
這是我的 DataFrame,名為blood_df
:
dbp sbp weight height
0 82.6 132.1 71 172
1 79.1 129.9 79 180
2 81.7 131.2 78 172
3 80.7 132.1 66 166
4 74.9 125.0 70 173
5 79.1 129.1 64 162
6 83.8 133.1 60 164
7 78.4 127.0 67 165
8 82.3 131.6 64 164
9 79.4 129.2 77 179
我使用
scaler = StandardScaler()
scaler.fit(blood_df)
blood_scaled = scaler.transform(blood_df)
得到blood_scaled
。 使用blood_scaled['dbp'].describe()
我得到:
count 1.000000e+01
mean 4.618528e-15
std 1.054093e+00
min -2.163355e+00
25% -4.489983e-01
50% -6.122704e-02
75% 7.959515e-01
max 1.469449e+00
Name: 0, dtype: float64
但是,僅查看縮放數據的列dbp
,它與我使用z = (x - u) / s
手動計算時不同:
((blood_df['dbp'] - blood_df['dbp'].mean()) / blood_df['dbp'].std()).describe()
給出:
count 1.000000e+01
mean 4.418688e-15
std 1.000000e+00
min -2.052339e+00
25% -4.259572e-01
50% -5.808507e-02
75% 7.551059e-01
max 1.394042e+00
Name: dbp, dtype: float64
為什么標准差不相等?
筆記
...
我們對標准偏差使用有偏估計,相當於 numpy.std(x, ddof=0)。 請注意,ddof 的選擇不太可能影響模型性能。
ddof : int, 默認 1
Delta 自由度。 計算中使用的除數是 N - ddof,其中 N 表示元素的數量。
在這種情況下, ddof
用於標准偏差公式,用N - ddof
替換分母N
,例如:
std = (sum((x - x.mean())**2) ** 0.5) / (N - ddof)
因此,默認情況下, StandardScaler
使用ddof = 0
,而pandas.DataFrame.std
使用ddof = 1
。
如果您嘗試在手動公式中指定ddof
,您可以看到這是造成差異的原因:
((blood_df['dbp'] - blood_df['dbp'].mean()) / blood_df['dbp'].std(ddof = 0)).describe()
給出與StandardScaler
相同的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.