特征工程——转换为正态分布(新更的内容干货满满)

                                        几张图帮助快速了解内容

https://blog.csdn.net/weixin_40040404/article/details/83025039

特征处理之使数据分布逼近正态分布

在机器学习和深度学习中,我们经常要对输入的数据做归一化或者在隐藏层使用Batch-Normlization(BN)操作,将数据范围缩放到[0,1]或者[-1, 1]之间,主要作用:可以加快神经网络训练速度,防止过拟合。然而无论做归一化还是BN处理,虽然将数据的均值变为0,方差变为1,但是数据的整体分布并不一定服从标准的正态分布(实际数据大部分时候都不会是),做归一化和BN时,我们求出来的均值和方差,并不能说明我们数据是服从正态分布的。

我们在进行机器学习/深度学习训练的时候,往往希望数据越接近正态分布越好,这样对于训练效果会有明显的提升。

————————————新更分割线————————————

这里想讨论两点:为什么要用正态分布转换,以及什么情况下做正态分布转换。

正态分布转换有个大前提:你要做回归预测、你的学习模型涉及到联合分布概率或者参数距离的概念。

那我解释一下,

1. 如果是分类预测,你的特征-标签联合分布是一簇一簇的,没意义。另外分类中特征为正态分布,不太适合做有效特征(相关性很小的,几乎没有贡献)。

2. 如果是Tree model,对数据正态分布转换没有意义,他本质是划分特征,根据数据分布,不断去划分数据,最终得到各个叶节点,机器自己给你划分。你做了正态分布转换,只是让机器好划分一些。。。

回到提出的两个问题:

为什么要用正态分布转换

1. 首先有些模型的应用条件就是要求你的数据满足正态性分布的,比如说贝叶斯、逻辑回归、KNN、Kmean等涉及到概率分布、参数距离比较等,转换为正态分布,模型条件更充足。但并不意味着你的模型结果会更好一点。(很玄学吧,您接着看)

2. 其次正态分布,数据的泛化性高。因为自然界很多事物的概率密度很大是正态分布,你一个偏态分布(这叫数据不均衡,我这再抛个砖),会导致机器学歪了,然后用这个“歪”模型测试数据会很靠谱吗?

3. 从目标分布来说,偏态分布会导致label数据的MSE出现误导,或许结果看着很小,但实际结果很大,你可以考虑纠正一下分布正态性。(这个您自己想像,但是这个说服力不够,可以不当回事吧)

什么情况下做正态分布转换

满足大前提之后!!!再看啥时候用,小宝贝~

1. 也不是说所有分布都要转换为正态分布的,因为你不能保证正态分布就很有效,其次不是所有数据分布都类似于正态分布,可能是其他乱七八槽的分布,又或许是大数定理下的分布渐进正态性。(比如泊松分布、卡方分布等),针对这些非正态分布你就别动它啦。————什么情况下不做正态转换

2. 所以我们认为偏态分布最好纠正,或许有用(理论上有用,实际上可能没用,因为数据量的分布限制)。这就好比于“你打个喷嚏可以吃板蓝根,或许有用,或许没用,但绝对不会导致你喷嚏更加严重”,就是说针对偏态分布,你可以正态化一下,肯定不会有影响哈哈哈。这叫“不妨正态化”的说法,PS:这个不是我提的,是我一个USC的同学和我谈到了这个名词“不妨正态化”,有点意思。————什么情况下做正态分布转化

其实生活中很多都是正态分布的,最常见就是残差,比如你测量误差不满足正态分布,或者是偏态分布的,那极大可能是你的仪器测量出毛病了。

