决策树C5.0学习总结

    机器学习补充系列国际权威的学术组织the IEEE International Conference on Data Mining (ICDM,国际数据哇局会议) 2006年12月评选出了数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART,它们在数据挖掘领域都产生了极为深远的影响,这里对他们做一个简单介绍,仅作为对Ng机器学习教程的补充。

    由于k-Means、SVM、EM、kNN、Naive Bayes在Ng的系列教程中都有涉及,所以此系列教程只涉及决策树算法C4.5、关联规则算法Apriori、网页排名算法PageRank、集成学习算法AdaBoost(Adaptive Boosting,自适应推进)、分类与回归树算法CART(Classification and Regression Trees);另外会加上对神经网络的BP算法介绍,后续也会考虑介绍遗传算法等内容。



1)决策树之ID3

2)决策树之C4.5



1)决策树之ID3

决策树算法是分类算法的一种,基础是ID3算法,C4.5、C5.0都是对ID3的改进。ID3算法的基本思想是,选择信息增益最大的属性作为当前的分类属性。

看Tom M. Mitchell老师的《Machine Learing》第三章中的例子:

我们先解释一下这张表,表中有14条实例数据,就是我们的训练数据,其中 Outlook,Temperature,Humidity ,Wind 称作条件属性PlayTennis 称作是决策属性(标签)

每一个属性都有各自的值记做:Value(Outlook)={Sunny,OverCast,Rain},Value(Temperature)={Hot,Mild,Cool},Value(Humidity)={High,Normal},Value(Wind)={Strong,Weak},Value(PlayTennis)={NO,Yes}。

第一个重要的概念:Entropy。

我们数一下  决策属性PlayTennis,一共有两个类别:Yes,No。Yes的实例数是 9,No的实例数是 5。计算决策属性的Entropy(熵):计算结果为:0.940286

这里的决策属性S的值只有两个值(Yes,No),当然可以有多个值(s1,s2,s3,...,sk),这些决策属性的值的概率分别为:p1,p2,p3,...,pk所以决策属性的Entroy的计算公式:


第二个重要的概念:information gain(信息增益)

我们只拿Outlook条件属性举例,其他的属性一样:

Value(Outlook)={Sunny,OverCast,Rain}:Outlook是sunny的实例数为5(其中Yes的个数为2,No的个数为3),占总的实例数为5/14,那么针对sunny的Entropy:

Entropy(Sunny)=,计算结果为:0.97095

Outlook是OverCast的实例数为4(其中Yes的个数为4,No的个数为0),占总的实例数为4/14,那么针对Overcast的Entropy:

,计算结果为:0

Outlook是Rain的实例数为5(其中Yes的个数为3,No的个数为2),占总的实例数为5/14,那么针对Rain的Entropy,

,计算结果为:0.97095

那么最后针对Outlook条件属性的information gain为:

,计算结果为:0.24675

所以针对某一条件属性的information gain为:

       

那么其他三个条件属性Temperature、Humidity、Wind的信息增益为:


我们看到Outlook的信息增益是最大的,所以作为决策树的一个根节点。即:



然后,从Outlook下面出来三个树枝,最左边的Sunny,我们从Outlook是Sunny的实例数据中,找到信息增益最大的那一个,依次类推。


2)决策树之C4.5

上面讨论的决策树的ID3算法,属性只能是枚举型的(离散的),当然属性值可以是连续的数值型,但是需要对这些数据进行预处理,变为离散型的,才可以运用ID3算法。

所以Ross Quinlan又提出了C4.5算法,能够处理属性是连续型的。而且,在C4.5算法中,又提出了两个新的概念:分离信息(Split Information)和信息增益率(Information gain ratio)。

首先,给出分离信息的计算方法,数学符号表达式为:。解释为:数据集通过条件属性A的分离信息。上面一个例子,数据集通过Outlook这个条件属性的分离信息,Outlook有三个属性值分别为:Sunny,Overcast,Rain,它们各占5,4,5,所以:


再次,给出信息增益率的公式:。上面这个例子如:数据集S针对Outlook的信息增益率:

,分子和分母这两个值都已经求出来,选择信息增益率最大的那个属性,作为节点。


C4.5算法的核心算法是ID3算法。C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进:

a)用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足;

b)在树构造过程中进行剪枝;

c)能够完成对连续属性的离散化处理;

