决策树(decision tree)

本文介绍了决策树模型的基本结构和学习过程,包括特征选择中的熵、信息增益和信息增益比概念。文章通过贷款审批的实例展示了如何使用ID3和C4.5算法构建决策树,并探讨了剪枝策略以防止过拟合。此外,还提到了CART算法及其在分类和回归问题中的应用,以及基尼指数在构建分类树中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、决策树模型与学习

1.1决策树模型

决策树由结点(node)和有向边(directed edge)组成,其中结点由内部结点(internal node)和叶子结点(leaf node)组成;

 决策树从根结点开始对实例某一特征进行判别,根据判别结果依次往下递归,直到叶子结点,将实例成功分类。

1.2决策树的学习

给定数据集D={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)},其中x_i=(x_{i}^{(1)},x_{i}^{(2)},...,x_{i}^{(t)})是特征向量,其中特征有t个;y_i\in \left \{ 1,2,...,K\right \}是类标记,样本总共有K类。

决策树根据不同种类样本的特征分布,学习出一种根据特征来判别未知种类样本的种类。

二、特征选择

在样本众多特征中,我们希望找到一种分类效果好的特征,也就是说,这个特征有比较强的分类能力。

下表是有15个样本组成的贷款申请的训练数据,银行根据申请人的请款,判断是否审批贷款。

样本的特征有四个(年龄,工作,房子,信贷);而样本的类别是是或者否。

我们希望可以通过通过表中的数据学习一种评判标准,当下一位申请者来时可以以过去的标准来做出选择。

2.1熵

统计学习中,熵(entropy)是一个经常被使用的概念,其描述的是一个系统不确定的程度,公式

H(X)=-\sum_{i=1}^{n}p_ilogp_i,定义0log0=0

熵越大,这个系统不确定程度越高

实际中,对数常以2为底

当随机变量只有0与1两个取值时,P(X=1)=p,p(X=0)=1-p

H(X)=-plog_2p-(1-p)log_2(1-p)

此时,熵的大小与p的关系如下

当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件分别称为经验熵(empiricalentropy)和经验条件(empirical conditional entropy)

2.2信息增益

当一个新的特征加入时,我们评价这个特征对系统分类能力的影响,所用的指标便是信息增益。

定义g(D,A)=H(D)-H(D|A) 

其中D为讨论的样本总体,而A为某个特征;当特征A加入系统后,系统变得更确定了一些,此时

H(D|A)小于H(D) ,二者之差便是特征A带来的收益。

当我们讨论一个系统时,根据样本计算出经验熵。其中D为训练数据集,\left | D \right |为样本个数,这些样本对应k类,分别为C_1,C_2,...,C_k;特征A有n个取值,将训练集划分为D_1,D_2,...,D_n

H(D)=-\sum_{k=1}^{n}\frac{|C_k|}{|D|}log_2\frac{|C_k|}{|D|}

再计算A特征下的条件经验熵

H(D|A)=\sum_{i=1}^{n}\frac{|D_i|}{|D|}H(D_i)

其中D_i为第i个划分集合的熵

回到我们的贷款实例

年龄将样本分为D_1,D_2,D_3,分别对应青年,中年与老年;所以样本被分为两类,即基于贷款核拒绝贷款(是和否)。

首先计算经验熵H(D),总共15个样本,否样本占6个,是样本占9个

96

H(D)=-\frac{6}{15}log_2\frac{6}{15}--\frac{9}{15}log_2\frac{9}{15}=0.971

观察特征年龄,在D_1中有5个样本,是占2个,否占3个;在D_2中有5个样本,是占3个,否占2个;在D_1中有5个样本,是占4个,否占1个;

青年中年老年
233241

H(D|A_1)=\frac{5}{15}H(D_1)+\frac{5}{15}H(D_2)+\frac{5}{15}H(D_3)

=\frac{1}{3}(-\frac{2}{5}log_2\frac{3}{5})+\frac{1}{3}(-\frac{3}{5}log_2\frac{2}{5})+\frac{1}{3}(-\frac{4}{5}log_2\frac{1}{5})=0.888

g(D,A_1)=H(D)-H(D|A_1)=0.971-0.888=0.083

同理计算工作、房子、信贷的信息增益分别为0.324,0.420,0.363,其中房子信息增益最大。

2.3信息增益比

不过单纯使用信息增益来衡量的话,取值较多的特征信息增益往往更大一些,这也就不符合我们对特征获得高分类能力的要求。

于是我们利用信息增益比g_R(D,A)=\frac{g(D|A)}{H_A(D)}

其中H_A(D)=-\sum_{i=1}^{n}\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|},即特征A取值的经验熵。

三、树的生成

3.1ID3算法

ID3算法认为信息增益大的特征更优,应距离根节点更近;

从根节点开始选择信息增益最大的特征作为结点特征,由该特征不同取值建立子节点,直到所有特征都用上或者信息增益很小为止。

