决策树算法

Decision Tree(决策树)算法

一:概述

Decision Tree是属于监督学习中的一种算法,并且是一种基本的分类与回归的算法,也就是说,决策树有两种:分类树和回归树。

​ 决策树算法的本质是树形结构。我们可以把决策树看作是一个if-then规则的集合。将决策树转换为if-then规则的过程是这样的:

  • 由决策树的根节点到叶节点的每一条路径构建一条规则

  • 路径上中间节点的特征对应这规则的条件,即样本的特征,叶节点对应规则的结论,即样本的标签

    决策树的路径或者其对应的if-then规则集合有一个重要的性质:互斥并且完备。也就是说每一个实例只能通过一条路径。

二:决策树的构建

​ 构建决策树的算法很多,比如ID3、C4.5和CART。通常决策树的构建过程可以概括为3个步骤:特征选择,决策树的生成和决策树的剪枝。

(一): 特征选择

​ 特征选择就是决定用哪些特征来划分空间,其目的在于筛选对分类结果有影响的特征。这样可以减少特征值,提高决策树的学习效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大的差别,这称这个特征是没有分类能力的,扔掉这些特征对决策树学习的精度影响不会很大。

​ 在最优划分特征的选取上,一般而言,随着划分过程不断去进行,我们希望决策树的分类尽可能属于同一类别。这里我们引入一个熵的概念,名为香农熵,用香农熵的大小来找出最优划分特征。

  • 香农熵

    熵定义为信息的期望值。在信息论与概率统计中,熵是表示随机变量不确定性的度量

    架设当前样本集合D中一共有n类样本,第i类样本为xi,那么xi的信息定义为:
    l ( x i ) = − l o g 2 p ( x i ) l(x_i) = -log_2p(x_i) l(xi)=log2p(xi)
    其中p(xi)是该分类的概率

    通过上式,我们可以得到所有类别的信息。为了计算熵,我们需要计算所有类别所有可能包含的信息期望值,即香农熵。公式如下:
    E n t ( D ) = − ∑ i = 1 n p ( x i ) l o g 2 p ( x i ) Ent(D) = -\sum^n_{i=1}p(x_i)log_2p(x_i) Ent(D)=i=1np(xi)log2p(xi)
    Ent(D)的值越小,则D的不纯度就越低

    基于香农熵,我们可以采用信息增益和信息增益率来进行特征划分,另外也可以采用Gini指数来进行划分。

(二): 决策树的生成
  1. ID3算法(信息增益)

计算方分支属性对于样本集分类好坏程度的度量-----信息增益

由于分裂后样本集的纯度提高,则样本集的熵降低,熵降低的值即为该分裂方法的信息增益。但这里要注意的是,此时计算子节点的总信息熵不能简单求和,而要求在求和汇总之前进行修正。

假设离散属性a有V个取值{a1,a2,…,aV},若使用a对样本数据集D进行划分,则产生v个分类,其中第v个类中包含了D中所有在属性a上取值为av的样本,计为Dv。我们可根据信息熵的公式计算出Dv的信息熵,再考虑到不同的类别中包含的样本数不同,所以给每个分类赋予一个权重,权重的值即为当前分类的样本个数除以总的样本个数。

信息增益的计算公式为:
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 v ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a) = Ent(D) - \sum^v_{v=1}\frac{|D^v|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)v=1vDDvEnt(Dv)
针对上面的公式我们举个例子来看一下具体的计算过程,数据如下

编号敲声条纹是否是好瓜
1清脆均匀
2清脆均匀
3沉闷均匀
4沉闷均匀
5清脆混乱

首先我们计算"是否抽烟"的信息增益值:
G a i n ( 敲 声 ) = E n t ( D ) − ( 3 5 E n t ( D 1 ) + 2 5 E n t ( D 2 ) ) Gain(敲声) = Ent(D) - (\frac{3}{5}Ent(D_1) + \frac{2}{5}Ent(D_2)) Gain()=Ent(D)(53Ent(D1)+52Ent(D2))
其中Ent(D)指的是全部样本的信息熵,Ent(D1),Ent(D2)是将整个样本按照"敲声"分为两组后计算每一组的信息熵。4/7、3/7是D1和D2组的权重
E n t ( D ) = − ( 2 5 l o g 2 2 5 + 3 5 l o g 3 5 ) Ent(D) = -(\frac{2}{5}log_2{\frac{2}{5}} + \frac{3}{5}log\frac{3}{5}) Ent(D)=(52log252+53log53)