今天对正态化需不需要做了一次讨论,那么归一化和离散化需不需要呢?我这抛个砖哈(其实你可以看我的其他博客,里面有过一次讨论,默认你看不到

我不太喜欢一些人直接上来就用模型,其实什么时候聚类、分类、离散化、归一化、正态化、相关度、特征工程都是有一套统计挖掘思想的。

————————————新更分割线————————————

 

判断数据是否服从正态分布的指标

我们判断数据分布与标准正态分布之间的差别主要根据两个统计量:偏度(skewness)和峰度(kurtosis)

1. 偏度(skewness)
偏度(skewness),是统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征。定义上偏度是样本的三阶标准化矩。

å¨è¿éæå¥å¾çæè¿°
偏度定义中包括正态分布(偏度=0),右偏分布(也叫正偏分布,其偏度>0),左偏分布(也叫负偏分布,其偏度<0)。正偏态分布有以下特性:众数 < 中位数 < 平均数;对于负偏态单峰分布则恰恰相反,众数 > 中位数 > 平均数。在对称分布中,三值相等

在这里插入图片描述
在这里插入图片描述

2. 峰度

峰度(peakedness;kurtosis)又称峰态系数。表征概率密度分布曲线在平均值处峰值高低的特征数。直观看来,峰度反映了峰部的尖度。随机变量的峰度计算方法为:随机变量的四阶中心矩与方差平方的比值。

å¨è¿éæå¥å¾çæè¿°

峰度包括正态分布(峰度值=3),厚尾(峰度值>3),瘦尾(峰度值<3)


峰度用于描述一个分布曲线形态的陡缓程度,通常以正态分布曲线的峰度为参照标准,来观察波峰是更“尖”还是更“平”。我们称正态分布曲线的峰度为常峰度,所有正态分布曲线(无论均值和方差为何值)峰度均为3。峰度大于常峰度的分布叫做尖峰分布(峰度 > 3),它拥有更陡峭的波峰和更厚的尾部,反之亦然,平峰分布拥有更平的波峰和更薄的尾部。

然而,一些工具将分布曲线的超额峰度(峰度减去常峰度3)定义为峰度,这样做的目的是让正态分布的峰度重新定义为0,便于分析比较,如Python的Scipy库就是这样处理的,以及Spark里计算峰度的函数(Spark分类专栏里有讲到)。

使数据分布逼近正态分布

如果高度偏态(如Skewness为其标准误差的3倍以上),则可以取对数,其中又可分为自然对数和以10为基数的对数。如以下是转换自然对数的指令:
以下是转换成以10为基数的对数(其纠偏力度最强,有时会矫枉过正,将正偏态转换成负偏态)正偏就用两lg
另外,在计量经济学中广泛使用Box-Cox转换方法。
通体来说,可以尝试一下几种方法:

1、对数变换 即将原始数据X的对数值作为新的分布数据
X’=lgX
当原始数据中有小值及零时,亦可取X’=lg(X+1)
还可根据需要选用X’=lg(X+k)或X’=lg(k-X)

对数变换常用于(1)使服从对数正态分布的数据正态化。如环境中某些污染物的分布,人体中某些微量元素的分布等,可用对数正态分布改善其正态性。(2)使数据达到方差齐性,特别是各样本的标准差与均数成比例或变异系数CV接近于一个常数时。

2、平方根变换 即将原始数据X的平方根作为新的分布数据
X’=sqrt(X)
平方根变换常用于:1)使服从Poission分布的计数资料或轻度偏态资料正态化,可用平方根变换使其正态化。2)当各样本的方差与均数呈正相关时,可使资料达到方差齐性。

3、倒数变换 即将原始数据X的倒数作为新的分析数据
X’=1/X
常用于资料两端波动较大的资料,可使极端值的影响减小。
4、平方根反正旋变换 即将原始数据X的平方根反正玄值做为新的分析数据
X’=sin-1sqrt(X)
常用于服从二项分布的率或百分比的资料。一般认为等总体率较小如<30%时或较大(如>70%时),偏离正态较为明显,通过样本率的平方根反正玄变换,可使资料接近正态分布,达到方差齐性的要求。

5. 计量经济学中常用的BOX-COX变换

后面重点介绍
6.在SPSS中:
在转换-计算变量里面点进去,就可以把一个变量进行各种变换,就和计算器类似
不过最好的方法是把数据标准化,
分析——描述统计——描述,有个选项是将标准化得分另存为变量
这样你的变量都符合正态性了

或者在SPSS上的操作方法:工具栏transform-Rank cases,将左边你要进行正态化的变量拖入右边“变量”框中;点选rank types对话窗,选中normal scores选项(共四种计算方法,系统默认的是bloom计算方法,可根据你的需要进行改进),点击continue,ok。
spss会在数据观察表中生成两列新变量,其中N总分变量就是你想要的正态化结果。

