机器学习之离散化和归一化

文章目录

      • 一、离散化
        • 1.什么是离散化?
        • 2.为什么离散化?
        • 3.怎么离散化?
      • 二、归一化
        • 1.什么是归一化?
        • 2.为什么归一化?
        • 3.怎么归一化?
      • 三、独热编码(One-Hot)与哑变量(dummy variable)

一、离散化

1.什么是离散化?

    在统计学机器学习中,离散化(Discretization)指将连续特征或者变量,转变成离散特征或者变量的过程。

2.为什么离散化?

  • 算法需要:有些数据挖掘算法,特别是某些分类算法(如朴素贝叶斯),要求数据是分类属性形式(类别型属性)这样常常需要将连续属性变换成分类属性。
  • 离散化可以有效地克服数据中隐藏的缺陷:如果一个分类属性(或特征)具有大量不同值,或者某些类出现不频繁,则对于某些数据挖掘任务用处不大,通过合并某些值减少类别的数目可能是有益的。
  • 有利于对非线性关系进行诊断和描述:对连续型数据进行离散处理后,自变量和目标变量之间的关系变得清晰化。如果两者之间是非线性关系,可以重新定义离散后变量每段的取值,如采取0,1的形式, 由一个变量派生为多个哑变量(后面补充讲解),分别确定每段和目标变量间的联系。这样做,虽然减少了模型的自由度,但可以大大提高模型的灵活度。

3.怎么离散化?

一般来说,数据的离散化分为两个步骤:
I、决定需要多少个类别值。
    在第一步中,将连续属性值排序后,通过指定n-1个分割点(split point)把它们分成n个区间。
II、确定如何将连续属性映射到这些分类值。
    在第二步中,将一个区间中的所有值映射到相同的类别上。因此,离散化问题就是决定选择多少个分割点和确定分割点位置的问题,结果可以用区间集合{ ( x 0 , x 1 ] , ( x 1 , x 2 ] , ⋯   , ( x n − 1 , x n ] (x_0, x_1], (x_1, x_2], \cdots, (x_{n-1}, x_n] (x0,x1],(x1,x2],,(xn1,xn]}表示,其中 x 0 x_0 x0 x n x_n xn可以分别为 − ∞ -\infty + ∞ +\infty +,或者用一系列不等式 x 0 ≤ x ≤ x 1 , ⋯   , x n − 1 ≤ x ≤ x n x_0\leq x \leq x_1, \cdots,x_{n-1}\leq x \leq x_n x0xx1,,xn1xxn表示。
    然而对于不同类别的机器学习我们会采用不同离散化方法,下面我们讨论非监督离散化和监督离散化:

非监督离散化

    用于分类的离散化方法之间的根本区别在于使用类信息(监督supervised)还是不使用类信息(无监督unsupervised)。如果不使用类信息,则常使用一些相对简单的方法。例如,等宽equal width)方法将属性的值域划分为具有相同宽度的区间,而区间的个数由用户指定,这种方法可能由于受离群点的影响而性能不佳,因此等频率equal frequency)或等深equal depth)方法通常更为可取,等频率方法试图将相同数量的对象放进每个区间。作为非监督离散化的另一个例子,可以使用诸如K均值等聚类方法。最后,目测检查数据有事也可能是一种有效的方法。下面是示例:

# 将年龄数据离散化
ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32])
# qcut 是等频切割,即基本保证每个组里的元素个数是相等的
cc = pd.qcut(ages,5)    # 等频率(等深)
# cut是按值切割,即根据数据值的大小范围等分成n组,落入这个范围的分别进入到该组。
dd = pd.cut(ages,5)     # 等宽

非监督离散化

    非监督学习原始数据的离散化处理要比不离散处理化好,但是使用附加的信息(类标号)常常能够产生更好的结果,因为未使用类标号知识所构成的区间常常包含混合的类标号。一种概念上的简单方法是以极大化区间纯度的方式确定分割点,然而实践中这种方法可能需要人为确定区间的纯度和最小的区间大小。为了解决这一问题,一些基于统计学的方法用每个属性值来分隔区间,并通过合并类似于根据统计检验得出的相邻区间来创造较大的区间。基于的方法是最有前途的离散化方法之一,下面给出一个简单的基于熵的方法。
区间的熵 e i e_i ei由如下等式给出: e i = − ∑ j = 1 k p i j log ⁡ 2 p i j e_i = -\sum_{j=1}^k p_{ij} \log_2p_{ij} ei=j=1kpijlog2pij其中, p i j = m i j m i p_{ij} = \frac{m_{ij}}{m_i} pij=mimij是第 i i i个区间中类 j j j的概率(值的比例)。该划分的总熵 e e e是每个区间的熵的加权平均,即: e = ∑ i = 1 2 w i e i e = \sum_{i=1}^2 w_ie_i e=i=12wiei其中,m是值的个数, w i = m i m w_i = \frac{m_i}{m} wi=mmi是第 i i i个区间的值的比例,而 n n n是区间个数。直观上,区间的熵是区间纯度的度量。如果一个区间只包含一个类的值(表示该区间非常纯),则熵为0并且不影响总熵。如果一个区间中的值类出现的频率相等(该区间尽可能不纯),则其熵最大。

    一种划分连续属性的简单方法:开始将初始值切分成两部分,让两个结果区间产生最小熵,该技术只需要把每个值看做可能的分割点即可,因为嘉定区间包含有序值的集合;然后,取一个区间,通常选取具有最大熵的区间,重复此分割过程,直到区间的个数达到用户指定的个数,或者满足终止条件。

    在二维中,点是很好分开的,但在一维中,情况并非如此,一般而言,分别离散化每个属性通常只保证次最优的结果。