E n t ( D 1 ) = − ( 1 3 l o g 2 1 3 + 2 3 l o g 2 2 3 ) Ent(D_1) = -(\frac{1}{3}log_2\frac{1}{3} + \frac{2}{3}log_2\frac{2}{3}) Ent(D1)=(31log231+32log232)

E n t ( D 2 ) = 0 Ent(D_2) = 0 Ent(D2)=0

​ 我们可以发现当敲声为沉闷时,它一定不是个好瓜,它的结论已经确定,它的纯度为最大1,所以它的不纯度即信息熵Ent(D2)为0。

​ 带入可得:

​ Gain(敲声) = 0.42

​ 同理可计算出其它属性的信息增益:

​ Gain(条纹) = 0.17

​ 划分数据集的最大准则是选择最大信息增益,也就是信息下降最快的方法。所以,针对上面的案例,我们要先用敲声来划分数据集。此时数据集最优划分图解如下:

在这里插入图片描述

​ 此时,敲声为沉闷时已经到达了叶子节点,即可以得到标签值。但敲声为清脆仍然需要继续分类。先将敲声为清脆的数据集截取出来,再按照上面的方法在截取出的数据集中计算除敲声以外的其它特征的信息增益,继续扩展决策树。最终决策树如下:

在这里插入图片描述

​ ID3算法适合与所有属性分类个数相近的情况。ID3算法有一个缺点,在计算信息增益时,取值较多的属性的信息增益较大,所以ID3算法法倾向于将取值多的属性先进行划分。在对ID3算法做了改进后,就有了C4.5算法。

  1. C4.5算法(信息增益率)

    C4.5算法总体思路与ID3类似,都是通过构造决策树进行分类,区别在于分支的处理,在分支属性的选取上,ID3算法使用信息增益 作为度量值,而C4.5算法引入了信息增益率作为度量。即在原来信息增益的公式中除以选取属性本身的信息熵。公式如下:
    G a i n _ r a t i o ( A ) = G a i n ( A ) − ∑ i = 1 v ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ Gain\_ratio(A) = \frac{Gain(A)}{-\sum^v_{i=1}\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}} Gain_ratio(A)=i=1vDDilog2DDiGain(A)
    由信息增益率公式可知,当v比较大时,信息增益率会明显降低,这在一定程度上能够解决ID3算法存在的选择取值较多的属性的问题。

  2. CART算法(Gini指数)

    ​ CART算法采用的是一种二分循环分割的方法,每次都把当前样本集划分为两个字样本集,使生成的决策树的结点均有两个分支,显然,这样就构造了一个二叉树。如果分支属性有多于两个取值,在分裂时会对属性值进行组合,选择最佳的两个组合分支。假设某属性存在q个可能取值,那么以该属性作为分支属性,生成两个分支的分裂方法公有2q-1-1种。

    ​ CART算法在分支处理中分支属性的度量指标是Gini指标
    G i n i ( S ) = 1 − ∑ i = 1 m P i 2 , 其 中 p i = ∣ C i ∣ ∣ S ∣ Gini(S) = 1-\sum^m_{i=1}P_i^2,其中p_i=\frac{|C_i|}{|S|} Gini(S)=1i=1mPi2pi=SCi
    ​ 在ID3给出的数据中,我们计算"敲声"的Gini指数:
    G i n i ( 敲 声 ) = ∣ S 1 ∣ ∣ S ∣ G i n i ( S 1 ) + ∣ S 2 ∣ ∣ S ∣ G i n i ( S 2 ) = 3 5 ∗ ( 1 − ( 2 3 ) 2 − ( 1 3 ) 2 ) + 2 5 ∗ ( 1 − 1 ) = 0.267 Gini(敲声) = \frac{|S_1|}{|S|}Gini(S_1) + \frac{|S_2|}{|S|}Gini(S_2) = \frac{3}{5}*(1-(\frac{2}{3})^2-(\frac{1}{3})^2)+\frac{2}{5}*(1-1) = 0.267 Gini()=SS1Gini(S1)+SS2Gini(S2)=53(1(32)2(31)2)+52(11)=0.267
    ​ 与信息增益不同,CART算法中,Ginin指标的值越小越好。

    CART算法示例:

    ​ 以下是基于sklearn库的CART算法实例代码。通过构建决策树(采用Gini指数)对随机生成(通过np.rando.randint方法)的数字进行分类,自变量X为100x4矩阵,随机生成的数字大于10,因变量Y为大于2的100x1矩阵。树的最大深度限制为3层,训练完成之后将决策树可视化显示

    import numpy as np
    import random
    from sklearn import tree  # 决策树库
    from graphviz import Source  # 可视化库
    
    np.random.seed(42)
    # X为100x4矩阵,且大于10
    X = np.random.randint(10, size=(100, 4))
    # Y为大于2的100x1矩阵
    Y = np.random.randint(2, size=(100, 1))
    # 将X,Y横向拼接在一起
    a = np.hstack((X, Y))
    # 实例化CART对象,gini对应CART
    clf = tree.DecisionTreeClassifier(criterion="gini", max_depth=3)
    # 训练样本集
    clf.fit(X, Y)
    graph = Source(tree.export_graphviz(clf, out_file=None))
    graph.format = "png"
    graph.render("cart_tree", view=True)
    
