赞
踩
@ 2018-02-07
有些数据挖掘算法,特别是某些分类算法(如朴素贝叶斯),要求数据是分类属性形式(类别型属性)这样常常需要将连续属性变换成分类属性(离散化,Discretization)。另外,如果一个分类属性(或特征)具有大量不同值,或者某些之出现不频繁,则对于某些数据挖掘任务,通过合并某些值减少类别的数目可能是有益的。
与特征选择一样,最佳的离散化方法是对于用来分析数据的数据挖掘算法,产生最好结果的方法,而直接使用这种判别标准通常是不实际的,因此,离散化一般需要满足这样一种判别标准,它与所考虑的数据挖掘任务的性能好坏直接相关。
通常离散化应用于分类或关联分析中所使用的属性上。一般来说,离散化的效果取决于所使用的算法,以及用到的其他属性。然而,属性离散化通常单独考虑。
连续属性变换为类别属性设计两个子任务:1. 决定需要多少个类别值;2. 确定如何将连续属性映射到这些分类值。在第一步中,将连续属性值排序后,通过指定n-1个分割点(split point)把它们分成n个区间;在第二步中,将一个区间中的所有值映射到相同的类别上。因此,离散化问题就是决定选择多少个分割点和确定分割点位置的问题,结果可以用区间集合
用于分类的离散化方法之间的根本区别在于使用类信息(监督,supervised)还是不使用类信息(无监督,unsupervised)。如果不使用类信息,则常使用一些相对简单的方法。例如,等宽(equal width)方法将属性的值域划分为具有相同宽度的区间,而区间的个数由用户指定,这种方法可能由于受离群点的影响而性能不佳,因此等频率(equal frequency)或等深(equal depth)方法通常更为可取,等频率方法试图将相同数量的对象放进每个区间。作为非监督离散化的另一个例子,可以使用诸如K均值等聚类方法。最后,目测检查数据有事也可能是一种有效的方法。下面是示例:
x=[1,1,5,5,5,5,8,8,10,10,10,10,14,14,14,14,15,15,15,15,15,15,18,18,18,18,18,18,18,18,18,20,2,20,20,20,20,20,20,21,21,21,25,25,25,25,25,28,28,30,30,30]
x=pd.Series(x)
s=pd.cut(x,bins=[0,10,20,30]) # 此处是等宽的离散化方法,bin表示区间的间距
非监督离散化方法通常比不离散化好,但是使用附加的信息(类标号)常常能够产生更好的结果,因为未使用类标号知识所构成的区间常常包含混合的类标号。一种概念上的简单方法是以极大化区间纯度的方式确定分割点,然而实践中这种方法可能需要人为确定区间的纯度和最小的区间大小。为了解决这一问题,一些基于统计学的方法用每个属性值来分隔区间,并通过合并类似于根据统计检验得出的相邻区间来创造较大的区间。基于熵的方法是最优前途的离散化方法之一,下面给出一个简单的基于熵的方法。
首先,需要定义熵(entropy)。设k是不同的类标号数,
一种划分连续属性的简单方法:开始将初始值切分成两部分,让两个结果区间产生最小熵,该技术只需要把每个值看做可能的分割点即可,因为嘉定区间包含有序值的集合;然后,取一个区间,通常选取具有最大熵的区间,重复此分割过程,直到区间的个数达到用户指定的个数,或者满足终止条件。
在二维中,点是很好分开的,但在一维中,情况并非如此,一般而言,分别离散化每个属性通常只保证次最优的结果。
【后续补上基于熵的离散化代码】
Reference
1.《数据挖掘导论第2章》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。