二、归一化

1.什么是归一化?

    归一化Normalization)是一种简化计算的方式,即将有量纲的表达式,经过变换转化为无量纲的表达式变成为标量。 在多种计算中都经常用到这种方法。在对数据进行算法训练时,由于数据的问题可能导致算法的效果并不理想,这时候可以考虑一下对数据进行归一化方法。

2.为什么归一化?

    举个栗子:分析一个人的身高和体重对健康的影响,如果使用米/ m m m和千克 k g kg kg作为单位,那么身高特征会在1.6~1.8 m m m的数值范围内,体重特征会在50~100 k g kg kg的范围内,分析出来的结果显然会倾向于数值差别比较大的体重特征。也就是说体重的预测能力会比身高的预测能力高出很多,但是这并不符合事实,想要得到更为准确的结果,就需要进行特征归一化处理,使各指标处于同一数值量级,以便进行分析。

  • 数据的量纲不同(数量级差别很大):经过标准化处理后,原始数据转化为无量纲化指标测评值,各指标值处于同一数量级别,可进行综合测评分析。
  • 平衡各特征的贡献:如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。
  • 一些模型求解的需要:假设有两种数值型特征, x 1 x_1 x1的取值范围为[0,10], x 2 x_2 x2的取值范围为[0,3],于是可以构造一个目标函数等值图。左图的梯度的方向为垂直等高线的方向而走之字形路线,这样会使迭代很慢,相比之下,右图的迭代就会很快(理解:也就是步长走多走少方向总是对的,不会走偏)。

3.怎么归一化?

  • 线性函数归一化:将原始数据进行线性的变换,并确保新的数据均映射到[0,1]区间内,实现对原始数据的等比缩放。

    公式: X n o r m = X − X m i n x m a x − x m i n X_{norm} = \frac{X - X_{min}}{x_{max} - x_{min}} Xnorm=xmaxxminXXmin

  • 0均值归一化:将原始数据均映射到均值为0,标准差为1的分布上。具体来说,假设原始特征的均值为 μ \mu μ、标准差为 σ \sigma σ,那么归一化公式定义为: z = x − μ σ z = \frac{x - \mu}{\sigma} z=σxμ

三、独热编码(One-Hot)与哑变量(dummy variable)

    I、独热编码:即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。
例如:
自然状态码为:000, 001, 010, 011, 100, 101
独热编码为:000001, 000010, 000100, 001000, 010000, 100000

    据我个人理解,独热编码就是是根据一个事物的几个不同状态来确定每个编码长度(有多少位),而且每个编码只有一个数字是1其的全是0,也就是one-hot编码保证了每一个取值只会使得一种状态处于“激活态”,如:

# 小学 ---> [1, 0, 0, 0, 0]
# 中学 ---> [0, 1, 0, 0, 0]
# 大学 ---> [0, 0, 1, 0, 0]
# 硕士 ---> [0, 0, 0, 1, 0]
# 博士 ---> [0, 0, 0, 0, 1]

    II、哑变量编码:直观的解释就是任意的将一个状态位去除,还是拿上面的例子来说,我们用4个状态位就足够反应上述5个类别的信息,也就是我们仅仅使用前四个状态位 [0,0,0,0] 就可以表达博士了。只是因为对于一个我们研究的样本,他已不是小学生、也不是中学生、也不是大学生、又不是研究生,那么我们就可以默认他是博士,是不是。(额,当然他现实生活也可能上幼儿园,但是我们统计的样本中他并不是,-)。所以,我们用哑变量编码可以将上述5类表示成:

# 小学 ---> [1, 0, 0, 0]
# 中学 ---> [0, 1, 0, 0]
# 大学 ---> [0, 0, 1, 0]
# 硕士 ---> [0, 0, 0, 1]
# 博士 ---> [0, 0, 0, 0]

    III、独热编码优缺点

  • 优点:独热编码解决了分类器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。
  • 缺点:当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one-hot encoding+PCA这种组合在实际中也非常有用。

    IV、什么情况下(不)用独热编码

  • :独热编码用来解决类别型数据的离散值问题。
  • 不用:将离散型特征进行one-hot编码的作用,是为了让距离计算更合理,但如果特征是离散的,并且不用one-hot编码就可以很合理的计算出距离,那么就没必要进行one-hot编码。 有些基于树的算法在处理变量时,并不是基于向量空间度量,数值只是个类别符号,即没有偏序关系,所以不用进行独热编码。 Tree Model不太需要one-hot编码: 对于决策树来说,one-hot的本质是增加树的深度。link

你可能感兴趣的:(机器学习)