前言
通常情况下,我们拿到的数据并不是正态分布的,为了满足经典线性模型的正态性假设,
常常需要使用
1、指数变换
2、对数转化
3、倒数转换
4、平方根后取倒数
5、平方根后再取反正弦
使其转换后的数据接近正态,Box-Cox变换可以使线性回归模型在满足线性、正态性、独立性以及方差齐性的同时,又不丢失信息。变换后有利于线性模型的拟合以及分析出特征的相关性。
一、BOX-COX变换的优点?
1、Box-Cox变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。
2、Box-Cox变换的主要特点是引入一个参数,通过数据本身估计该参数进而确定应采取的数据变换形式,Box-Cox变换可以明显地改善数据的正态性、对称性和方差相等性,对许多实际数据都是行之有效的。
3、Box-Cox变换即将数据转换为满足正态分布的数据
二、BOX-COX实战
注意:在做Box-Cox变换之前,需要对数据做归一化预处理。在归一化时,对数据进行合并操作可以使训练数据和测试数据一致。也可以分开对训练数据和测试数据进行归一化处理,不过这种方式建立在训练数据和测试数据分布一致的情况下,建议在数据量较大的情况下使用。
# 函数详解 # scipy.stats.boxcox(x, lmbda=None, alpha=None) # x:输入数组 # 返回 # boxcox:Box-COx次方转换数组 # maxlog:找到的最佳变换参数,如果lmbda参数是None并且alpha不是None,这个返回的浮点数元组表示在给定alpha下最小和最大置信限制
实战分析:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from scipy import stats import warnings # 注意,这里的V0特征值已经经过归一化处理。 dat = train_data_process[['V0', 'target']] plt.figure(figsize=(10,10)) ax=plt.subplot(2,2,1) sns.distplot(dat['V0'],fit=stats.norm) ax=plt.subplot(2,2,2) res = stats.probplot(dat['V0'], plot=plt) # 这里为什么要加一?? # boxcox要求输入的数据是正值,这里的输入值一般是经过预处理后的,有一个固定的范围,如果存在非正值,则需要加上一个常数,保证输入值为正值。 trans_var, lambda_var = stats.boxcox(dat['V0'].dropna()+1) print() # scale_minmax: 自定义的归一化函数,资料显示还要这么处理,但是实际过程中发现加不加这一步影响不大。 trans_var = scale_minmax(trans_var) ax=plt.subplot(2,2,3) sns.distplot(trans_var,fit=stats.norm) ax=plt.subplot(2,2,4) res = stats.probplot(trans_var, plot=plt)
输出:第一行是归一化之后,boxcox之前的数据分布,第二行是boxcox之后的数据分布。
参考文章:
总结
天又黑了,看起来要下雨的样子。