数据挖掘:概念与技术(第三版)之第八章的学习记录

来源:互联网 发布:淘宝有枪买吗 编辑:程序博客网 时间:2024/06/06 02:11

本章讲解分类的一些基本概念

分类

什么是分类
首先我们要知道的是,分类是一种重要的数据分析形式,它提取和刻画重要数据类的模型。这个模型被称之为分类器(classifer)。通过分类器,我们可以预测分类的类标号。
建议不熟悉这个概念的同学们 ,首先看一下这篇文章。
贷还是不贷:如何用 Python 和机器学习帮你决策?
此外,还需要弄清楚分类和回归的联系和区别,关于这一点,我已经在第一章的部分做了详细的解释。

分类的一般方法
其实分类说白了,就是根据历史数据建立模型然后根据模型对当前输入数据做出判断,实际上这个很像老司机凭借经验处理问题。
因此,我们应该很容易的想到,要分类,首先得要有数据,而且这个数据是要有确定结果的。(这里说的其实是数据要有类标号)
总的来说,数据分类是一个两阶段的过程:

(1)学习阶段(构建分类模型);(2)分类阶段(使用模型预测给定数据的类标号)。

在第一阶段,分类算法通过分析训练集里面的数据,学习并构造分类模型(classifer)。这里的训练集是由数据库元组和它们相关联的类标号 组成的。一般来说,是把训练集的元组用向量表示,如X=(x1,x2,,x3……xn)。
这里的类标号是很重要的一个属性。它是离散值的和无序的。一个元组只有有了类标号才能为该元组“定性”。
因为提供了每个训练元组的类标号,这一阶段也被称为监督学习(supervised learning)
有监督学习(supervised learning)就有无监督学习(unsupervised learning)。
这两者的区别就是训练集的类标号是否是已知的。
监督学习的训练集的类标号是已知的,而无监督学习的每个训练集的类标号是未知的。无监督学习的典型例子就是聚类,这个之后再说。
OK,第一阶段做完了之后,我们就可以通过分类模型来预测给定数据的类标号了。但是,直接进行预测实际上是不合理的。为什么这么说呢?因为我们并不确定这个模型是不是优秀的,或者说通过训练集训练出来的模型的准确率如何?
因此,我们很需要对这个模型进行测试。因此,在实际进行预测之前,首先要拿检验集进行检验,判断它的准确率。
而检验集里面的数据一般来说有两种,一种就是训练集里面的原始数据;还有一种是独立于训练集的单独数据。当然,这么一说。用屁股想都知道,肯定是用单独的检验集进行检验来得好。但是为什么用训练集里面的数据不好呢?
其实道理很简单。训练数据相对来说是很粗糙的,里面包含很多瑕疵(异常数据),如果我们用训练数据去做检验,那么一般都是过分拟合(overfit),即偏虚高。
这个应该很好理解,就像我们考试一样。我们练习的时候做的练习卷,那么考试的时候也用练习卷来考试,那肯定是反映不出真实水平的。
因此,应当用单独的检验集进行检验,并测算出准确率。
然后,在我们觉得这个准确率是可以接受的基础之上,那么就可以直接进行第二步了。

决策树分类器

决策树分类器
上面说了, 我们通过学习并构造分类器 。这里给出一个相当经典且流行的分类器——决策树分类器
为什么这样评价这个分类器呢?因为构造这个分类器不需要任何领域的知识,也不需要任何的参数设置。因此它特别适合于探测式的知识发现。此外,这个分类器还可以处理高维数据,而且采用的是类似于树这种形式,也特别直观和便于理解。因此,决策树是许多商业规则归纳系统的基础。上面给的那篇参考文包括书上都有详细的示例图。大家只要看着这个图,都不需要额外的说明,直接就能理解了。
关于决策树的发展,早期是从ID3到C4.5再到CART。这里选择ID3进行讲解。

其实,算法的思维很简单。就是以自顶向下递归的分治方式构造。参考书215页,图8.3.下面我详细说明一下构造过程。

