机器学习中的特征分布

一. 什么是特征分布:

与样本分布不同,特征分布指的是一个数据集中,某个特征在所有样本上的分布情况。而样本分布指的是在这个数据集中,各个类别样本的分布情况。

以鸢尾花(Iris)数据集来举个例子叭:

import pandas as pd
import matplotlib.pyplot as plt

iris = pd.read_csv('.\iris.csv', usecols=[1, 2, 3, 4, 5])
iris.head(5)
Sepal LengthSepal WidthPetal Length品 种
5.13.51.4setosa
4.93.11.3setosa
4.73.71.5versicolor
4.63.61.6setosa
5.42.91.2versicolor

样本分布 指的就是该数据集的“品种”分布,在这个数据集中,共有三种鸢尾花的品类,且数据集中各个种类的样本数比例为1:1:1,因此该样本分布为均匀分布。

iris.value_counts('Species').plot(kind='bar')
plt.title('样本分布')
plt.show()

在这里插入图片描述


特征分布 指的就是某个特征在整个数据集上的分布情况。下图为 Sepal Width 这个特征在所有样本上的分布:

width = iris['SepalWidthCm']

sns.distplot(width, bins=20, hist=True, kde=True, norm_hist=False, rug=True,
             vertical=False, axlabel=None, label=None, ax=None,
             fit=None)
             
# bins → 箱数;hist、ked、rug → bool,是否显示箱/密度曲线/数据分布; 
# norm_hist → 直方图是否按照密度来显示,如果为False, 显示计数

plt.title('特征分布')
plt.show()

在这里插入图片描述


在这里插入图片描述


二. 为什么需要特征服从正态分布:

在深度学习和机器学习中,我们通常希望数据的分布为正态分布,因为在机器学习中,许多模型都是基于数据服从正态分布的假设(例如线性回归,它假设模型的残差服从均值为0方差为σ^2,标准化残差服从均数为0,方差为1 的正态分布)。因此,具有正态分布的数据会对模型的训练效果有着较为显著的提升。(思考:为什么数据服从正态分布会对模型训练效果有提升???)

并且正态分布具有很好的性质,例如样本的均值和方差相互独立,多个正态分布的组合仍为正态分布等一系列良好性质。


三. 检验特征是否服从正态分布:

一般使用 Q-Q图 来进行检验:

Q-Q图(Q代表分位数)用图形的方式比较两个概率分布,将两个分布的分位数放在一起比较。通过把待检验分布样本数据的分位数与已知分布相比较,从而来检验数据的分布情况。

分位数:亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点。)

如果两个分布相似,则该Q-Q图趋近于落在 y=x 线上。如果两个分布线性相关,则点在Q-Q图上趋近于落在一条直线上,但不一定在 y=x 线上。Q-Q图可以用来可在分布的位置-尺度范畴上可视化的评估参数。要利用Q-Q图来检验样本数据是否近似于正态分布,只需看Q-Q图上的点是否近似地在一条直线附近,且该直线的斜率为标准差,截距为均值。

百度百科:Q-Q图

绘制Q-Q图的基本步骤:

  1. 将所有待检验数据(共有 n n n 个数据)按大小排序。
  2. 计算每个数字对应的累计分布值 ( i − 0.5 ) / n (i-0.5)/n (i0.5)/n, ( i i i n n n 中的第 i i i 个值),累计分布值表示某个特定值以下的值所占数据的比例。
  3. 画Q-Q图,第一个点是第一个累计分布值对应的数值。横坐标是正态分布,纵坐标是待检验的数据集。

Python 可以非常方便快捷的绘制出分布的 Q-Q图,首先我们看一下指数分布的Q-Q图长啥样:

from numpy import random

x_exp = random.exponential(0.5, 10000)    # 生成一个均值为 0.5 的指数分布,共 10000 个样本点
x_gaussian = random.randn(10000)		  # 生成一个标准的高斯分布,共 10000 个样本点

sns.distplot(x_exp, bins=100, hist=True, kde=True, norm_hist=False, rug=True,
             vertical=False, axlabel=None, label=None, ax=None,
             fit=None)

plt.title('指数分布')
plt.show()

# 画Q-Q图
stats.probplot(x_exp, dist="norm", plot=plt)
plt.show()

在这里插入图片描述

然后,我们再看看标准的正态分布的Q-Q图长啥样:

在这里插入图片描述

通过Q-Q图,我们可以很直观的看出来一个分布是否服从正态分布。

除此之外,Scipy 还提供了许多方法用于分布正态性检验,下面是三个检验正态性的函数:

import numpy as np
import scipy
from scipy import stats

x = np.random.normal(0,1,5000)

statis, p_value = scipy.stats.shapiro(x)
print('shapiro, 统计量:%s,P值:%s' % (statis, p_value))
'''输出结果中第一个为统计量,第二个为P值(统计量越接近1越表明数据和正态分布拟合的好,
P值大于指定的显著性水平,接受原假设,认为样本来自服从正态分布的总体)'''


'''输出结果中第一个为统计量,第二个为P值(注:统计量越接近0就越表明数据和标准正态分布拟合的越好,
如果P值大于显著性水平,通常是0.05,接受原假设,则判断样本的总体服从正态分布)'''
statis, p_value = scipy.stats.kstest(x, 'norm')) 
print('kstest, 统计量:%s,P值:%s' % (statis, p_value))

'''输出结果中第一个为统计量,第二个为P值(注:p值大于显著性水平0.05,认为样本数据符合正态分布)'''
statis, p_value = scipy.stats.normaltest(x))
print('normaltest, 统计量:%s,P值:%s' % (statis, p_value))

======================================================================================================
outputs:

shapiro, 统计量:0.9996495246887207,P值:0.5539907217025757
kstest, 统计量:0.010573110752084669,P值:0.631154979275908
normaltest, 统计量:0.629270367766585,P值:0.7300551615821823

'''
Tips:
P值即概率,用于反映某一事件发生的可能性大小。统计学根据显著性检验方法所得到的P值,
一般以P < 0.05 为有统计学差异, P<0.01 为有显著统计学差异,P<0.001为有极其显著的统计学差异。
其含义是样本间的差异由抽样误差所致的概率小于0.05 、0.01、0.001。
实际上,P值不能赋予数据任何重要性,只能说明某事件发生的几率。
统计学上一般P值大于0.05我们可认为该组数据是符合正态分布。
'''

四. 如何将特征转换为正态分布:

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

如何使数据逼近标准正态分布

  1. 对数变换: 对于高度偏态(如Skewness为其标准误差的3倍以上)的数据分布,我们则可以对其取对数处理。其中又可分为自然对数和以10为基数的对数,其中以10为基数的对数处理纠偏力度最强,有时会矫枉过正,将正偏态转换成负偏态。
    X ′ = l o g ( X ) \begin{aligned} X^{'}=log(X) \end{aligned} X=log(X)

  2. 平方根变换:平方根变换使服从泊松(Poisson)分布的样本或具有轻度偏态的样本正态化,或者是当各样本的方差与均数呈正相关时,使用平方根变换可使其达到方差齐性。
    X ′ = X \begin{aligned} X'=\sqrt{X} \end{aligned} X=X

  3. 倒数变换:常用于分布两端波动较大的数据,倒数变换可使极端值的影响减小。
    X ′ = 1 / X \begin{aligned} X'=1/X \end{aligned} X=1/X

  4. 平方根反正旋变换:常用于服从二项分布 或 百分比的数据。一般认为等总体率较小(如<30%时)或较大(如>70%时),偏离正态较为明显,通过样本率的平方根反正玄变换,可使数据接近正态分布,达到方差齐性的要求。
    X ′ = s i n − 1 X \begin{aligned} X'=sin^{-1}\sqrt{X} \end{aligned} X=sin1X

  5. BOX-COX变换:通常用于连续的响应变量不满足正态分布的情况。在一些情况下(特征分布的P值<0.003)上述方法(平方变换等)很难实现正态化处理,所以可以考虑使用Box-Cox转换,但是当P值>0.003时,使用两种方法均可,优先考虑普通的平方变换。(其中 λ \lambda λ 为待定变换参数)

X ′ ( λ ) = { X λ − 1 λ , λ ≠ 0 ln ⁡ X , λ = 0 \begin{aligned} X'(\lambda)=\left\{\begin{array}{ll} \frac{X^{\lambda}-1}{\lambda}, & \lambda \neq 0 \\ \\ \ln X, & \lambda=0 \end{array}\right. \end{aligned} X(λ)=λXλ1,lnX,λ=0λ=0

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值