簡體   English   中英

Sklearn StandardScaler 顯示不正確的值

[英]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

為什么標准差不相等?

StandardScaler 文檔

筆記

...

我們對標准偏差使用有偏估計,相當於 numpy.std(x, ddof=0)。 請注意,ddof 的選擇不太可能影響模型性能。

而來自pandas.DataFrame.std 文檔

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM