非正态分布转换成正态分布

转换原因

对于机器学习中经常使用的线性回归模型, 要求每个特征变量与回归值yy有线性关系, 且总体的误差ε\varepsilon也不是一个正态分布, 并且和预测变量yy是相关的. 而好的回归模型, 最后得到的残差应当有独立性, 正态性, 方差齐性等特性.

对于线性回归模型的学习, 一般是使用最小二乘计算系数的, 而最小二乘要求回归值的正态分布, 给最后的结果带来误差. 因此需要对回归值做非正态到正态分布的转换.

转换步骤

首先需要对回归的观测值进行正态分布检测, 根据检测方法得到的p值大小判断是否需要做转化. 且如果p值很小, 说明与正态分布的差距较大, 需要使用Box-Cox转换方法进行处理.

变换的目的有:

  • 一定程度上减小不可观测的误差和预测变量的相关性

  • 使得因变量获得一些性质, 比如在时间序列分析中的平稳性, 或者使得因变量分布为正态分布

正态分布检验

一般在回归分析中, 需要对数据进行正态分布的检验. 在常规的统计分析中, 经常使用以下方法进行正态分布的检验.

Q-Q图

Q-Q图是一种散点图, 横坐标为某一样本的分位数, 纵坐标为另一样本的分位数. 对于正态分布的检验, 应以标准正态分布的分位数为横坐标, 观测样本集的分位数为纵坐标, 绘制成的散点图.

如果图中点都集中在直线y=xy=x附近(样本符合标准正态分布)或者y=kx+by=kx+b附近(样本符合正态分布), 则代表样本点符合正态分布.

关于Q-Q图的绘制即意义参考:

与Q-Q图类似的还有P-P图.

Python中的正态分布检验方法

使用作图的方法检验是否符合正态分布不够方便, 且无法定量. 统计学中有很多对正态分布进行检验的方法, Python的计算包中采用了以下几种.

kstest

除了检验正态分布, kstest还可以进行scipy.stats中包含的所有分布. 使用方法参考文档.

Anderson-Darling test

Anderson-Darling test是kstest的增强版. 也可以做多种分布的检验, 默认的检验时正态性检验.

需要注意这个函数返回三个值, 分别为统计数, 评判值, 显著性水平. 后面两个都是列表, 列举了在多个显著性水平下, 判定的情况.

Shapiro-Wilk test

Shapiro-Wilk test只能检验正态分布. 原假设为样本符合正态分布. 该检验不适合对大的样本数据进行检验, 得到的检验结果的P值可能不准确. 这里的大样本集合指的是样本数量大于5000.

normaltest

normaltest也是专门做正态性检验的模块.

转换方法

对于接近正态分布的样本集(使用P值判断, 例如P值大于0.003, 小于0.05时), 使用一些普通的转换函数即可满足需求.

  • 平方: y=x2y=x^2

  • 对数: y=lnxy=\ln x

  • 导数: y=1xy=\frac{1}{x}

  • 平方根: y=xy=\sqrt x

  • 平方根倒数: y=1xy=\frac{1}{\sqrt x}

  • 平方根, 反正弦: y=arcsinxy=\arcsin \sqrt x

如果样本分布与正态分布的差异较大, 可以使用box-cox方法进行变换, 参考: BOX-COX变换

在Python中使用该转换方法参考: scipy.stats.boxcox

最后更新于