python - Numpy.var() 和 Pandas.var() 的不同值
问题描述
我正在学习一些关于数据集中的标准缩放器的知识。我注意到一个奇怪的行为,我认为这可能是我的代码中的语法或逻辑错误,但任何人都可以纠正我。
正如我们所知,当我们这样做时StandardScaler
,我们有一个std
1 和mean
0 作为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
希望你明白我想说的话。
解决方案
问题是由于使用了不同的自由度。scikit-learn 文档声明他们使用有偏估计量或样本方差:
我们对标准差使用有偏差的估计器,相当于 numpy.std(x, ddof=0)。请注意,ddof 的选择不太可能影响模型性能。
另一方面,DataFrame.var
默认情况下是无偏估计量
返回请求轴上的无偏方差。默认由 N-1 归一化。这可以使用 ddof 参数进行更改
只有 3 个点,除以 3 或 2 之间的差异将导致 1.5 倍的差异(正是您所看到的)。使用ddof=0
for 来解决这个问题DataFrame.var()
print(catDf.var(ddof=0))
#GDP 1.0
#Area 1.0
推荐阅读
- marklogic-9 - MarkLogic 转换器升级
- python - 如何计算熊猫过去N行中出现的次数
- html - Html/CSS - 使单个网页响应式
- sql - 在 posgreSQL 函数中使用 If else - 语法错误
- puppeteer - 除非手动打开带有 headless:false 的新标签,否则 Puppeteer 会被阻止
- google-chrome-extension - chrome 扩展 - 如何使用 window.tabs?
- javascript - 为什么地理定位给我的当前位置错误的导航器当前位置方法?
- qt - 使用 If 语句更新小部件颜色
- python - 如何从 dcc.Store 中保存和访问多个数据帧
- docker - 带有 url_for _external=True 的电子邮件,从 docker 容器发送,在返回链接中发送 localhost。需要主机子域