机器学习:决策树(Decision Tree)介绍

简介

决策树是一种常见的机器学习算法,它的实现方式类似于我们平时利用多个不同权重选择做决策的过程。以下介绍一个现实生活中的例子。

当父母给自己的女儿介绍对象时,女儿往往会根据对方的年龄、富贵、高矮、美丑等条件来决定是否与对方见面。当然这些条件的权重大小不同,毕竟没有一个花季少女会想嫁给一位油腻大叔。这便是一个决策过程,以此决策过程便可构造出一棵结构树:

 如上图决策树由结点和有向边组成。结点有两种类型:内部结点和叶 节点。内部结点表示一个特征或属性,叶节点表示一个类。

内部节点:每个内部节点为一个判断条件,并且包含数据集中满足从根节点到该节点所有条件的数据的集合。根据内部结点的判断条件测试结果,内部节点对应的数据的集合别分到两个或多个子节点中。

叶节点:叶节点为最终的类别,被包含在该叶节点的数据属于该类别。

基本流程

• 决策过程中提出的每个判定问题都是对某个属性的“测试”。

• 每个测试的结果或是导出最终结论,或者导出进一步的判定问 题,其考虑范围是在上次决策结果的限定范围之内。

• 从根结点到每个叶结点的路径对应了一个判定测试序列。

 决策树学习的目的是为了产生一棵泛化能力强, 即处理未见示例能力强的决策树。

下图为构造一棵决策树的伪代码。

(1)当前结点包含的样本全部属于同一类别C:无需划分,叶子节点标记为类别C。

(2)当前属性集为空,或所有样本在所有属性上取值相同:当前结点标记为叶子节点,类别=该             结点所含样本最 多的类别。

(3)当前结点包含的样本集合为空:当前结点标记为叶子节点,类别=该结点的父节点所 含样本           最多的类别。

下图为一棵判断西瓜好坏的决策树。

划分选择

决策树学习的关键在于如何选择最优划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支结点 所包含的样本尽可能属于同一类别,即结点的“纯度 ”(purity)越来越高。

经典的属性划分方法有:信息增益(ID3)、增益率(C4.5)、基尼指数(CART)

信息增益(ID3)

“信息熵”是度量样本集合纯度最常用的一种指标,假定 当前样本集合D中第k类样本所占的比例为 pk (K=1, 2, ..., |y|) ,则D的信息熵定义为:

 Ent(D)的值越小,则D的纯度越高。

• 计算信息熵时约定:若p = 0,则plog2p=0。

• Ent(D)的最小值为0,最大值为log2 |y|。

离散属性a有V个可能的取值{a1 , a2 , ..., aV},用a来进行划分,则会产 生V个分支结点,其中第v个分支结点包含了D中所有在属性a上取值为 av的样本,记为Dv 。则可计算出用属性a对样本集D进行划分所获得的 “信息增益”:

一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的 “纯度提升”越大。

以下为信息增益实例。

该数据集包含17个训练样本,|y|=2, 其中正例占p1=8/17 ,反例占 p2=9/17,计算得到根结点的信息熵为:

 以属性“色泽”为例,其对应的3个数据子集分别为D1(色泽= 青绿),D2(色泽=乌黑),D3 (色泽=浅白)。

子集D1包含编号为{1, 4, 6, 10, 13, 17} 的6个样例,其中正例占 p1=3/6,反例占p2=3/6,D1的信息熵为: 

同理D2 、D3 的信息熵为:

属性“色泽”的信息增益为:

类似的,其他属性的信息增益为:

显然,属性“纹理”的信息增益最大,其被选为划分属性

 

继续对每个分支进行划分,以第一个节点(纹理=清晰)为例:

“根蒂” 、 “脐部” 、 “触感”3个属性均取得了最大信息增益 ,可以随机选一个。

决策树学习算法将对每个分支结点做进一步划分,最终得 到的决策树如图:

信息增益同样存在一些问题,若把“编号”也作为一个候选划分属性,则其信息增益一 般远大于其他属性。显然,这样的决策树不具有泛化能力 ,无法对新样本进行有效预测。例如,每个“编号”的信息熵:

 信息增益为:Ent(D)-0=0.998-0=0.998。

信息增益对可取值数目较多的属性有所偏好。

增益率(C4.5)

可定义增益率:

其中

称为属性a的“固有值”,属性a的可能取值数 目越多(即V越大),则IV(a)的值通常就越大。

以下为一例子。

如何计算IV(触感)? 触感:{硬滑,软粘} D1=硬滑:{1,2,3,4,5,8,9,11, 13,14,16,17} 12个 D2=软粘:{6,7,10,12,15} 5个。

 同理:IV(色泽,v=3) = 1.580 IV(编号,v=17) = 4。

可见增益率准则对可取值数目较少的属性有所偏好。

基尼指数(CART)

定义:分类问题中,假设D有K个类,样本点属于第k类的概率为pk, 则概率 分布的基尼值定义为:

 Gini(D)越小,数据集D的纯度越高。

给定数据集D,属性a的基尼指数定义为:

在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最有划分属性。 

比如体温为恒温时包含哺乳类5个,鸟类2个:

体温为非恒温时包含爬行类3个、鱼类3个、两栖类2个,则

 

剪枝处理

• 为什么剪枝

        –“剪枝”是决策树学习算法对付“过拟合”的主要手段。

        –可通过“剪枝”来一定程度避免因决策分支过多,以致于把训练集 自身的一些特点当做所有数            据都具有的一般性质而导致的过拟合。

• 剪枝的基本策略

        –预剪枝

        –后剪枝

• 判断决策树泛化性能是否提升的方法

         –留出法:预留一部分数据用作“验证集”以进行性能评估。

预剪枝

通过提前停止树的构建而对树剪枝,主要方法有:

1.当决策树达到预设的高度时就停止决策树的生长

2.达到某个节点的实例具有相同的特征向量,即使这些实例不属 于同一类,也可以停止决策树的生长。

3.定义一个阈值,当达到某个节点的实例个数小于阈值时就可以 停止决策树的生长。

4.通过计算每次扩张对系统性能的增益,决定是否停止决策树的 生长。

上述不足:阈值属于超参数,很难找到过拟合--欠拟合的trade-off。

以下为一例子。

决策树生成过程中,对每个结点在划分前先进行估计 ,若当前结点的划分不能带来决策树泛化性能提升,则停 止划分并将当前结点记为叶结点,其类别标记为该节点对 应训练样例数最多的类别。 例如,针对上述数据集,基于信息增益准则,选取属 性“脐部”划分训练集。分别计算划分前(即直接将该结 点作为叶结点)及划分后的验证集精度,判断是否需要划分。

 

 

 

• 预剪枝的优缺点

        •优点

                –降低过拟合风险

                –显著减少训练时间和测试时间开销。

        •缺点

                –欠拟合风险:有些分支的当前划分虽然不能提升泛化性能,但 在其基础上进行的后续                    划分却有可能显著提高性能。预剪枝基于 “贪心”本质禁止这些分支展开,带来了欠拟合                  风险。 

后剪枝

先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行 分析计算,若将该结点对应的子树替换为叶结点能带来决策树泛化性 能提升,则将该子树替换为叶结点。

首先生成一棵完整 的决策树,该决策 树的验证集精度为 42.9%。

首先考虑结点6,若将其替换为叶结点,根据落在其上的训练样本 {7,15}将其标记为“好瓜” ,得到验证集精度提高至57.1%,则决定剪枝。

然后考虑结点5,若将其替换为叶结点,根据落在其上的训练样本 {6,7,15}将其标记为“好瓜” ,得到验证集精度仍为 57.1%,可以不进行剪枝。

对结点2,若将其替换为叶结点,根据落在其上的训练样本{1,2,3,14} ,将其标记为“好瓜” ,得到验证集精度提升至 71.4%,则决定剪枝。