d)能够对不完整数据进行处理。

优点:产生的分类规则易于理解,准确率较高。

缺点:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。



注意:

决策树之C5.0是决策树C4.5的商用算法,在内存管理等方面,给出了改进。比如在商用软件SPSS中,就有该算法。

注意上述三个算法只能做分类,不能做回归,下一篇博文CART类似于C4.5,但可以做回归。

java语言中最著名的的Weka,对ID3,C4.5都有实现。


决策树的基本流程

基本流程
决策树是一种常见的机器学习方法,以二分任务为例,我们希望从给定训练数据集学得一个模型用以对新示例进行分类,顾名思义,这个分类的任务是基于树的结构来决策的,这恰是人类在面临决策问题时一种很自然的处理机制。例如下图为对西瓜分类好坏瓜的决策树。
一般一棵决策树包含一个根结点,若干内部结点和若干个叶结点,如下是决策树基本学习算法。

决策树的生成是一个递归的过程,在决策树算法中,有三种情况会导致递归返回:
(1)当前结点包含的样本全属于同一类别,无需划分。例如当前结点所有数据都是好瓜,自然不用再划分。
(2)当前属性集为空,或是所有样本在所有属性上取值相同,无法划分。例如当前样本有好瓜和坏瓜,但其颜色是相同的,自然无法在颜色属性进行划分。此时把颜色定为叶结点,类别设为包含样本数量多的类别。
(3)当前结点包含的样本集合为空,不能划分。例如对颜色(青绿、乌黑、浅白)划分,但是剩余样本中不含青绿色西瓜,因此在青绿色属性上不能继续划分。此时把青绿色定为叶结点,类别设为其父结点(颜色属性)中所含样本最多的类别。

划分选择
决策树的划分过程还是比较简单的,原则是随着划分过程不断进行,希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”越来越高。
信息增益
采用信息熵来描述纯度,很显然信息熵越低(信息更加确定),纯度越高。

用“信息增益”来描述对某一属性进行划分所获得纯度提升的多少:
例如对于西瓜问题,计算出的各属性信息增益如下:
Gain(D,颜色)=0.109,Gain(D,根蒂)=0.143,Gain(D,敲声)=0.141
Gain(D,纹理)=0.381,Gain(D,脐部)=0.289,Gain(D,触感)=0.006。

因此首先对纹理进行划分, 然后,决策树算法将对每个分支结点做进一步划分,最终得到如下决策树。

基尼系数
                                
基尼系数越小,说明纯度越高(pk均相等时,达到基尼系数最小值)。因此划分时选择基尼系数最小的属性。

剪枝处理
剪枝是决策树算法对付“过拟合”的主要手段,分支过多,对训练数据的拟合很完美,但对测试数据则不一定,且效率较低。因此可主动去掉一些分支来降低过拟合的风险。 剪枝处理包括预剪枝和后剪枝,分别对应着在决策树生成过程中/决策叔生成完毕后进行剪枝处理。

对某一结点是否进行剪枝处理的依据是划分前后验证集精度是否提高。
例如样本中4个好瓜,3个坏瓜,若不按某一属性(脐部)划分,则由于好瓜数量多,将此结点标记为好瓜,验证精度为4/7。若按脐部划分(凹陷:好瓜、稍凹:好瓜、平坦:坏瓜)后,求得验证精度提高(大于4/7),则认为此处划分合理,不需要剪枝条,反之则剪。

预剪枝使得决策树很多分枝都没有“展开”,不仅降低了过拟合风险,还显著减少了决策树训练时间和开销。但另一方面,有些分支当前划分虽不能提升泛化性能,甚至降低泛化性能,但在其基础上的后续划分可能导致性能显著提高,给决策树带来欠拟合风险。后剪枝通常比预剪枝保留更多分支,欠拟合风险小,泛化性能优于预剪枝决策树,但其时间开销要大得多。

连续值处理
连续值处理方法很简单,在已有属性的取值范围内定义多个划分点。
寻找最优划分点,同样是基于纯度。再将样本根据此点一分为2,即完成划分。

此外,还可能出现样本中某一 属性值缺失 的情况,需要解决两个个问题:
(1)如何在属性值缺失的情况下进行划分属性选择
引入权值ro,代表无缺失数据比重,例如若样本对于某一属性值有40%数据丢失,则ro=0.6,利用无缺失属性值数据计算出的信息增益后需要乘上ro,作为真实信息增益。
(2)若样本在该属性上的值缺失,如何划分该样本
将样本同时投入所有分支,但在不同分支权重不同,权重由不同分支中的数据量决定

