博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
决策树
阅读量:5968 次
发布时间:2019-06-19

本文共 3608 字,大约阅读时间需要 12 分钟。

决策树之ID3,说一个例子,就会明白,拿 Tom M .mitchen 的《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,

计算结果为: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的实例数据中,找到信息增益最大的那一个,依次类推。

 

ID3算法思想

(1) 初始化决策树T为只含一个树根(X,Q),其中X是全体样本集,Q为全体属性集。

(2) if(T中所有叶节点(X’,Q’)都满足X属于同一类或Q’为空)then 算法停止;

(3) else

    {任取一个不具有(2)中所述状态的叶节点(X’,Q’);

(4) for each Q’中的属性A do 计算信息增益gain(A,X’);

(5)     选择具有最高信息增益的属性B作为节点(X’,Q’)的测试属性;

(6) for each B的取值bi do

        {从该节点(X’, Q’)伸出分支,代表测试输出B=bi;

        求得X中B值等于bi的子集Xi,并生成相应的叶节点(Xi’,Q’-{B});}

(7) 转(2);}

ID3算法的问题:

    (1)信息增益的计算依赖于特征数目较多的特征,而属性取值最多的属性并不一定最优。

    (2)ID3是非递增算法。

    (3)ID3是单变量决策树(在分枝节点上只考虑单个属性),许多复杂概念的表达困难,属性相互关系强调不够,容易导致决策树中子树的重复或有些属性在决策树的某一路径上被检验多次。

    (4)抗噪性差,训练例子中正例和反例的比例较难控制。

 

由于ID3算法在实际应用中存在一些问题,于是Quilan提出了C4.5算法,严格上说C4.5只能是ID3的一个改进算法。

—————————————————————————————————————————————————————————————————————————————

决策树之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算法的优点,并在以下几方面对ID3算法进行了改进:

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

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

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

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

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

缺点:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。此外,C4.5只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。

 

 树剪枝

    在决策树的创建时,由于数据中的噪声和离群点,许多分枝反映的是训练数据中的异常。剪枝方法是用来处理这种过分拟合数据的问题。通常剪枝方法都是使用统计度量,剪去最不可靠的分枝。

    剪枝一般分两种方法:先剪枝和后剪枝。

    先剪枝方法中通过提前停止树的构造(比如决定在某个节点不再分裂或划分训练元组的子集)而对树剪枝。一旦停止,这个节点就变成树叶,该树叶可能取它持有的子集最频繁的类作为自己的类。先剪枝有很多方法,比如(1)当决策树达到一定的高度就停止决策树的生长;(2)到达此节点的实例具有相同的特征向量,而不必一定属于同一类,也可以停止生长(3)到达此节点的实例个数小于某个阈值的时候也可以停止树的生长,不足之处是不能处理那些数据量比较小的特殊情况(4)计算每次扩展对系统性能的增益,如果小于某个阈值就可以让它停止生长。先剪枝有个缺点就是视野效果问题,也就是说在相同的标准下,也许当前扩展不能满足要求,但更进一步扩展又能满足要求。这样会过早停止决策树的生长。

    另一种更常用的方法是后剪枝,它由完全成长的树剪去子树而形成。通过删除节点的分枝并用树叶来替换它。树叶一般用子树中最频繁的类别来标记。

    C4.5采用悲观剪枝法,它使用训练集生成决策树又用它来进行剪枝,不需要独立的剪枝集。

    悲观剪枝法的基本思路是:设训练集生成的决策树是T,用T来分类训练集中的N的元组,设K为到达某个叶子节点的元组个数,其中分类错误地个数为J。由于树T是由训练集生成的,是适合训练集的,因此J/K不能可信地估计错误率。所以用(J+0.5)/K来表示。设S为T的子树,其叶节点个数为L(s), 为到达此子树的叶节点的元组个数总和, 为此子树中被错误分类的元组个数之和。在分类新的元组时,则其错误分类个数为 ,其标准错误表示为:  。当用此树分类训练集时,设E为分类错误个数,当下面的式子成立时,则删掉子树S,用叶节点代替,且S的子树不必再计算。

         。

 

—————————————————————————————————————————————————————————————————————————————

决策树之C5.0

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

___________________________________________________________________________________________________________________________________

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

转自:

转载于:https://www.cnblogs.com/longmao-yiran/p/6045063.html

你可能感兴趣的文章
Nginx安装与配置文件解析
查看>>
怎么把电脑网速变快
查看>>
oracle重做日志文件版本不一致问题处理
查看>>
各个系统动态多路径软件识别LUN的方法
查看>>
Intellij IDEA下一个Tomcat启动带多个虚拟目录和JDNI数据源应用的方法
查看>>
我的友情链接
查看>>
编译linux3内核,与busybox,用qemu模拟运行
查看>>
Linux中的进程创建函数fork
查看>>
Vista下硬盘管理
查看>>
我的友情链接
查看>>
Python3 统计 ftp 文件个数和大小
查看>>
Pytohn实现Linux shell中的wc命令
查看>>
C++学习手记五:C++流操作
查看>>
公众号自定义图文消息推送(2)
查看>>
引用的定义、使用及其和指针的区别与联系
查看>>
Xcode 7中Static Cells自动计算高度失效的解决方法
查看>>
【微信网页版】给所有微信群发消息
查看>>
Active Direcrtory:裸机恢复
查看>>
KeyMob移动广告聚合平台:类似于房地产中介
查看>>
【Linux系列】【基础版】第二章 文件、目录管理
查看>>