为什么sklearn归一化数据的方差不等于1?

问题描述

我正在使用preprocessing软件包中的sklearn来规范化数据,如下所示:

import pandas as pd
import urllib3
from sklearn import preprocessing

decathlon = pd.read_csv("https://raw.githubusercontent.com/leanhdung1994/Deep-Learning/main/decathlon.txt",sep='\t')
decathlon.describe()

nor_df = decathlon.copy()
nor_df.iloc[:,0:10] = preprocessing.scale(decathlon.iloc[:,0:10])
nor_df.describe()

结果是

enter image description here

平均值为-1.516402e-16,几乎为0。相反,方差为1.012423e+00,即1.012423。对我而言,1.012423不被视为1附近。

请您详细说明这种现象吗?

解决方法

在这种情况下,sklearnpandas的计算方式std不同。

sklearn.preprocessing.scale

对于标准偏差,我们使用偏差估算器,等效于 numpy.std(x,ddof=0)。请注意,ddof的选择不太可能 影响模型性能。

pandas.Dataframe.describe使用pandas.core.series.Series.std,其中:

默认情况下被N-1标准化。可以使用ddof参数更改

...

ddof:int,默认1 Delta自由度。计算中使用的除数为N-ddof, 其中N表示元素数。

请注意,在2020-10-28中,pandas.Dataframe.describe没有ddof参数,因此ddof=1始终使用默认值Series