1:首先画一个单节点,接着进行学习。如果D(训练集)中的数据一上来直接就是统一的一类,那么就不需要再搞其他的了。直接把那个单节点变成叶子结点,并用类标记它就OK了。如果不是的话,就进行下一步。

2:接下来就进行第二步了。因为D中的数据不是统一的一类,所以按照决策树的思想,就要进行分支分类了。那么在这里,问题来了!!!大家注意,这一步应该算是最重要也是最繁复的一大步了,下面我会很仔细的说说。
我们说要进行分类,那么问题来了。我们首先按哪个顺序进行分类呢?
举个例子,训练集里面的一个元组的属性(除标号),有年龄(age),收入(income),职业(occupation),那么我是先按age分呢?还是按income分呢?还是occupation分呢?
大家千万不要以为随便按那个分就是了!
实际上,这里是很有讲究的。具体怎么分,哪个先哪个后要通过计算才能得出。
具体来说是这样的。attribute_list是候选的属性集合,而进行数据划分的依据是根据属性选择度量依次选择最合适的属性选择作为分裂属性。
在这里,大家注意两个关键词:属性选择度量和最合适。
属性选择度量是一种选择分裂准则,它决定这个数据怎么分。说白了就是一个指标;而最合适就是说白了就是比较这几个属性的指标值,哪个好就选哪个。
所以,这里实际上就变成了一道计算题:计算属性的选择度量。
属性的选择度量一般分为三个类型:Gain(信息增益)、Gainratio(增益率)、Giniindex(基尼指数)。书上是在8.2.2节详细讲解了这三种计算方法。大家搞清楚这三种指标之后,就知道该选择哪个属性优先了。

第三步:OK,我们在第二步计算出了指标,知道了该选择哪个属性进行数据划分。但在这里还没有完 ,我们还需要对根据分裂准则划分元组的情况进行讨论。即我们现在知道了是要划分哪个,但是应该分成什么样子这还需要我们进行考量。划分规则如下:
1.若A是离散值,则对A的每个已知值产生一个分枝;
2.若A是连续的,则产生两个分枝,分别对应于A《=split_point和A>split_point;
3.若A是离散值的且必须产生二叉树,则应进行划分子集判断。

这三种划分,在书216页图8.4有详细例子。

一般来说,划分完了之后就是这样:
这里写图片描述

OK,接下来就对D的每个结果分区D1,D2,D3……上的元组,使用同样的算法进行递归直至形成决策树。
那么这里既然提到了递归,那必然要设置终止条件。条件有三
1.分区D(在结点N提供)的所有元组 都属于同一个类;
2.没有剩余属性可以用来进一步划分元组,在此情况下,使用多数表决;
3.给定的分枝没有元组,即分区为空。
书上216页下方有对这块做了具体讲解的

决策树算法的差别
前面说了,早期归纳决策树的发展是从ID3到C4.5再到CART的。
这几种算法的主要区别就是关于属性选择度量的区别。
ID3使用的是Gain(信息增益,优先取大)
C4.5使用的是增益率(Gainratio,优先取大)
CART使用的是基尼指数(Giniindex,优先取小)

而选择那种属性度量最好呢,其实效果都还可以,而且差别不大。因为所有的度量都存在着某种偏差。
但是,可以确定的是,决策树归纳的时间复杂度一般是随着树的高度而呈指数增加。因此,我们一般来说,更倾向于产生较浅的树。但事实,我们又发现,深度较浅的树它的宽度又偏大,而宽度大的树呢,划分层次不够,错误率又比较高=。=
所以呢,尽管有一些 比较研究,但是并没有发现有哪一种度量比其他好太多,所以如何选择看自己吧,但还是比较倾向于较浅的,毕竟错误率较大的问题可以通过处理数据进行改善嘛。

决策分类树的发展
在这里我们探讨随着时代的发展,决策分类树出现的一些新特性。
1.决策树的可伸缩性
是当前的KDD中,上百万的数据集也已经很常见了。而我们之前讨论了ID3,C4.5,CART算法在当前会遇到一个致命的问题,那就是这些决策树算法都显示训练元组驻留在内存中。
这其实是一个历史的遗留问题,在ID3这类算法存在的年代里,还没有数以百万计的数据,它们针对的都是比较小的数据集。
因此,我们针对这个问题,我们也提出了新的决策树算法,例如Rainforest好BOAT算法。在书P224,8.2.4节有具体讲解。

