无公式无代码白话机器学习算法之决策树

来源:互联网 发布:软件项目预研报告 编辑:程序博客网 时间:2024/04/28 04:12

引子 

       今天开始读刘未鹏的《暗时间》一书。在序言中,有一句话引起了我的兴趣,“波普尔曾经说过:人生不过是解决问题。而判断和决策又是其中最常见的一类问题解决。” 哈哈,我们的机器学习各种算法不就是解决问题的嘛,决策树不就是最常见的一种解决分类或者回归问题的机器学习算法嘛!刚好凑到一起去了。的确,个人感觉决策树是所有常见机器学习算法中最容易直观理解其原理的,也符合我们大部分人在面对问题时做出决策的思路。今天我们就来侃一侃这个“平易近人”的决策树。

        在日常生活中,我们解决一个问题,必然要做出一个决策。就拿网络上最常见的一个决策树的例子来说吧!大概是这样的:小红的妈妈给小红安排相亲。小红问:“长的帅吗?”妈妈说:“挺帅的。”小红又问:“收入高吗?”妈妈答:“不怎么高,中等吧!”小红接着问:“那是公务员吗?”妈妈答:“是的,人家在税务局上班呢。”小红做出决策:“好的,那我去见见他。”

        在上面的例子中,小红要解决问题就是要不要去见这个男生。做出的决策就是:去见见他。我们看到被决策的客体就是测试样本,这个样本具有一系列的属性。在做出决策的过程中,小红不断利用样本的属性值来一步步地到达最终的决策。

决策树模型的理解

        最常见的决策树是用于分类问题的,我们先从分类决策树谈起。我们可以将机器学习为了解决分类问题而提出的算法分为三类:基于规则的分类基于概率的分类(逻辑死地回归,朴素贝叶斯分类器)和基于实例的分类(KNN)。而分类决策树就是基于规则哒!

        对于决策树这种模型的理解,一种方法是可以将其看做是一系列if-then规则的集合,而由决策树的根节点到叶节点的每一条路径构成一条规则。因为每一个叶节点都是由根节点出发,在满足一系列if条件后不断then下去,最终到达叶节点;另一种方法是可以将决策树表示为给定特征条件下类的条件概率分布。在构建决策树的时候,训练样本的每一个属性都可以将特征空间进行划分,那么所有的属性就将特征空间划分为一个个相互没有交集的独立的区域。决策树的一条路径最终会到达其中的一个区域。然后这个区域中一般会有多个样本啦,因为训练集中可能有多个相似属性的样本。但是这些样本却不一定属于同一个类哦,当然属于同一个类是最好的了。如果把从根节点到达这个区域的路径上的所有属性取值定义为X,把这个区域中样本的类别定义成Y,那么这个条件概率分布就可以写成P(Y|X)。各个区域上的类条件概率中总有一个最大的吧,如果一个测试样本到达这个类,我们就把这个测试样本归为这个概率最大的类。比如一个这样的区域中有5个样本,其中有3个属于Y1类,有两个属于Y2类,那么如果有测试样本到达这个区域,那么我们就认为他属于Y1类。

        那么,既然这个模型这么容易理解,那么如何去训练一个决策树模型呢?

决策树模型的训练

        首先我们必须得有一批训练集吧。我们希望从这批数据集中提取规则建立决策树,也就是以怎样的一系列标准作为不断划分数据的依据。我们知道,不同的标准必然导致划分数据的结果不同,也就会生成不同的决策树。我们需要的是一个与训练数据矛盾最小的决策树,然后这是不可能的。因为从所有可能的决策树中选取最优决策树是NP完全问题。在现代计算机科学中,解决NP完全问题的方法一般是采用一些启发式搜索策略,以期在较短时间内获得一个很好的近似解。在这里,决策树采用的是一种“贪心”的搜索策略。在从根节点构建决策树时,递归地选择当前最优的特征来划分训练数据集,直到所有的训练数据集被基本争取分类,或者没有合适的特征为止。这里特征的选择非常重要。我们知道一个机器学习算法的性能,有时候就是因为特征选择的好,会对结果产生巨大的性能提升。

        可是,就算你训练数据集再大,也不能包含所有可能的数据,是吧?所以,这样学习出来的决策树难免会对训练数据有良好的分类能力但对测试数据却不一定,也就是产生了过拟合。解决决策树过拟合的方法就是对决策树进行剪枝。

        由上我们可以看出,决策树的学习算法包含特征选择、决策树的生成与决策树的剪枝过程。由于决策树表示一个条件概率分布,所以深浅不同的决策树对应着不同复杂度的概率模型。决策树越深,说明条件越多,那么模型就越复杂咯。决策树的生成对应于模型的局部选择(没办法,谁让人家是NP完全问题呢),而决策树的剪枝则考虑全局最优(必然嘛,既然已经基本构建出来了,能全局最优肯定要全局最优)。所以,决策树的模型训练除了特征选择以外,主要分局部探索全局寻优两个阶段。

