决策树可能是对于相关样本进行分类示性最为直观的一种方法,使用决策树方法来演示分类的过程对于读者而言可能也是最简单的一种方式,我们可以称之为它是白箱算法,所谓白箱就是直接可以对其进行观察、可以进行可视化;那么如何衡量哪一种决策树的形态是较好的分类方式,也就是说对于高维样本,如何来确定使用各个维度的划分顺序(即树上判别条件的先后关系)而更快地得到分类的结果就成为了研究的目标,当然如果样本仅有一个维度我们就没有必要进行研究了。
流行的决策树算法主要包括以下这三种:ID3算法、C4.5算法以及CART算法,在一般讨论决策树算法的文章或者教课书中也是主要围绕这三种算法进行的;另外,本文还会讨论一下可能天然就与决策树算法相关的内容(这里使用了“可能”,也就是说森林中的树其实不一定非要是一般意义上的决策树,只不过使用决策树更为常用罢了)——随机森林,至于为什么要使用随机森林以及随机森林可能带来的好处,我们将在描述随机森林的时候予以简单讨论;当然本文并不是主要着力在决策树以及随机森林的算法编写本身,甚至可能不太会涉及决策树的相关剪枝问题,笔者觉得那可能不是什么主要内容,我们将聚焦于决策树本身可能传达出的一些信息以及可能在分类问题中使用的一些比较常用的度量指标——熵(Entropy)。
熵本身承载了事物的信息量,恰恰是对这个指标的变化转换,使我们对于一些问题的本质产生了更为深刻的认识,而且熵这个东西还会在今后的相关机器学习的内容中出现,比如评价神经网络学习误差的指标——交叉熵(Cross Entropy)。
按照惯例我们在讨论本文主题——决策树之前,还是先给出文中可能用到的一些符号或公式等,以免在今后的问题描述中产生不一致或混乱。与之前的讨论不同,以下不仅会涉及到样本的维度,而且还会讲到不同维度的取值(这些取值可能是离散的,也可能是连续的,但都不影响问题的描述,而且对于连续的值域实际上可以采用一些方法将其离散化,但这个不是本文的讨论范畴)。
对于样本集合,我们还是使用X来表示,而单个样本则使用xk来表示,这些与以前的文章并无二致,而我们使用xkr来表明样本的第r的特征(即第r个维度,假定共有p个维度,在这里关于维度和特征的用词我们不再纠结,就当成一样的就好了)的属性值或特征值。
按笔者的理解,那我们对于如何构建一个决策树其实就是一个不断寻找最佳的属性特征顺序组合的过程,这其实是一个穷举的流程,比如我们在审核一个人能否办理信用卡(或者授信额度高低)的时候,这个人可能我们会从年龄、学历、婚否、工作状况、有无房产等不同的维度来考察,但是哪个维度或者说是特征应该放在决策树的顶部、而那个又应该放在下面直至底部呢?这个对于特征的排列在数学上也被称作置换;另外,本文使用τij表示对于集合(1,2,...p)的一个置换(p是维度的上限)(τij(1),τij(2),..., τij(p)),这里的i表示第i类,而j表示这个i类中的第j个条件(显然条件之间是互斥的;而且在一个类中,划分的条件也就是特征的值组合是不一样的、存在多个),那么对于类别i而言,其满足的第j个条件就可以抽象地写作:
实际上rij就是条件的长度,而就是第τij(1)特征的某个固定特征值。一般而言,在对相关事物进行分类的时候,我们肯定希望使用的条件越少越好,反映在公式1中就是rij越小越好,那么条件也就越短,即针对优化下式:
那怎样才能使上式越小呢?这里先引出之前提到过的一个重要的概念——熵,人们使用它来进行相关评判。
如果样本可以被分为c类,而这些类别的样本占总体样本的比例乘以其对数,再乘以负一,则就是某类别的熵,样本总体的熵就是所有类的熵之和:
这个公式和式3没有任何区别(不过本文还是以公式3为主),都是使用样本概率来计算熵。如前所述,熵就是表示事物承载信息量多少的指标,而熵值越高则约不稳定,越低则越趋向稳定;试想如果我们研究的对象只包含一个类别,则熵值必然为0,这就从另外一个方面说明了这个问题。
另外,还有一个比较重要的概念就是,在某个特征(特征还是使用τ)下计算的熵值,公式如下:
应该如何理解公式5?其中v表示特征τ取值的情况,它一共有个不同的值(当然不同特征取值的个数是完全不同的,比如性别特征只有2个,即男和女,而学历可能有十几个,包括如文盲、小学、初中等),那么上式所表达的根本含义就是特征进行分裂(取不同的值)时的熵值,而良好的决策树算法任务就是优先找到分裂时熵值更大的特征,从而使整体判定的性能更为优良。
至此笔者已经给出相关算法的一般表达基础公式和符号解释,下面就几个主流的决策树算法进行简单的讨论并给出适当的样例。
ID3算法是一个比较基础的决策树算法,在一般场合下它的效果还是不错的,其根本原理就是根据每次选取的特征分裂的熵值变化来选择某次到底应该使用还未被选择的特征,简而言之,就是计算下式:
以下笔者还是通过之前用到的例子(在贝叶斯决策中给出;网上给出的例子绝大多数都是基于天气变化来确定是否出游的,天气包括气候、温度、湿度等特征,决策就是是否出去游玩)来说明决策树的生成过程,现再次给出这个例子:
特征F1的取值范围为{s,o,r}
特征F2的取值范围为{h,m,c}
特征F3的取值范围为{h,n}
特征F4的取值范围为{t,f}
特征F5的取值范围为{d,r}
而每个样本被分为L1和L2两个类别。
现我们有20个样本,其各个特征的取值和分类情况,如下表所示:
序号 | F1 | F2 | F3 | F4 | F5 | 类别 |
1 | s | h | h | f | d | L2 |
2 | s | h | h | t | d | L2 |
3 | o | h | h | f | d | L1 |
4 | r | m | h | f | d | L1 |
5 | r | c | n | f | d | L1 |
6 | r | c | n | t | d | L2 |
7 | o | c | n | t | d | L1 |
8 | s | m | h | f | d | L2 |
9 | s | c | n | f | d | L1 |
10 | r | m | n | f | d | L1 |
11 | s | m | n | t | r | L1 |
12 | o | m | h | t | r | L1 |
13 | o | h | n | f | r | L1 |
14 | r | m | h | t | r | L2 |
15 | r | m | n | f | r | L1 |
16 | s | m | n | t | r | L1 |
17 | o | m | h | t | r | L1 |
18 | o | h | n | f | r | L1 |
19 | r | m | h | t | r | L2 |
20 | r | c | n | t | r | L2 |
如果需要计算新的样本x={s,m,h,t,d}的分类,那么该如何利用上表中给出的样例进行判别?
先计算各个类别的熵值之和:
Comp(X)=-[(13/20)*ln(13/20)+(7/20)*ln(7/20)]=0.647
Comp(X|F1)=-{(6/20)*[(2/6)*ln(2/6)+(4/6)*ln(4/6)]+(6/20)*[(6/6)*ln(6/6)+0]+(8/20)*[(4/8)ln(4/8)+(4/8)ln(4/8)]}=0.191+0.277=0.468
(说明:上式表明对于特征F1的条件熵而言,由于F1的取值有三个,分别是s、o和r,它们在20个样本中各占6个、6个个8个,而当F1的值为o时,由于其分类均属L1故其熵值为零;以下计算不再说明)
Comp(X|F2)=-{(5/20)*[(3/5)*ln(3/5)+(2/5)*ln(2/5)]+(10/20)*[(7/10)ln((7/10)+(3/10)*ln(3/10)]+(5/20)*[(3/5)*ln(3/5)+(2/5)*ln(2/5)]}=0.168+0.305+0.168=0.641
Comp(X|F3)=-{(9/20)*[(4/9)*ln(4/9)+(5/9)*ln(5/9)]+(11/20)*[(9/11)*ln(9/11)+(2/11)*ln(2/11)]}=0.309+0.261=0.570
Comp(X|F4)=-{(10/20)*[(5/10)*ln(5/10)+(5/10)*ln(5/10)]+(10/20)*[(8/10)*ln(8/10)+(2/10)*ln(2/10)]}=0.173+0.250=0.423
Comp(X|F5)=-{(10/20)*[(6/10)*ln(6/10)+(4/10)*ln(4/10)]+(10/20)*[(7/10)*ln(7/10)+(3/10)*ln(3/10)]}=0.337+0.305=0.642
通过上面的计算,我们可以看出对于这个例子而言决策树的根节点应该选择特征F5,其它特征的选取则按照类似的原则排列,故我们得到的特征判别顺序为F5->F2->F3->F1->F4,那么根据x的相关特征取值,实际上只要进行4次判断即可知其属于L2类(对于特征F4已经没有判断的必要了),这个得到的结果和使用贝叶斯方法(其实是朴素贝叶斯方法)是一致的,可能这个例子也体现出在机器学习的世界中,也存在“殊途同归”的现象。
顺便说一句,在生成决策树后,由于样本存在噪声和异常值,可能产生过拟合的现象,故应该对其进行一定程度的简化——剪枝,其方法一般包括先剪枝和后剪枝两种,对于前者而言现在用的已经不多,它是在完全生成决策树之前就停止;而后者则在生成决策树之后,尝试使用一些叶节点来替代其相关父节点,然后评估误差,如可接受则将对应的分支减去,后剪枝的效果要好于先剪枝。
基于信息增益法的ID3算法确实是一种选择特征的有效办法,但它也存在明显的问题,就是它会倾向于选择特征值较多的特征。为了克服这个问题,人们又提出了一种基于信息增益率的算法——C4.5,它不仅会对各个特征的熵值变化进行评估,最主要的是其实它是主要变化熵值变化率的方法(其实就是考虑变化的相对性)。
为了达到这个目的,现定义一个分裂函数:
在生成相关决策树的过程中,对某个特征分裂顺序的评判标准由信息增益改变为对信息增益率的计算;与ID3算法类似,C4.5算法也同样存在剪枝问题。对于上节所举之例子,读者可以根据相关公式自行予以计算,这里不再给出。
CART(Classification And Regression Tree)即分类回归树算法,是一个既可以用于分类也可以用于回归的算法;其在生成决策树的过程中主要使用了被称为Gini指数的东西,它定义如下(对于全体样本而言):
那么根据所定义的Gini指数的变化,在构建决策树时选择其变化大的部分(即公式9减去公式10),但和之前的ID3算法以及C4.5算法不同的是,CART算法不会生成多叉树,而只会产生二叉树,其对于某个特征的分裂(如果特征值多于2个)需要进行二值化,即对特征值集合进行二划分。
在生成CART的决策树时,可以设定一定阈值来停止树生成,这个主要包括两种方法,其一是根据样本个数,如剩下的样本少于这个阈值就停止;其二类似C4.5算法,可以设定一个变化值,如低于这个值则停止生成,也就是说CART算法其实使用的是一种先剪枝的策略。
随机森林可以说是目前较为流行的决策树算法的变化,使用它的好处在于不用考虑剪枝问题,其运转原理是生成若干个决策树,而森林中的每个决策树所包含的决策属性较少,在很多情况下甚至只有一个属性或特征(有的文献中也建议对于每颗树的特征取值采用总体特征数的平方根),然后用样本进行放回的训练,对于需要判断的新的样本则采用投票方式得到其分类,也就是说如果多数决策数指出样本属于哪个类则它就是那个类。
以下不再给出相关形式化的描述,只是通过之前的例子来简单说明下判定过程,这里我们使用单属性,即能够得到一个由5颗树组成的森林:
针对特征F1的相关三个取值数量分别是6、6、8个,而其被划分为L1的比例为1/3、1和1/2,其被划分为L2的比例分别为2/3、0和1/2;
针对特征F2的相关三个取值数量分别是5、10、5个,而其被划分为L1的比例为3/5、7/10和3/5,其被划分为L2的比例分别为2/5、3/10和3/5;
针对特征F3的相关两个取值数量分别是9和11个,而其被划分为L1的比例为4/9、9/11,其被划分为L2的比例分别为5/9、2/11;
针对特征F4的相关两个取值数量都是10个,而其被划分为L1的比例为5/10、8/10,其被划分为L2的比例分别为5/10、2/10;
针对特征F5的相关两个取值数量也都是10个,而其被划分为L1的比例为6/10、7/10,其被划分为L2的比例分别为4/10、3/10。
那么对于新的样本x={s,m,h,t,r},可知其被明确判定为L1的类别的树有3个,而被明确判断为L2类别的树有2个,故此样本应为L1类。
原文地址:http://13345387.blog.51cto.com/13335387/1976725