7. 等频归一化
通过对训练数据的分析,我们发现不同维度特征的取值分布、相同维度下特征值的差异都很大。例如距离、价格等特征的数据服从长尾分布,体现为大部分样本的特征值都比较小,存在少量样本的特征值非常大。常规的归一化方法(例如 min-max, z-score)都只是对数据的分布进行平移和拉伸,最后特征的分布仍然是长尾分布,这就导致大部分样本的特征值都集中在非常小的取值范围内,使得样本特征的区分度减小;与此同时,少量的大值特征可能造成训练时的波动,减缓收敛速度。此外也可以对特征值做对数转化,但由于不同维度间特征的分布不同,这种特征值处理的方式并不一定适用于其他维度的特征。在实践中,我们参考了Google的Wide & Deep Model[^6]中对于连续特征的处理方式,根据特征值在累计分布函数中的位置进行归一化。即将特征进行等频分桶,保证每个桶里的样本量基本相等,假设总共分了n个桶,而特征x 属于其中的第b (b ∈ {0, …, n - 1})个桶,则特征x 最终会归一化成 b /n。这种方法保证对于不同分布的特征都可以映射到近似均匀分布,从而保证样本间特征的区分度和数值的稳定性。

补充:

在这里插入图片描述

 


结构化数据转换方式:box-cox转换

box-coxhttps://blog.csdn.net/sinat_26917383/article/details/77864582

      https://wenku.baidu.com/view/96140c8376a20029bd642de3.html

优势:

  • 线性回归模型满足线性性、独立性、方差齐性以及正态性的同时,又不丢失信息,此种变换称之为Box—Cox变换。
  • 误差与y相关,不服从正态分布,于是给线性回归的最小二乘估计系数的结果带来误差
  • 使用Box-Cox变换族一般都可以保证将数据进行成功的正态变换,但在二分变量或较少水平的等级变量的情况下,不能成功进行转换,此时,我们可以考虑使用广义线性模型,如Logistics模型、Johnson转换等。
  • Box-Cox变换后,残差可以更好的满足正态性、独立性等假设前提,降低了伪回归的概率

其中:
在一些情况下(P值<0.003)很难实现正态化处理,所以优先使用Box-Cox转换,但是当P值>0.003时两种方法均可,优先考虑普通的平方变换。

  • 此时的检验步骤为:先对数据进行正态性检验 -> 观察检验的P值 -> 根据P值挑选合适的box-cox转换函数

常规的经济学转换方式:

log,对数转换,是使用最多的(数据必须大于0) log1p
还有:è¿éåå¾çæè¿°

Box-Cox变换的正态变换:

è¿éåå¾çæè¿°

代码:y_boxcox = special.boxcox1p(y, lam_best) 利用llf获得优化后的lambda

# -*- coding: utf-8 -*-
"""
Here the boxcox method will be demonstated including boxcox convert,
lambda estimate via llf, inverse boxcox convert.
"""

import pandas as pd
import numpy as np
from scipy import stats,special
import matplotlib.pyplot as plt

data = pd.read_csv('y_boxcox.csv',header=None)
y = data.iloc[:,1]
print(y.shape)

lam_range = np.linspace(-2,5,100)  # default nums=50
llf = np.zeros(lam_range.shape, dtype=float)

# lambda estimate:
for i,lam in enumerate(lam_range):
    llf[i] = stats.boxcox_llf(lam, y)		# y 必须>0

# find the max lgo-likelihood(llf) index and decide the lambda
lam_best = lam_range[llf.argmax()]
print('Suitable lam is: ',round(lam_best,2))
print('Max llf is: ', round(llf.max(),2))

plt.figure()
plt.plot(lam_range,llf)
plt.show()
plt.savefig('boxcox.jpg')

# boxcox convert:
print('before convert: ','\n', y.head())
#y_boxcox = stats.boxcox(y, lam_best)
y_boxcox = special.boxcox1p(y, lam_best)
print('after convert: ','\n',  pd.DataFrame(y_boxcox.reshape(-1,1)).head())

# inverse boxcox convert:
y_invboxcox = special.inv_boxcox1p(y_boxcox, lam_best)
print('after inverse: ', '\n', pd.DataFrame(y_invboxcox.reshape(-1,1)).head())

'''
output:
(1456,)
Suitable lam is:  -0.02
Max llf is:  -16154.7
before convert:  
 0   208500.00000
1   181500.00000
2   223500.00000
3   140000.00000
4   250000.00000
Name: 1, dtype: float64
after convert:  
          0
0 10.85009
1 10.74166
2 10.90430
3 10.53785
4 10.99156
after inverse:  
              0
0 208500.00000
1 181500.00000
2 223500.00000
3 140000.00000
4 250000.00000
'''

 

  • 32
    点赞
  • 192
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值