【发布时间】:2019-09-04 15:01:55
【问题描述】:
我正在使用sklearn.preprocessing.StandardScaler 重新调整我的数据。我想用np.std 和StandardScaler 做同样的事情。
但是,我发现一个有趣的事情是,在 pandas.apply(fun = np.std) 中没有传递其他参数时,输出在样本标准和总体标准之间有所不同。 (见第 2 题)
我知道有一个参数叫做ddof,它在计算样本方差时控制除数。不改变默认参数ddof = 0,我怎么能得到不同的输出!
1 个数据集:
首先,我选择 iris 数据集作为示例。我按如下方式缩放数据的第一列。
from sklearn import datasets
import numpy as np
from sklearn.preprocessing import StandardScaler
iris = datasets.load_iris()
X_train = iris.data[:,[1]] # my X_train is the first column if iris data
sc = StandardScaler()
sc.fit(X_train) # Using StandardScaler to scale it!
2 问题:没有更改默认 ddof = 0 我得到了不同的 np.std 输出!
import pandas as pd
import sys
print("The mean and std(sample std) of X_train is :")
print(pd.DataFrame(X_train).apply([np.mean,np.std],axis = 0),"\n")
print("The std(population std) of X_train is :")
print(pd.DataFrame(X_train).apply(np.std,axis = 0),"\n")
print("The std(population std) of X_train is :","{0:.6f}".format(sc.scale_[0]),'\n')
print("Python version:",sys.version,
"\npandas version:",pd.__version__,
"\nsklearn version:",sklearn.__version__)
输出:
The mean and std(sample std) of X_train is :
0
mean 3.057333
std 0.435866
The std(population std) of X_train is :
0 0.434411
dtype: float64
The std(population std) of X_train is : 0.434411
Python version: 3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]
pandas version: 0.23.4
sklearn version: 0.20.1
根据以上结果,pd.DataFrame(X_train).apply([np.mean,np.std],axis = 0) 给出样本标准 0.435866,而pd.DataFrame(X_train).apply(np.std,axis = 0) 给出总体标准 0.434411。
3 我的问题:
-
为什么使用
pandas.apply会返回不同的结果? -
如何将附加参数传递给
np.std,以提供人口标准?
pd.DataFrame(X_train).apply(np.std,ddof = 1) 可以做到。但我想知道pd.DataFrame(X_train).apply([np.mean,np.std],**args)
【问题讨论】:
标签: python pandas numpy scikit-learn