还是以贷款案例为例,上面已经计算出房子信息增益最大,次大是有工作,于是

 样本中所有有房子的都贷到了款,于是直接连接是的叶子节点。而没有房子的个体再考虑是否有工作,有工作的全部贷到了款,而没有的全被拒了,发现不需要其他特征了,于是构建如上图所示决策树。

3.2C4.5

C4.5算法较ID3算法而言使用信息增益比来选取特征

特征A_1,A_2,A_3,A_4分别对应年龄工作房子信贷,其中H_{A_1}(D)=-\frac{1}{3}log_2\frac{1}{3}-\frac{1}{3}log_2\frac{1}{3}-\frac{1}{3}log_2\frac{1}{3}=1.584

H_{A_2}(D)=-\frac{2}{3}log_2\frac{2}{3}-\frac{1}{3}log_2\frac{1}{3}=0.918

H_{A_3}(D)=-\frac{3}{5}log_2\frac{3}{5}-\frac{2}{5}log_2\frac{2}{5}=0.970

H_{A_4}(D)=-\frac{4}{15}log_2\frac{4}{15}-\frac{6}{15}log_2\frac{6}{15}+ \frac{5}{15}log_2\frac{5}{15} =1.565

g_R(D,A_1)=0.083/1.584=0.052

g_R(D,A_2)=0.324/0.918=0.352

g_R(D,A_3)=0.420/1.584=0.432

g_R(D,A_4)=0.363/1.565=0.231

发现信息增益比最大的还是房子和工作,树画法和ID3无异

3.3剪枝

理论上来说,只要树足够复杂,都可以把训练数据很好的分类;不过这样,对于未知的数据而言,在这种树上表现就不佳了,这也就是我们常说的过拟合了。

这需要我们对树进行修剪,让其不再那么复杂,这就是剪枝操作;通过裁剪子树或者叶子结点,将根节点或者父结点作为新的叶子结点。

在这里,评价模型的好坏同样是使用损失函数(loss function)。

对于一个树T,其叶子结点个数为|T|t是叶子结点,其有N_t个样本,k类的样本点有N_{tk}个,H_t(T)为叶子结点t上的经验熵\alpha\geq 0是参数,损失定义为

C_\alpha(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T|

H_t(T)=-\sum_{k}^{} \frac{N_{tk}}{N_t}log\frac{N_{tk}}{N_t}

我们观察损失的定义,H_t(T)便是某一叶子结点的熵,如果这个叶子结点所含种类多,那么他的熵也就大,说明该分支并没有很好的区分能力,于是损失就大。

同时我们希望树不要太复杂,不希望有太多的叶子结点,于是我们将叶子结点的数量乘上一个参数加入损失,用于控制树的复杂度。

上述公式左端可写作C(T)=\sum_{t=1}^{|T|}N_tH_t(T)=-\sum_{t=1}^{|T|}\sum_{k=1}^{K}N_{tk}log\frac{N_{tk}}{N_{t}}

于是有C_\alpha(T)=C(T)+\alpha|T|

我们拿到一棵树后,算出每个结点的经验熵,如果剪枝能让损失变小,就剪掉;如此我们就可以得到一颗修剪过的树了

以这棵树为例,有三个叶子结点,|T|=3;我们考虑工作属性是否可以作为新的叶子结点,我们计算原树的损失函数;

有房无房
有工作无工作
603006

有房子且为是的样本有6个,有房子且为否的样本为0个,其熵为6log\frac{6}{6}+0log\frac{0}{6}=0

没有房子的个体中,有工作且是的样本有3个,有工作且否的样本有0个,其熵为

3log\frac{3}{3}+0log\frac{0}{3}=0

没有房子的个体中,无工作且是的样本有0个,有工作且否的样本有6个,其熵为

6log\frac{6}{6}+0log\frac{0}{6}=0

此树的损失为C_\alpha(T)=3\alpha

如果我们以有工作为叶子节点,剪去以下的枝,此时|{T}'|=2,最左端结点熵不变

右端无房结点中的样本有两类分别为是和否,是的样本有3个,否的样本有6个,其熵为

-3log\frac{3}{9}-6log\frac{6}{9}=2.49

此树的损失为C_\alpha(T)=2.49+2\alpha

此时就要考虑树的复杂度和树的精度的平衡了,以此通过\alpha来决定是否剪枝

四、CART算法

相比于决策树的分类模型,CART算法输入随机变量X后返回的是Y的条件概率分布,可以用于回归也可以用于分类。

CART假设决策树是二叉树,内部结点的选择只有是与否。

CART算法而言,对回归树用平方误差最小化准则,对分类树采用基尼指数(Gini index)最小化准则。

4.1回归树

X,Y分别为输入,输出变量,且Y是连续变量,给定数据集Dx^{(j)}

回归树将样本空间进行划分R_1,R_2,...,R_M,并且对于每一个划分赋予一个值c_1,c_2,...,c_M

回归模型表示为f(x)=\sum_{m=1}^{M}c_mI(x\in R_m)

上式中,f(\cdot )表示回归树,x表示某一样本,I(x\in R_m)表示x属于空间R_m的隶属度;

回归模型含义为,样本回归结果为其隶属于不同划分的加权求和

我们用\sum_{x_i\in R_m}^{}(y_i-f(x_i))^2表示误差

R_m上的权值c_m的最优值为\widehat{c}_m,其是所有输入实例x_i的输出y_i的均值

对于空间划分采用启发式方法,对第j个变量x^{(j)}和取值s作为切分变量(splitting variable)和切分点(splitting point),定义区域R_1(j,s)=\left \{ x|x^{(j)}\leq s \right \},R_2(j,s)=\left \{ x|x^{(j)}\geq s \right \}

求解\underset{j,s}{min}[\underset{c_1}{min}\sum_{x_i\in R_1(j,s)} (y_i-c_1)^2+ \underset{c_2}{min}\sum_{x_i\in R_2(j,s)} (y_i-c_2)^2 ]

通过计算,其中,c_1,c_2R_1,R_2y_i的均值点,上式旨在寻找最优特征及切分点(j,s)

寻找出特征和切分点后,计算区域的权值

\widehat{c}_m=\frac{1}{N_m}\sum_{x_i\in R_m(j,s)}y_i

4.2分类树

介绍分类树之前,先介绍一下基尼指数的概念

分类问题中,假设有K类,样本属于第k类的概率为p_k,概率分布的基尼指数定义为

Gini(p)=\sum _{k=1}^{K}p_k(1-p_k)=1-\sum_{k=1}^K{p_k}^2

二分类问题中,基尼指数Gini(p)=1-p^2-(1-p)^2=2p(1-p)

实际问题中,我们以样本出现的频率来代替概率

显然\sum _{k=1}^Kp_k=1,当类别越多且样本越分散(每一类的概率都趋于0)的时候,基尼系数越大

基尼系数和熵类似,都是描述系统不确定程度的指标

当样本集合D能被某一特征A的某一取值切分成两部分D_1,D_2时,在特征A下集合D的基尼指数为:

Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)

