scipy.stats.boxcox ValueError: Data must be positive.
在使用stats.boxcox的时候,碰到下面的情况
stats.boxcox(data[col].dropna()+1)
其中:data为DataFrame类型,col为列名,
+1就比较蒙了。
官方文档说明:
The Box-Cox transform is given by:
y = (x**lmbda - 1) / lmbda, for lmbda > 0
log(x), for lmbda = 0
boxcox
requires the input data to be positive. Sometimes a Box-Cox transformation provides a shift parameter to achieve this; boxcox
does not. Such a shift parameter is equivalent to adding a positive constant to x before calling boxcox
.
boxcox要求输入的数据是正值,这里的输入值一般是经过预处理后的,有一个固定的范围,如果存在非正值,则需要加上一个常数,保证输入值为正值。
Box-Cox变换可以使模型满足线性性、独立性、方差齐性以及正态性的同时,又不丢失信息。
一些结论:
1、使用Box-Cox变换后的数据得到的回归模型优于变换前的模型,变换可以使模型的解释力度等性能更加优良
2、使用Box-Cox变换后,残差可以更好的满足正态性、独立性等假设前提,降低了伪回归的概率。
3、使用Box-Cox变换族一般都可以保证将数据进行成功的正太变换,但在二分量或较少水平的等级变量的情况下,不能成功地进行变换,此时,我们可以考虑使用广义线性变换,如LOGUSTICS模型、Johnson转换等。
4、进行数据变换并不一定会达到我们预定的目标,没有一个数学原理保证所做的数据变换就一定在各个方面对原始数据有所改善,更常见的是,为一个目的所做的变换可能仅仅使得原始数据的一个或几个方面得到改善。Box-Cox变换的一个很大的优势在于对选择变换的问题给出了一个系统化的处理方法,将寻找变换的问题转化为一个估计参数lamda的过程。