数据预处理—5.box-cox变换及python实现


接上一篇:


1.box-cox变换是什么?

  Box-Cox变换是Box和Cox在1964年提出的一种广义幂变换方法,是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。Box-Cox变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。Box-Cox变换的主要特点是引入一个参数,通过数据本身估计该参数进而确定应采取的数据变换形式,Box-Cox变换可以明显地改善数据的正态性、对称性和方差相等性,对许多实际数据都是行之有效的。
  通俗来讲,Box-Cox变换就是来修正偏态和峰度以使得原始分布接近正态分布,修正后的分布满足了线性回归假设中的正态性与同方差。Box-Cox变换的一个显著优点是通过求变换参数来确定变换形式,而这个过程完全基于数据本身而无须任何先验信息,这无疑比凭经验或通过尝试而选用对数、平方根等变换方式要客观和精确。
  Box-Cox变换的目的是为了让数据满足线性模型的基本假定,即线性、正态性及方差齐性,然而经Box-Cox变换后数据是否同时满足了以上假定,仍需要考察验证

2.python实现

  scipy.special.boxcox1p是Box-Cox变换的函数。scipy.stats.boxcox_normmax是用来计算输入数据的最佳Box-Cox变换参数,即scipy.special.boxcox1p函数中的lamda。

scipy.special.boxcox1p(x, lmbda)

python实现

## Import necessary modules 
from scipy.special import boxcox1p
from scipy.stats import boxcox_normmax

def fixing_skewness(df):
    """
    This function takes in a dataframe and return fixed skewed dataframe
    """
    # 得到所有非类别型变量
    numeric_feats = df.dtypes[df.dtypes != "object"].index

    # 计算所有非类别型特征的偏态并排序
    skewed_feats = df[numeric_feats].apply(lambda x: x.skew()).sort_values(ascending=False)
    # 对偏态大于0.5的进行修正,大于0是右偏,小于0是左偏
    high_skew = skewed_feats[abs(skewed_feats) > 0.5]
    skewed_features = high_skew.index

    # 修正
    for feat in skewed_features:
    	# 这里是+1是保证数据非负,否则会弹出错误,没有其他含义,不会影响对偏态的修正
        df[feat] = boxcox1p(df[feat], boxcox_normmax(df[feat] + 1))

举例:
修正前:
在这里插入图片描述
修正后:
在这里插入图片描述

2.1逆变换

如果变换的是目标变量,那么还需要对测试集的预测值进行反Box-Cox变换,
Python实现

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

其中x为需要进行反Box-Cox变换的数据,即预测值,lamda为训练集Box-Cox时使用的lambda,如果在训练集Box-Cox变换时使用了C常数(即上面中的+1)进行了非零处理,那么还需要再反变换之后减去这个C常数。

参考:

  1. box-cox变换

如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论留言!
在这里插入图片描述


  • 33
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值