2.决策树归纳的可视化挖掘
随着发展,我们对决策树的构建越来越希望有一种可视化的方式,能够使我们以一种交互式的方式进行构建。那么有没有这么一种工具呢?
书P225,8.2.5节详细讨论了这么一个问题。

提高决策树分类器的准确率
OK,在上面我们说道,当我们从训练集里面训练出分类器之后,在进行分类预测之前,必须要做的一件事情是对这个分类器进行检验。如果说该分类器的准确率达到了我们的要求(阀值),那么这个分类器才能进行下一步的操作。
因此,准确率这个指标实际上是非常非常重要的,它直接确定了这个分类器合格与否。
那么,我们应该如何去提升分类器的准确率呢?
关于这个问题,实际上是贯穿了分类的整个流程的。因为这个指标的好坏实际上涉及到了从头到尾的方方面面。联想一下我们的现实生活,在工厂生产中产品的合格率会涉及到原材料,处理工艺,加工工艺等一系列的问题。因此在这里,鉴于我们目前只学习了决策树这一种分类器,所以我们就从“如何提供决策树分类器的准确率”这一点谈起,待我们后面学习了解了更多的分类器之后,再逐步地去探讨这个问题。
在用训练集训练决策树的时候,训练集里面不可避免的会存在一些噪声和离群点。关于这些数据我们可以在数据预处理阶段进行处理,但是不可能完全处理得干净。所以,当处理效果不到位的时候,在决策树创建时,许多分枝实际上反映的是训练数据中的异常。这种异常肯定不是我们想要的,因此我们必须要对它进行处理。回想一下,我在第一章给大家提到过这么一句话:KDD是一个持续的过程,因此,对于异常数据的处理也是一个持续的过程。因为我们没有办法一次就处理到位,所以我们在后续过程中必须不断地去做这些事情,而且不能完全依赖于前一处理步骤的结果,其实这是一种设计哲学。
那么,我们如何去处理决策树中的异常分枝呢?实际上很简单也很形象,就是用树剪枝的方法。
具体来说又分为两种常用的剪枝方法:先剪枝后剪枝
先剪枝的设计思想如下:
在决策树的构建时,使用诸如统计显著性,Gainratio,Giniindex来评估划分的优劣,如果划分一个结点的元组将导致低于预定义阀值的划分,则给定子集的进一步划分将停止,而该节点就成为树叶。该树叶可以持有子集元组中最频繁的类或者这些原则的概率分布。
这是可以理解的。因为我们知道,实际上我们构建决策树时,它的发展是在我们掌握之中的。例如我们可以根据属性决策度量来决定它先划分哪个后划分哪个。同理,如果说我明知道这样划分会造成异常分枝,那么我肯定就不这么做了啊。
因此在先剪枝方法中,就是通过提前停止树的构建而对树进行“剪枝”。但此方法存在的问题是阀值的确定。关于阀值这个问题也不必多少,我们知道阀值的确定从来就不是一件简单的事情,因此,这个方法实际上并不多用。更常用的方法是后剪枝

后剪枝的设计思想如下:
这个就是由“完全生长”的树减去子树。通过删除结点的分枝并用树叶替换它。这个用于替换的树叶通常来说其值是被删除的子树的频繁类。

在书上P223页,有关于剪枝的详细讲解,其中对关于C4.5使用的悲观剪枝法应当有足够的认识,这个思想会多次出现在后面的章节中。
值得注意的是,在那个数据量不大的时代里,决策树分类器的效果是很棒的。但是随着数据量的不断增大,尽管有剪枝,尽管有新的决策树算法,尽管有可视化的构建工具,但是他们可能仍然很大很复杂很难理解,还会有“重复”和“复制”的问题。这是由它本身的设计思想所决定,这些特点吧,在面对海量数据时,会被急剧的放大,从而影响它的准确率和可解释性。为此,我们需要更有效的分类器。这也促成了规则分类器和组合分类器的诞生和发展。