对结点3和1,先后替换为叶结点,验证集精度均未提升,则分支得到保留。

 • 后剪枝的优缺点

        •优点

                –后剪枝比预剪枝保留了更多的分支,欠拟合风险小 ,泛化性能往往优于预剪枝决策                      树。

        •缺点

                –训练时间开销大:后剪枝过程是在生成完全决策树之后进行的,需要自底向上对所有                    非叶结点逐一计算。

连续值处理

连续属性取值数目非有限,无法直接进行划分;

离散化(二分法)

– 第一步:将连续属性 a 在样本集 D 上出现 n 个不同的 取值从小到大排列,记为 a 1 , a 2 , ..., a n 。基于划分点t, 可将D分为子集Dt +和Dt-,其中Dt-包含那些在属性a上取 值不大于t的样本,Dt +包含那些在属性 a上取值大于t的 样本。考虑包含n-1个元素的候选划分点集合

 即把区间 [a i , a i-1) 的中位点 (a i+a i-1)/2作为候选划分点。

– 第二步:采用离散属性值方法,计算这些划分点的增 益,选取最优的划分点进行样本集合的划分:

 其中Gain(D, a, t)是样本集D基于划分点 t 二分后的信息 增益,于是, 就可选择使Gain(D, a, t)最大化的划分点。

例子:给定下表数据,按照信息增益选择哪个属性进行划分?

 1.对属性“密度” ,其候 选划分点集合包含16个 候选值:例如 (0.245+0.243)/2=0.244。

 

 取划分点:t0=0.381;则: D(t>t0)={1,2,3,4,5,6,7,8,9, 13,14,16,17}  好瓜:8 坏瓜:5

 D(t<t0)={10,11,12,15} 好瓜:0 坏瓜:4

 

 计算每个划分点的信息增 益,得到最大增益为: 0.262,对应划分点为0.381。

1.对属性“密度” ,计算 每个划分点的信息增益,得 到最大增益为:0.262,对 应划分点为0.381

2.对“含糖量”计算每个 划分点的信息增益,得到 最大增益为:0.349,对应划分点为0.126 

3.计算色泽等信息增益:

 

多变量决策树

• 单变量决策树分类边界:轴平行

• 多变量决策树

        非叶节点不再是仅对某个属 性, 而是对属性的线性组合。

 

实例

以下根据lris数据集(鸢尾花数据集)从sklearn中导入决策树分类器创建它的决策树。

注:Iris数据集为连续值分类,若想详细了解Iris数据集可参考我的上一篇文章机器学习:k近邻算法(KNN)介绍

一、导入类库

从sklearn中导入决策树模型,导入鸢尾花数据集。

import pandas as pd 
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris # 数据集
from sklearn import tree # 决策树
from sklearn.model_selection import train_test_split

二、加载Iris数据集,并分割数据集

iris = load_iris()
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size = 0.20,random_state = 20)

X_train    划分出的训练集数据(返回值)
X_test    划分出的测试集数据(返回值)
y_train    划分出的训练集标签(返回值)
y_test    划分出的测试集标签(返回值)


test_size:若在0~1之间,为测试集样本数目与原始样本数目之比;若为整数,则是测试集样本的数目。
test_size = 0.20 测试集占比0.20  

这里的random_state就是为了保证程序每次运行都分割一样的训练集和测试集。
否则,同样的算法模型在不同的训练集和测试集上的效果不一样。

 三、构建并训练决策树模型

clf = tree.DecisionTreeClassifier() # 决策树分类器
# criterion 默认为‘gini’
clf = clf.fit(X_train,y_train)

四、绘制决策树模型并进行数据预测

plt.figure(dpi=200)
# feature_names=iris.feature_names设置决策树中显示的特征名称
tree.plot_tree(clf,feature_names=iris.feature_names,class_names=iris.target_names)

 

五、计算模型准确率

print('模型的准确率为:','{0:.3f}'.format(clf.score(X_test,y_test)))

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值