问题描述
我正在使用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()
结果是
平均值为-1.516402e-16
,几乎为0。相反,方差为1.012423e+00
,即1.012423
。对我而言,1.012423
不被视为1附近。
请您详细说明这种现象吗?
解决方法
在这种情况下,sklearn
和pandas
的计算方式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
。