三:连续属性离散化

监督离散化:

  • 分类数据有二元属性、标称属性等几种不同类型的离散属性
  • 二元属性只有两个可能值,如"是"或"否",“对"与"错”,在分裂时可以产生两个分支。对于二元属性,无须对其数据进行特别的处理
  • 标称属性存在多个可能值,针对所使用的决策树算法不同,标称属性的分裂存在两种方法:多路划分和二元划分
    • 对于ID3、C4.5等算法,均采用多分支划分的方法,标称属性有多少种可能的取值就有多少个分支
    • CART算法采用二分递归分割的方法,因此该算法生成的决策树为二叉树
  • 标称属性种有类特别的属性为序数属性,其属性的取值是有先后顺序的。对于序数属性的分类,往往要结合实际情况来考虑。

非监督离散化:

  • 非监督离散化不需要使用分类属性值,相对简单,有等宽离散化、等频离散化、聚类等方法。
    • 等宽离散化将属性划分为宽度一致的若干个区间
    • 等频离散化将属性划分为若干个区间,每个区间的数量相等
    • 聚类将属性间根据特性划分为不同的簇,以此形式将连续属性离散化
  • 非监督离散化的方法能够完成对连续数据进行离散化的要求,但是相比之下,对连续属性监督离散化很多时候能够产生更好的结果。常通过选取极大化区间纯度的临界值来进行划分
    • C4.5与CART算法中的连续属性离散化方法均属于监督离散化
    • CART算法使用Gini系数作为区间纯度的度量标准
    • C4.5算法使用熵作为区间纯度的度量标准

连续属性离散化是我们在使用决策树算法之前做的一个非常重要的预处理。

四:过拟合问题
  • 训练误差代表分类方法对于现有训练样本集的拟合程度。

  • 泛化误差代表此方法的泛化能力,即对于新的样本数据的分类能力的好坏

  • 模型的训练误差比较高,则称此分类模型欠拟合

  • 模型的训练误差低但是泛化误差高,则称此分类模型过拟合

  • 对于欠拟合问题,可以通过增加分类属性的数量,选取合适的分类方法,提高模型对于训练样本的拟合程度。

过拟合现象会导致随着决策树的继续增长,尽管训练误差在下降,但是泛化误差停止下降,甚至还会提升

如何解决过拟合问题?

  • 解决过拟合问题,一方面要注意数据训练集的质量,选取具有代表性样本的训练样本集。另一方面要避免决策树过度增长,通过限制树的深度来减少数据中的噪声对于决策树构建的影响,一般可以采取剪枝的方法。
  • 剪枝是用来缩小决策树的规模,从而降低最终算法的复杂度并提供高预测准确度,包括预剪枝和后剪枝两类
  • 预剪枝的思路是提前终止决策树的增长,在形成完全拟合训练样本集的决策树之前就停止树的增长,避免决策树规模过大而产生过拟合。
  • 后剪枝策略是先让决策树完全生长,之后针对子树进行判断,用叶子结点或者子树中最常用的分支替换子树,以此方式不断改进决策树,直至无法改进为止。

错误率降低剪枝(REP):

​ 错误率降低剪枝(REP)是后剪枝策略中最简单的算法之一。该算法从叶子结点向上,依次将决策树的所有子树用其样本中最多的类替换,使用一个测试集进行测试,记录下对于决策树的每棵子树剪枝前后的误差数之差,选取误差数减少最少的子树进行剪枝,将其用子样本集中最多的类替换。按此步骤自底向上,遍历决策树的所有子树,当发现没有可替换的子树时,即每棵子树剪枝后的误差数都会增多,则剪枝结束。

