进入科科研室之后在组长的带领下也学了快有一年的R语言了,很快就要去找实习进行面试了。而面试难免会被问及很多的经典算法原理,从学习到现在,还从来没有将某一个算法完完整整的按照自己的理解去讲解出来,也从来没有进行过系统性的总结。总之就是学的时候没有构建起一种知识体系。但是为了能在将来的面试中不被问的一句也说不出来,因此,咸鱼也决定翻翻身。从现在开始每周一个算法讲解,在讲的同时,让自己更加了解这个算法,同时明白自己的不足之处。也希望与大家共同进步,不足之处也希望大家能够提出来共勉。好了,废话不多说,接下来进入正题。
第一个算法我们来回顾决策树,那么多算法为什么先要看决策树呢?emmmmm....因为这些个算法中我了解的比较多的其实是随机森林,但是呢还不能先讲随机森林。因为随机森林是建立在多个决策树上的。因此呀,只能委屈一下先看决策树咯。
决策树听起来就很好理解:方便大家做决策的一种树形结构,但是呢,这个树跟我们看到的树是不一样的。决策树的根在最上面(一棵倒着长的树,咦~想想就有点吓人),而且它是自上而下生成的,最下端为树的叶。可能会使你联想到二叉树,没错!它跟二叉树长的确实有几分相似,但是呢又不尽相同,决策树的每个节点可以分很多个叉(当然也可以只有两个叉),但是二叉树只能两个叉。当然,前边讲的这一堆都不是重点,下边才是重点,敲黑板。
决策树的构造也比较简单,现在大家就想象一棵倒着的树。然后呢,树的根那写着多个选择,比如说我们有三个选择在这里:晴天、多云和雨天。然后每个节点通过设定的阈值(这个东东在数据分析中会经常用到,再在这就不细讲了,在这就当它是某个条件吧)再细分为更多的节点,然后再继续往下细分,分到不能分的时候的节点就成为叶子结点,一个叶节点就代表一个决策。这里上一张图可能更好的理解:
(注:图片盗自数据挖掘R语言实战那本书)
从上面的图中不难看出,从根到叶子结点都有一条路径,这条路径就是一条“规则”。
决策树的建立可以看作是一个递归的过程,从代表整个数据集的根节点开始,该算法选择出最能预测目标类的特征,简而言之,就是找一个最好把数据划分开的一个特征。而且这个特征最能预测出目标变量的特征,然后,所有的案例将被划分到这一特征的不同值组中。这一过程形成了第一组树枝。紧接着再选择最佳的候选特征再继续划分,直到达到停止的标准。注意了,介个挺值得标准很重要啊(使劲敲黑板)。在这里这个标准是啥嘞?有以下几种情况:
(1)节点上所有的案例都属于同一类,意思就是不能再找出一个最佳候选特征,再把这个节点上的这堆案例分开。这种情况下是还有剩余的特征没有被用到,但是这些特征不能把该节点的案例们分开。
(2)没有剩余的特征来分辨案例之间的区别。即分到这个节点后原来的所有特征中再没有多余的特征再来划分节点上的案例了。简单来说就是特征被“用完”了。很明显,这个条件与第一个条件不同。这里是分到这个节点上的时候没有特征了。
(3)决策树已经达到预先定义的大小限制。即建模的时候限制了节点的个数或者决策树的层数,可能在还没有划分到不能再划分的时候因为达到了预先的限制,不再继续往下分。
具体来说,在每一次分类中:先找出各个可以作为分类变量的自变量的所有可能的划分条件,再对每一个自变量,比较在各个划分条件下所得的两个分支的差异大小,选出使得分支差异最大的划分条件作为该自变量的最优化分;再将各个自变量在最优划分下所得的两个分支的差异大小进行比较,选出差异最大者作为该节点的分类变量,并采用该变量的最优划分。如果你不太能看懂这段抽象的描述的话,可以看下面的描述。
决策树的分类很简单,只有两种决策树:分类树和回归树(这里也很有可能被提问哦)
分类树:针对目标变量为离散型的情况,即2最终目标是预测各样本的所属类别。
回归树:适用于目标变量为连续型,如预测出某人的月收入,可以建立回归树,当预测其月收入所属的区间,则属于回归树的范畴。
这么一对比你可能对分类树与回归树的不同有了个初步的了解。通过下面不同的算法介绍,你会对此有更深刻的了解。
决策树常用算法有C4.5、C5.0、CART
C4.5算法
经过对书中知识的查阅,知道C4.5是ID3的改进算法。如果你不知道ID3是啥的话可以自行查阅相关资料。由于这个算法已经被改进成新的算法,我索性就不学习它了,直接上手C4.5吧。首先要说明,C4.5是问了解决ID3只能用于离散型变量,即仅可以构建分类树,且确定判定变量时偏向于选择取值较多的变量这两个主要缺陷而提出的。诶?更巧的是后面即将介绍的C5.0正是C4.5在运行效率等方面进一步完善,但是呀,C5.0多用于商业用途,即便如此,C5.0算法的一个单线程版本的源代码是公开的,因此考科一编写成程序,比如R中就有改程序。与之对比来说,C4.5是更为常用的决策树算法。所以这里先介绍C4.5算法。
决策树建立的过程大同小异,都是将有P维特征的N歌样本分到C个类中,将样本经过一种变换赋予一种类别标签。
那么问题来了,怎么选择分叉特征呢?每一次分叉选择哪个特征对样本进行划分可以最快最准确的对样本分类呢?(不同的算法有不同的方案:ID3用信息增益,C4.5用信息增益比,CART用gini系数)
C4.5算法的核心是在决策树各个结点上应用信息增益比准则选取特征,递归的构建决策树。具体方法是:从根节点开始,对结点计算所有可能的特征的信息增益比,选择信息增益比最大的特征作为结点的特征,由该特征的不同取值建立子节点;再对子节点递归的调用以上的方法,构建决策树;直到所有特征的信息增益比均很小或者没有特征可以选择为止。
在介绍信息增益比之前先简单的说下信息增益:决策树学习中的信息增益等价于训练数据集中类与特征的互信息。如果决策树学习应用信息增益准则选择特征的话,经过是这样的:给定训练集D和特征A,经验熵H(D)表示对数据集D进行分类的不确定性。而经验熵H(D|A)表示在特征A给定的条件下对数据集D进行分类的不确定性。那么它们的差即信息增益,就表示由于特征A而使得对数据集D的分类的不确定性减少的程度。显然,对于数据集D而言,信息增益依赖于特征,不同的特征往往具有不同的信息增益,信息增益大的特征具有更强的分类能力。因此也就是选择信息增益最大的特征。本段话摘自周志华的机器学习那本书,这里我懂得也不是很透彻,只知道拿学过的信息论公式来套,如果你想学的更加透彻的话建议学习一下信息论。
信息增益值得大小是相对于训练数据集而言的,并没有绝对的意义。在分类问题困难时,也就是说在训练数据集的经验熵大的时候,信息增益值会偏大。反之,信息增益值会偏小。使用信息增益比可以对这一问题进行校正。
信息增益比:特征A对训练数据集D的信息增益比定义为其信息增益与训练数据集D的经验熵之比。即信息增益比上该数据集的经验熵。具体公式的话周志华的机器学习那本书上讲的很详细。我自己的数学基础不好,因此我也就不去深究每一个公式了,知道是大概啥情况就行了(身为咸鱼的我对自己的数学底子还是有点数的)。
C5.0算法
前面也提到过,C5.0算法是对C4.5算法的改进。因此它用到的标准也是信息增益比。(但是有本国内的书叫机器学习与R语言,它上边说C5.0用的是信息增益来选特征。我想了一下,写这个算法的人在ID3中用的是信息增益,而在它的改进算法C4.5中改进为信息增益比,到了C4.5的改进算法C5.0再改回信息增益的话那岂不是很无厘头?难道他老人家这么闲的吗,改来改去。所以我又上网上查了相关资料发现他老人家确实不是那种无聊的人,人家可忙着呢。所以:C5.0算法也是利用信息增益比作为特征选择的标准的。)由于C5.0并没有公布算发法的更多细节,但它的核心成分还是跟C4.5是一样的。那就不在这做过多的赘述了 。
CART算法
CART被称为分类回归树,顾名思义,它既可以做分类,也可以做回归。它同时是许多集成分类算法的基分类器,如下面将讲到的随机森林会以此为基础。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。
决策树的生成:基于训练数据集生成决策树,生成的决策树要尽量的大;
决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。(具体的在下边说)
CART算法对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则进行特征选择,生成二叉树。具体的量化公式我放弃了,看不懂。。。如果你想继续学习的话还是去看周志华的机器学习吧。
好了,以上就是这几种构建决策树模型的有名的算法。对于我这个渣渣来说,理解这些就够了。学数学?不存在的,别跟我提学数学,我跟它不熟(送你一个大黑脸)。
决策树的剪枝问题
现实中,由于生成的决策树存在过拟合的问题,因此需要对它进行剪枝操作。而决策树的剪枝往往是从已生成的树上剪掉一些叶节点或者叶节点以上的子树,并将其父节点或根节点作为新的叶节点,从而简化生成的决策树。
因此呢,决策树的剪枝也是门学问,按照什么标准剪,剪到什么程度也要有讲究。
C4.5以及C5.0决策树的剪枝往往是通过极小化决策树整体的损失函数或者代价函数实现的。(公式就不摆了哈)
而CART决策树的剪枝分两步走:首先从生成算法产生的决策树底端开始不断剪枝,直到该决策树的根节点形成一个子树序列;然后呢通过交叉验证法在独立的验证集上对子树序列进行测试,从中选出最优子树。在选最优子树的过程中测试子树序列中各棵子树的平方误差或者基尼指数,平方误差或基尼指数最小的决策树被认为是最优子树。
R中的应用
在R语言中,CART算法主要用到的包是rpart、rpart.plot、maptree。C4.5算法用到的是RWeka包里边的J48()函数。C5.0算法主要用到的是C50包。
结语
好啦,对我自己的水平来说,决策树中感觉自己要学的就这么多(少),这是自己的第一篇博客,也是未来面试要用到的第一篇文章。希望大家能够积极批评指正,在未来大家共同学习,共同进步。写上面的这点东西参考了很多大佬们写的书,就不一一列举啦。也希望更多的大佬能为我这个渣渣推荐点学习的书,再次感谢(跪谢)。