图中展现了三种指标之间的关系,趋势大致一致

 生成CART树,首先取不同取值对特征进行切分,在所有的特征和切分中选取基尼指数最小的一项作为最优特征和最优切分点,以此往复

看个例子,还是上述贷款的例子:

特征选取年龄这一特征A_1,我们先以是否是青年(A_1=1)进行切分

Gini(D,A_1=1)=\frac{5}{15}*(2*\frac{2}{5}*\frac{3}{5}) \frac{10}{15}*(2*\frac{7}{10}*\frac{3}{10})=0.44

再以是否是中年(A_1=2)与是否是老年(A_1=3)进行切分Gini(D,A_1=2)=\frac{5}{15}*(2*\frac{3}{5}*\frac{2}{5}) \frac{10}{15}*(2*\frac{6}{10}*\frac{4}{10})=0.48Gini(D,A_1=3)=\frac{5}{15}*(2*\frac{4}{5}*\frac{1}{5}) \frac{10}{15}*(2*\frac{5}{10}*\frac{5}{10})=0.44

由此A_1=1,A_1=3都可以做为切分点

观察A_2,A_3,A_4的基尼指数

Gini(D,A_2=1)=0.32,Gini(D,A_3=1)=0.27

Gini(D,A_4=1)=0.36,Gini(D,A_4=2)=0.47

Gini(D,A_4=3)=0.32

综合来看,选择A_3为最优特征,A_3=1为最佳切分点,以此往复。

五、代码部分

from sklearn import tree
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

d = np.array([[0, 0, 0, 0, 0],
           [0, 0, 0, 1, 0],
           [0, 1, 0, 1, 1],
           [0, 1, 1, 0, 1],
           [0, 0, 0, 0, 0],
           [1, 0, 0, 0, 0],
           [1, 0, 0, 1, 0],
           [1, 1, 1, 1, 1],
           [1, 0, 1, 2, 1],
           [1, 0, 1, 2, 1],
           [2, 0, 1, 2, 1],
           [2, 0, 1, 1, 1],
           [2, 1, 0, 1, 1],
           [2, 1, 0, 2, 1],
           [2, 0, 0, 0, 0]])
label = ['age', 'job', 'house', 'credit']
data=d[:,0:-1]
target=d[:,-1]
f=pd.concat([pd.DataFrame(data,columns=label),pd.DataFrame(target,columns=['loan'])],axis=1)

clf=tree.DecisionTreeClassifier(criterion='entropy')
clf.fit(data,target)

_ = tree.plot_tree(
    clf,
    feature_names=label,
    class_names=['no','yes'],
    filled=True
)
plt.show()

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值