规则分类器

规则是表示信息或少量知识的好方法,基于规则的分类器使用一组IF-THEN规则进行分类。一个IF-THEN的规则一般表示形式有如下两种
1.IF age=youth AND student=yes THEN buys_conmputer = yes
2.IF age=youth ^ student=yes THEN buys_computer = yes

如何建立基于规则的分类器呢?
1.由决策树提取规则
这个就简单了,先建立一个决策树然后对每条从根到数叶结点的路径创建一个规则。沿着给定路径上的每个分裂准则的逻辑AND形成规则的前件(“IF”部分),存放类预测的树叶结点形成规则的后件(”THEN”部分)
因为,这种方法是直接从决策树提取的规则,所以对于异常的处理有两种形式。
一种是,先对决策树进行处理(剪枝),然后再提取;
还有一种是,直接提取规则,之后再对规则进行修剪。
书232页,例8.7讨论了这一点

2.使用顺序覆盖算法提取规则
使用顺序覆盖算法可以直接从训练数据中提取IF-THEN规则(即不必产生决策树)
这种算法的核心思想是这样的:一次学习一个规则,每学习一个规则,就删除该规则覆盖的元组,并在剩下的元组上重复该过程。
形象的比喻就是切面条,在一大块面团上(数据),依次切下来一条(规则)并重复这个过程。
这种算法的思想与决策树的完全不同。我们回想一下决策树的算法思想,它是把一整块的数据经过数次划分之后,细化成规则。所以它是在同时学习一组规则,而顺序覆盖算法是一次学习一条规则
那么具体来说,该算法是怎么提取规则的呢?
参看P234图8.11可以很清楚看到。
学习的过程是从一般逐渐到特殊,最开始从规则前件条件为空的规则开始,然后逐步添加当时看上去最好的一个属性,然后重复这个过程直至最后。
那么问题就来了,每次添加规则的时候我们怎么知道哪个属性是当时最好的呢?
类似决策树有属性选择度量一样,顺序覆盖算法也有一个规则质量度量
同决策树的属性选择度量有:Gain,Gainration.Giniindex几个指标一样,顺序覆盖算法的的规则质量度量也有几个指标:熵,基于信息增益的度量。
其实,就我们自己单纯的认知来说,每添加一个条件,只要提高这个规则的准确率不就好了吗?
但事实上,这个想法真是naive,准确率本身并非规则质量的可靠估计,覆盖率本身也没有用。最好的做法是集成准确率和覆盖率。
书P234,例8.8详细讨论了这个问题。
在理解了 这个例子之后,我们知道了是根据规则质量度量来评估选择当时看起来最好的一个属性。但是,我也说了,只是当时看起来而已。也就是说,这个属性选择顺序到最好不一定是最好的,那么怎么解决这个问题呢?
由于该算法是贪心的,因此就不允许回溯。所以为了减少这种“当时最好”情况的发生概率,我们可以选择添加最好的k个属性,而不单单是只有一个。
同样的,对规则剪枝也是可以使用各种剪枝策略,如前面介绍的悲观剪枝方法。

如何使用规则分类器来预测元组类标号呢?
其实这个问题很简单,我这里多说的原因是因为会遇到一些特殊情况。
在正常情况是这样的:
如果元组X满足规则R1,则该规则被触发,然后被激活。
这里会存在这样一个问题,那就是规则被触发了不一定被激活,因为可能有多个规则被满足。那么这种情况主要有两种解决方法
,详情参考P231

朴素贝叶斯分类器

贝叶斯分类法是统计学的分类方法,它可以预测类隶属关系的概率,如一个给定的元组属于一个特定类的概率。
贝叶斯分类基于贝叶斯定理,经过研究发现,一种被称为朴素贝叶斯分类法的分类法的性能相当好。
在学习朴素贝叶斯分类器之前,我们要先学习贝叶斯定理。
贝叶斯定理
书上P227,8.3.1给出了详细的介绍。
我们重点看这个公式

        P(X|H)P(H)P(H|X)=——————————        P(X)

