box-cox变换

@创建于:20210322
@修改于:20210322

文章目录

        • 1、简介
        • 2、理论知识
        • 3、python使用
        • 4、参考文献

1、简介

Box-Cox变换是Box和Cox在1964年提出的一种广义幂变换方法,是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。

  • Box-Cox变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。
  • Box-Cox变换的主要特点是引入一个参数,通过数据本身估计该参数进而确定应采取的数据变换形式,Box-Cox变换可以明显地改善数据的正态性、对称性和方差相等性,对许多实际数据都是行之有效的。
  • Box-Cox变换即将数据转换为满足正态分布的数据

2、理论知识

(1)数学公式
box-cox变换_第1张图片

(2)特殊情况
当 λ 分别取下列数值时,我们会得到一系列耳熟能详的函数
box-cox变换_第2张图片
一般常用的是整数,若计算的 λ \lambda λ为非整数时,可以使用其临近的值。

3、python使用

(1)非负性
python中,Box-Cox的y>0,否则会报错,即:ValueError: Data must be positive.
所以对于y<0的情况,可以给y加上一个常数C进行调整,即得如下所示:
在这里插入图片描述
(2)正向Box-Cox使用
首先该变换均在scipy模块之下,主要有以下两个地方:

from scipy.stats import boxcox   # 1
from scipy.special import boxcox   # 2

区别在于,1中包含了box-cox中的lambda计算(即不需要给函数boxcox输入参数lmbda,boxcox返回值中就有lambda),所以其格式为:

y, lambda0 = boxcox(x, lmbda=None, alpha=None)

lambda的计算方法一般为最大似然估计方法和Bayes方法。

而2中不包含lambda的计算,所以其函数参数必填的为数据data和lambda。

y = boxcox(x1, x2, *args, **kwargs)

(3)逆向Box-Cox变换
通常我们在Box-cox变换之后,将预处理后的数据投入到模型中进行训练,如果变换处理的是标签,那么还需要对测试集的预测值进行反Box-Cox变换,Python实现如下:

from scipy.special import inv_boxcox
y = inv_boxcox(x1, lambda)

其中x为需要进行反Box-Cox变换的数据,lamda为训练集Box-Cox时使用的lambda,一般即为上文中stats.boxcox()返回的第二个参数。需要注意:如果在训练集Box-Cox变换时使用了C常数进行了自变量的非零处理,那么还需要再反变换之后减去这个C常数。

4、参考文献

box-cox变换
BoxCox以及反变换的简介和Python实现

你可能感兴趣的:(机器学习)