多变量决策树
之前所述决策树划分条件都是单一变量,使用多变量作为划分条件可以使得决策树变得更复杂,划分更加精确,但是边界寻找比较困难。如下图是一个多变量决策树。

      

MATLAB函数使用
1.创建分类决策树或回归决策树
load carsmall % contains Horsepower, Weight, MPG
X = [Horsepower Weight];
rtree = fitrtree(X,MPG);% create regression tree

load fisheriris % load the sample data
ctree = fitctree(meas,species); % create classification tree
view(ctree) % text description


顺便提一下,MATLAB中默认的划分方法是基于基尼系数的。

2.用训练好的决策树做数据分类
load ionosphere % contains X and Y variables
ctree = fitctree(X,Y);
Ynew = predict(ctree,mean(X))

3.检验决策树性能并修正
最简单的性能检测就是生成一颗决策树后,输入所有数据样本,进行误差检验。 这种检测方法输入数据样本中包含了训练数据,因此得到结果比实际结果要好的多,泛化能力差,过于乐观。
load fisheriris
ctree = fitctree(meas,species);
resuberror = resubLoss(ctree)
因此常常采用交叉检验法,因为交叉检验法使用的测试数据不同于训练数据,且是一个多次平均的结果,因此其对性能的估计比较准确。并根据交叉检验法进行决策树的修改,使得其性能表现更好。
(1)限定每个叶节点包含的最少数据量
如果不进行限定,每个叶节点包含的最小数据量为1,过多的叶子结点必然造成决策树泛化能力的降低,因此应该求得一个Leaf(min),从而使得计算出交叉误差最小。
leafs = logspace(1,2,10);
rng('default')
N = numel(leafs);
err = zeros(N,1);
for n=1:N
    t = fitctree(X,Y,'CrossVal','On',...
        'MinLeaf',leafs(n));
    err(n) = kfoldLoss(t);
end
plot(leafs,err);
xlabel('Min Leaf Size');
ylabel('cross-validated error');
得到最小的叶子尺寸,再进行决策树生成
OptimalTree = fitctree(X,Y,'minleaf',40);
(2)剪枝
与上面类似,计算不同剪枝下的交叉检测误差,选择最小误差处剪枝。
[~,~,~,bestlevel] = cvLoss(tree,...
    'SubTrees','All','TreeSize','min')
tree = prune(tree,'Level',bestlevel);


函数说明

已知训练数据和训练数据类,获得决策树模型:

t=treefit(train_X,y);%train_X的行数为样本数,列数为特征数;y的行数为样本数,1列表征类;

t=classregtree(train_X,y):%用法与上一致,只是treefit为ID3算法,classregtree为CART算法;

现在多使用classregtree;


关于决策树的相关函数目前多放在classregtree的类中:

1)计算获得的决策树的精确度:

     cost = treetest(t,'test',X,y);%测试错误率;

     [cost,secost,ntnodes,bestlevel] = treetest(...);%cost为误差率向量;ntnodes为决策树包含的节点向量;两者对应

     例:

              % Start with a large tree.
                load fisheriris;
               t = treefit(meas,species','splitmin',5);


              % Find the minimum-cost tree.
                  [c,s,n,best] = treetest(t,'cross',meas,species);
                  tmin = treeprune(t,'level',best);


             % Plot smallest tree within 1 std of minimum cost tree.
                  [mincost,minloc] = min(c);
                   plot(n,c,'b-o',...
                                n(best+1),c(best+1),'bs',...
                                n,(mincost+s(minloc))*ones(size(n)),'k--');
                xlabel('Tree size (number of terminal nodes)')
                ylabel('Cost')

               



根据图中决策树的尺寸和错误率的分布函数对决策树进行适当裁剪(prune);

2)已知决策树计算测试数据类:               

        yfit = treeval(t,X)
        [yfit,node,cname] = treeval(...)%cname获得测试数据类;


3)裁剪决策树:

       t2 = treeprune(t1,'level',level)%裁剪t1树的最后level级

       t2 = treeprune(t1,'nodes',nodes)
       

            

               


                 

                          

                                   

                               

                 

                     



  • 8
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值