参考书上的例子,则将这个式子所对应式翻译成中文是这样的

P(H|X)=在已知顾客的年龄是35岁和收入在4万美元的情况下,该用户将购买计算机的概率;
P(X|H)= 在购买计算机的用户中,用户是35岁且收入在4万美元的概率;
P(H)=所有集中用户购买计算机的概率;
P(X)=所有集中用户是35岁且收入在4万美元的概率。

这个也有很好的现实基础。例如我们要预测固定群体购买 计算机的概率,则就可以从已有的数据中得到所需数据然后再计算就可以得到预测概率了。

贝叶斯分类器
不同于贝叶斯定理,贝叶斯分类器是用来预测标号的,
P227页,8.3.2节着重讲解了这一节。大家一定要重点看下这整个小节,讲解的非常细致。

模型的评估与选择

如何评估分类器的性能呢?
我们在前面已经粗略的涉及到了准确率,覆盖率这些概念。但实际上,这只是分类器度量的一部分。
书236页,8.5.1节介绍了诸如正元组负元组准确率错误率特效性精度等概率及其定义。
而单独记忆这些术语很难记,而实际上这些概念之间又有关系。因此,这些术语汇总在混淆矩阵中。P237页,图8.14给出了混淆矩阵的一个实例。
之所以出现这么多的度量指标,是因为我们在实际中会遇到很多不同情况,会有很多不同的侧重点。仅靠一个指标,远远不能满足我们的需求。须知,KDD是由实际需要推动的,如果说只是应用在商业,那么出现误差只损失一点钱那还好说,如果说要是应用在医药领域,那么这一点误差可能损失的就是一条人命。因此,不同的指标有不同的侧重点。
一般来说,当数据类分布比较均衡时,准确率度量的效果最好,而当数据类分布不平衡时,诸如灵敏度,精度,特效性之类的其他度量效果会更好。

如何计算分类器的准确率呢?
一般来说,我们计算准确率并不是简单的跑一遍检验集然后就得到了。在这里,我们谈谈提升准确率的一般做法。实际上,这些方法的区别有二。一是取训练集和检验集的方式不一样;二是训练和检验的方式不一样。因此,最后的准确率实际上,根据所采取的策略不同计算方法也不同了。

单次计算分类器的准确率
我们知道,需要用检验集来检验分类器的准确率。单次计算实际上非常简单,就是把检验集在这个分类器上跑一下,然后你要简单的计算的话,就用检验正确的去除以总数计算就行了。如果规范一些,那么还是写成混淆矩阵的形式,去计算下准确率,灵敏率,错误率等这些一系列的指标。

保持方法与随机二次抽样
我们知道这样一个规律那就是:数据越多,准确率越高。
一般来说,我们默认的是把数据集的2/3拿出来做训练集,剩下的 1/3拿出来做检验集,这就叫保持方法。
当保持方法的准确率不高的时候,我们就重复这个过程。将保持方法重复K次,这就叫随机二次抽样法。经过随机二次抽样法之后的准确率取K次迭代后的平均值。

交叉验证
这个划分数据集的规律是这样的。

第一次:
D2,D3,D4……Dk一起做训练集,D1做检验集。
第二次:
D1,D3,D4……Dk一起做训练集,D2做检验集;
第三次:
D1,D2,D4……Dk一起做训练集,D3做检验集
…………………………

所以,其实这个思路有点像滑动窗口。一般来说,是迭代10次。其最后的准确率为K次迭代正确分类的元组总数除以初始数据中的元组总数。

自助法
在数据集中随机的有放回地抽样n次,其中训练集占原数据集的63.2%,检验集占原数据集的38.8%。
对于小数据集,自助法的效果非常好。