常用的决策树的学习算法

        (唉,本来就是想简单写写,没想到这一块内容可说的还挺多。既然开了头,一定要坚持下去!下面我将着重一些细节的理解。)

       ID3算法

        这是最一般的决策树,也是我们最为熟悉的。核心是在决策树的各个节点上应用信息增益准则选择特征,然后递归构建决策树。ID3相当于用极大似然法进行概率模型的选择。这是因为,所谓极大似然,就是在模型选择的时候,我们要得到模型的一些参数。给定一定训练样本的情况下,它必然不能代表所有的可能样本。于是,我们需要得到这样的模型参数,在这样的参数下,模型生成我们所得到的训练样本的概率是最大的。回到ID3算法中,我们构建的决策树没有办法满足所有的可能样本,于是,我们尽最大可能满足已有的训练样本,以期获得全局最优的近似。

        说到ID3算法的信息增益,就不得不说到熵。之前的我可谓是谈“熵”色变:感觉熵这个东西太抽象了,计算的熵的公式也那么复杂。到后来读了吴军老师的《数学之美》,竟然对熵的态度来了个180度的大转弯,深深地感受到信息论的神奇,也对信息论创始人香农感到无以名状的敬佩。

        简单的说,熵是对不确定性的度量,而信息可以减少这种不确定性。这就是为什么条件熵总是要小于其相应地“无条件时候”的熵。因为加入了条件,就相当于加入了信息,自然会降低不确定性。然后降低多少的度量,就是信息增益:特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验熵H(D|A)之差。由于不同的特征具有不同的信息增益,信息增益大的特征具有更强的分类能力,所有ID3每次选择信息增益最大的特征扩展节点。

        熵的计算公式我就不多说了,这里我想说一下条件熵。因为条件一般也是一个变量。我们先计算这个条件变量取特定值时候的熵,那就是将熵的计算公式中所有的概率修改为条件变量取特定值得条件概率。那么,真正的条件熵,不能仅考虑条件变量的特定情况,而是应该将条件变量取所有可能值得熵都计算出来,然后再根据这些可能值出现的概率进行线性加权,就得到了条件熵的计算公式。另外给出一个公式:条件熵等于复合熵减去条件变量的熵。可以将所有概念联系起来。更多的关于信息论的知识可以点击这篇博客,写的超好。

        好啦,下面开始介绍ID3算法的剪枝。我们知道剪枝可以使决策树模型简单化,防止过拟合。具体地,剪枝从已经生成的树上裁掉一些子树或叶节点,并将其根节点或父节点作为新的叶节点,从而简化分类树模型。决策树的剪枝往往通过极小化决策树整体的损失函数来实现。这个损失函数采用节点个数衡量模型复杂度并作为正则化项。当调和参数alpha确定时,子树越大,往往与训练数据的拟合约好,但是决策树的子节点就会越多,模型复杂度越高。相反,子树越小,模型的复杂度越低,但是往往与训练数据的拟合不好。损失函数正好表示了对两者的平衡。

        其实,损失函数的极小化等价于正则化的极大似然估计。为什么是极大似然估计呢?因为我们努力使目前的模型尽量能够拟合当前的数据,具体表现为所有的叶节点的不确定性最低。为什么是正则化的呢?你的模型最大化地拟合训练数据可以,但是对不起,你要付出的代价是模型复杂度的提高。于是用正则化项来约束调和。

        可以看出,决策树生成只考虑了通过提高信息增益对训练数据进行更好的拟合。而决策树剪枝通过优化损失函数还考虑了减小模型的复杂度。决策树生成学习局部的模型,而决策树剪枝学习整体的模型。也就是说,我们要训练一个完整可用的决策树,其实是要经过两次模型选择的。第一次先粗略地在模型参数空间中进行搜索,第二次再精细地做出最后的调整。经过两次模型选择保证了决策树的准确性和泛化能力。

       C4.5算法

        与ID3算法相似,只是在生成模型的过程中,用信息增益比来选择特征。在剪枝方面可以与ID3相同。关于这个信息增益比,就是用ID3计算出的信息增益,除以关于用当前特征划分数据集的熵,也叫内在信息。内在信息惩罚了那些划分数据集个数过多的属性。也就是说,如果当前特征划分数据集得到的子集个数越多,那么这样划分的数据集熵越大,那么同样的信息增益,其信息增益比越小。这是为了防止有些属性取值较多然后几乎每一个值都是对应一类,虽然信息增益很大,但是这会导致得到的决策树很浅而且子节点繁多复杂,显然这不是合理的选择。(李航老师《统计学习方法》的2012年3月第1版对于信息增益比有勘误,请注意。)

       CART算法

        又可以用来分类又可以用来回归的决策树,非常棒。这一部分打算在写完回归问题后再一起总结吧!

决策树的优缺点

优点:

1,直观容易理解;(这是废话)

2,可以处理不相关特征数据;(是哦,不管是离散型还是连续型;不管是标称型还是数值型)

3,构建专家系统,用于分类或者预测;(很多专家系统还有预测系统都是用决策树实现的)

缺点:

1,构造决策树很耗时,所以要将创建好的决策树存储用于之后的分类,不支持在线学习。理论上,决策树构建一个节点的时间复杂度是O(mnlog(n)),其中n是训练样本数,m是特征维度,log(n)是寻找最优切分点的时间复杂度(个人理解,不知对否)。那么,构建整个决策树的时间复杂度即为O(mnnlog(n));

2,容易过拟合。这是因为,决策树经过每一个节点的划分,就将数据集划分为至少两份,每一份作为子树的训练数据。那么,经过多层划分之后,子树的子树的训练数据就会大大减少,编容易导致过拟合。尤其是当训练数据的特征维数很高时更是如此。针对这个问题,我们的决策树在训练的时候树的深度不要太深,而且在构建训练数据集的时候,最好能考虑到数据在各个特征上的均匀分布以及数据在各个类别上的均匀分布;此外还要注意叶子节点中数据的个数最好也不要太少。

1 0
原创粉丝点击