Python数据缩放、居中和Box-Cox转换库

6

有没有Python中的包可以进行数据转换:缩放、居中和Box-Cox转换以消除数据的偏斜?在R中,这可以使用caret包来实现:

set.seed(1)
predictors = data.frame(x1 = rnorm(1000,
                                   mean = 5,
                                   sd = 2),
                        x2 = rexp(1000,
                                  rate=10))

require(caret)

trans = preProcess(predictors, 
                   c("BoxCox", "center", "scale"))
predictorsTrans = data.frame(
      trans = predict(trans, predictors))

我知道sklearn,但是我找不到上述提到的处理函数。

2个回答

17

你可以使用sklearnpreprocessing来进行缩放和居中处理:


from sklearn import preprocessing
centered_scaled_data = preprocessing.scale(original_data)

对于Box-Cox,您可以使用scipy中的boxcox函数:

from scipy.stats import boxcox
boxcox_transformed_data = boxcox(original_data)

要计算偏度,您可以使用scipy中的skew

from scipy.stats import skew
skness = skew(original_data)

您可以在此文章中了解有关解决偏斜的更多细节。此外,您还可以在此处了解有关居中和缩放的更多详细信息


1
scikit-learn正在逐步添加对Box-Cox转换的支持:https://github.com/scikit-learn/scikit-learn/issues/6675 - skeller88
7
两个链接都失效了。 - Daniel Soutar
通过使用sklearn.preprocessing,您可以对数据进行缩放或转换。 注意:在sklearn版本0.23中,功率变换器的默认方法是“Yeo-Johnson”,而不是之前版本的Box-cox [Box-cox仅适用于非负数据] 何时使用哪个标量和转换的很好比较总结在https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#normalizer上。 - Dr Nisha Arora

2
现在,scikit-learn有一个方法可以做你想要的事情。这提供了一个熟悉的API,并且很容易放入管道中。
sklearn版本0.20.0通过power_transform方法提供了一个Box-Cox转换。该方法应用Box-Cox,然后对数据应用零均值、单位方差的归一化处理。您可以使用(standardize=False)编辑默认归一化。
sklearn.preprocessing.power_transform(X, method=’box-cox’, standardize=True, copy=True)

逐个特征应用幂变换,使数据更接近高斯分布。幂变换是一类参数化的单调变换,用于使数据更接近高斯分布。这对于建模异方差(非常数方差)相关问题或其他需要正态性的情况非常有用。目前,power_transform() 支持 Box-Cox 变换。Box-Cox 要求输入数据严格为正。通过最大似然估计来估计稳定方差和最小化偏度的最佳参数。默认情况下,对转换后的数据进行零均值、单位方差归一化处理。

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.power_transform.html

主要文档页面没有提到,但是power_transform还支持Yeo-Johnson变换。
文档在这里也有一个很好的解释: http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing-transformer

这是一个你提到的不错的库,但我几乎忽略了它。考虑通过添加一些代码行来编辑你的答案。 - Eulenfuchswiesel
这确实是一个很好的答案。使用scikit-learn的替代方案也是验证通过Scipy获得的转换的好方法。 - Jakob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接