如何选择哪个分类器呢?
在前面我们已经使用了 一些策略来测算分类器的准确率。在这里,我们假设经处理,最后生成了两个分类器,他们的评估度量都不相同,那么我们应该选择哪个分类器呢?
直观的看法当然是选择指标好的那个分类器呀,但是!!!注意了,在我们临门一脚的之前,还忽略了一个问题。那就是,这些指标的值其实只是一个估计值。什么意思?
意思就是说,这两个分类器之间有差别,但实际上这种差别很有可能是偶然的。我们为了判定这种差别是否是偶然的,还需要进行统计显著性检验

实际上,在比较两个模型的性能这件事情上远比大家想象的复杂得多。
因为这涉及到几个重要的因素:首先,我们希望比较的是泛化性能,然后通过实验评估方法我们获得的只是测试集上的性能,两者的对比结果可能未必相同;第二,测试集上的性能与测试集本身上的选择有很大关系。且不论使用不同大小的测试集会得到不同的结果,即便使用相同大小的测试集,若包含的测试样例不同,测试结果也会不同。第三,很多算法实际上都是有一定的随机性的,即便使用相同的的参数设置,在同一个测试集上运行多次,其结果也会有不同。
因此,正因为有这么多的无法确定的因素,所以我们才要在统计学上去寻求帮助。
一般来说,我们首先要在统计意义上去验证单个学习期的度量指标是否是统计意义上可靠的,然后还需要在统计意义上去验证是否学习器A比学习器B在统计意义上性能优异些。

为了确定两个模型之间存在真正的差别,我们需要进行统计显著性检验。最后我们希望得到的是这样一个陈述:经检验,A分类器比B分类器好,且这种论断的误差在正负4%以内。
一般我们使用t-检验。
我们在之前讲过,不论是卡方检验,还是t-检验还是z-检验等,都是为了统计样本的实际观测值与理论推断值之间的偏离程度(第三章的学习记录)。在这里,我们假设这两个分类器是相同的,如果计算值大于标准阀值,则我们拒绝假设(拒绝认为他们是相同的),则这两个分类器之间存在统计显著的差别。那我们就可以选择一个指标好的分类器了;而如果说不能拒绝假设,那么这两个分类器的指标就不准确了,我们也不能直接通过指标来判别两者之间的好坏了。
也就是说,我们在实际根据参数评估之前,要确定这些评估参数是可信的!!!
其思想是建立在评估参数有可能是错误的基础上的。P241页,8.5.5具体讲解了一下。
这里其实我也不是很确定,这只是我的想法,可能是错的。先暂且记下。

基于成本效益评估选择分类器
根据具体应用,选择侧重指标,计算成本,最后做出决定。

基于ROC曲线进行比较选择分类器
参考书上P243,及下面的文章。
ROC曲线——百度百科
LinkLab
看完之后,大家应该能够理解。重点要理解ROC曲线是如何绘制的。
在这里需要注意的是,大家看ROC曲线的时一定不要带着看点的心态去看。大家要想到,我们这个东西是基于统计概率的,单纯的落在某一点来看没有任何实际意义。ROC曲线反映的是一种价值评判取向吧(我不知道这样说合不合理,大家能不能理解我的意思)。实际上我觉得通过ROC曲线来评估分类器好坏的话,最重要的是计算AOC吧。如果AOC=0.5的话,就说明这个分类器是随机猜测的,没得任何价值

如何提升分类器的准确率呢?
我们主要关注组合分类器(ensemble)。
组合分类器是一个复合的分类模型,它由多个分类器组合而成。顾名思义,就是在多一道判别手续。例如,现在考虑一个进行多数表决的组合分类器。也就是说,给定一个带分类元组X,它收集由基分类器返回的类标号预测,并输出占多数的类。基分类器可能出错,但是只有当超过一半的基分类器出错时,组合分类器才会误分类X。当基分类器之间存在显著差异时,组合分类器产生更好的结果。也就是说,理想的,基分类器之间几乎不相关。基分类器还应该优于随即猜测。每个基类分类器都可以分配到不同的CPU上,因此组合分类方法是可并行的。
装袋,提升和随机森林都是组合分类方法的例子。

装袋
P246,8.6.2

提升和AdaBoost
P247,8.6.3

随机森林
P249,8.6.4

阅读全文
0 0