首页 > 解决方案 > Numpy.var() 和 Pandas.var() 的不同值

问题描述

我正在学习一些关于数据集中的标准缩放器的知识。我注意到一个奇怪的行为,我认为这可能是我的代码中的语法或逻辑错误,但任何人都可以纠正我。

正如我们所知,当我们这样做时StandardScaler,我们有一个std1 和mean0 作为Var = Stdev^2

现在,当我在我的代码中使用它时sklearn.preprocessing.StandardScaler,使用后fit_transform,方差是1. 但是当我更改原始数据框中的值时,两行都是 1.5。我能知道为什么会这样以及如何使用StandardScaler. 谢谢。

这是我的数据集

    Country GDP Area    Continent
0   India   2.79    3.287   Asia
1   USA    20.54    9.840   North America
2   China   13.61   9.590   Asia 

这是我的代码

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()

var =  ss.fit_transform(catDf.iloc[:,1:-1]).var() #This variance is equal to 1

catDf.iloc[:,1:-1] = ss.fit_transform(catDf.iloc[:,1:-1]) 

print("Variance in Numpy array", var) # Approx 1
print("Variance in Data Frame", catDf.var())# 1.5 for both numerical columns

希望你明白我想说的话。

标签: pythonpandasnumpyscikit-learnstatistics

解决方案


问题是由于使用了不同的自由度。scikit-learn 文档声明他们使用有估计量或样本方差:

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

另一方面,DataFrame.var默认情况下是无偏估计量

返回请求轴上的无偏方差。默认由 N-1 归一化。这可以使用 ddof 参数进行更改

只有 3 个点,除以 3 或 2 之间的差异将导致 1.5 倍的差异(正是您所看到的)。使用ddof=0for 来解决这个问题DataFrame.var()

print(catDf.var(ddof=0))
#GDP     1.0
#Area    1.0

推荐阅读