​ REP剪枝方法简单、快速,在数据集较大时效果不错,但由于需要比对模型子树替换前后的预测错误率,因此需要从数据集中划分出单独的测试集,故而当数据集较小时,REP剪枝策略的效果会有所下降。

五:分类效果评价

对于一般分类问题,有训练误差、泛化误差、准确率、错误率等指标

对于常见的二分类问题,样本只有两种分类结果,将其定义为正例和反例。那么在进行分类时,对于一个样本,可能出现的分类情况共有四种;

​ 样本为正例,被分类为正例,称为真正类(TP)

​ 样本为正例,被分类为反例,称为假反类(FN)

​ 样本为反例,被分类为正例,称为假正例(FP)

​ 样本为反例,被分类为反例,称为真反类(TN)

  • 准确率:分类模型正确分类的样本数(包括正例与反例)与样本总数的比值

a c c u r a c y = T P + T N T P + F N + F P + T N accuracy = \frac{TP+TN}{TP+FN+FP+TN} accuracy=TP+FN+FP+TNTP+TN

  • 精确率(precision,也称查准率):模型正确分类的正例样本数与正例样本总数(即正确分类的正例样本数目与错误分类的正例本数目之和)

p r e c i s i o n = T P T P + F P precision = \frac{TP}{TP+FP} precision=TP+FPTP

  • 召回率(recall,也称为查全率):模型分类正确的正例样本数与分类正确的样本总数(分类正确的正例样本数和分类正确的反例样本数之和)的比值

r e c a l l = T P T P + F N recall = \frac{TP}{TP+FN} recall=TP+FNTP

  • F值为准确率和召回率的调和平均

F = ( α 2 + 1 ) ∗ a c c u r a c y ∗ r e c a l l α 2 ( a c c u r a r y + r e a c l l ) F = \frac{(α^2+1)*accuracy*recall}{α^2(accurary+reacll)} F=α2(accurary+reacll)(α2+1)accuracyrecall

​ 其中α为调和参数,当α取值为1时,F值就是最常见的F1值
F 1 = 2 ∗ a c c u r a c y ∗ r e c a l l a c c u r a r y + r e a c l l F_1 = \frac{2*accuracy*recall}{accurary+reacll} F1=accurary+reacll2accuracyrecall

  • 受试者工作特征曲线(ROC):横坐标表示假正率(FPR=FP/N,N为反例样本数),纵坐标表示真正率(TPR=TP/P,P为正例样本数)。根据多次测量所绘得的曲线图图则称之为ROC曲线。ROC曲线下的面积称为AUC(Area under Curve),AUC值越大,表示分类模型的预测准确性越高,ROC曲线越光滑,一般过拟合现象越轻。

在这里插入图片描述

六:分类效果评价方法
  • 保留法

    将样本集按照比例划分为训练集与检验集两个集合,两个集合中样本随机分配且不重叠。对于比例的确定,一般情况下,训练集会大于检验集,例如训练集占70%,检验集会占30%,具体比例可结合实际情况进行判定。

  • 蒙特卡洛夫交叉验证

    也称重复性随机二次采样验证,这种验证方法随机将数据集划分为训练集与检验集,使用检验集检验训练集训练的模型效果,多次重复此过程取平均值作为模型好坏的评价标准。蒙特卡洛交叉验证法也可以看作是多次进行保留法。

  • k折交叉验证法

类效果评价方法

  • 保留法

    将样本集按照比例划分为训练集与检验集两个集合,两个集合中样本随机分配且不重叠。对于比例的确定,一般情况下,训练集会大于检验集,例如训练集占70%,检验集会占30%,具体比例可结合实际情况进行判定。

  • 蒙特卡洛夫交叉验证

    也称重复性随机二次采样验证,这种验证方法随机将数据集划分为训练集与检验集,使用检验集检验训练集训练的模型效果,多次重复此过程取平均值作为模型好坏的评价标准。蒙特卡洛交叉验证法也可以看作是多次进行保留法。

  • k折交叉验证法

    k折交叉验证法将样本集随机地划分为k个大小相等的子集,在每一轮交叉验证中,选择一个子集作为检验集,其余子集作为训练集,重复k轮,保证每一个子集都作为检验集出现,用k轮检验结果取平均值作为模型好坏的评价标准。最常用的k折交叉验证法为十折交叉验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值