机器学习算法梳理(三)决策树

本文深入解析决策树模型,涵盖信息论基础、不同分类算法(ID3、C4.5、CART)、回归树原理及防止过拟合手段。探讨模型评估指标,详述sklearn决策树参数,并提供Python绘制决策树的示例。

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


决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。大致分类过程可以描述为:从 根节点开始,对实例的某一特征进行测试,并根据结果将实例分配给其 子节点,如此递归地对实例进行测试并分配直到达到 叶节点的类中。

一、信息论基础

决策树学习的关键是如何最优划分属性,因此我们希望树的每个分支结点的纯度越来越高,以下的概念则均与样本集合的纯度(purity)衡量有关。

  • 信息熵

熵(entropy)是表示随机变量不确定性的度量,设 X X X是一个取有限值的随机变量,其概率分布为 P ( X = x i ) = p i , i = 1 , 2 , … n P(X=x_i)=p_i, i=1,2,…n P(X=xi)=pi,i=1,2,n
则其熵的定义为:
H ( X ) = − ∑ i = 1 n p i l o g p i H(X)=-\sum_{i=1}^np_ilogp_i H(X)=i=1npilogpi
熵越大代表随机变量的不确定性就越大。

  • 条件熵

条件熵 H ( Y ∣ X ) H(Y | X) H(YX) 表示在已知随机变量 X X X的条件下,随机变量 Y Y Y的不确定性。随机变量 X X X给定条件下随机变量 Y Y Y的条件熵(conditional entropy)定义为:
H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y | X)=\sum_{i=1}^np_iH(Y | X=x_i) H(YX)=i=1npiH(YX=xi)
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy)。

  • 信息增益

信息增益(information gain)表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
特征 A A A对训练数据集 D D D的信息增益 g ( D , A ) \mathrm{g}(D,A) g(D,A),定义为集合 D D D的经验熵 H ( D ) H(D) H(D)与特征 A A A给定条件下 D D D的经验条件熵 H ( D , A ) H(D,A) H(D,A)之差,即:
g ( D , A ) = H ( D ) − H ( D , A ) \mathrm{g}(D,A)=H(D)-H(D,A) g(D,A)=H(D)H(D,A)
对于决策树而言,不同的特征往往具有不同的信息增益,信息增益大的特征具有更强的分类能力。

  • 基尼指数

分类问题中,假设有 K K K类,样本点属于第 K K K类的概率为 p k p_k pk,则概率分布的基尼指数(Gini index)定义为:
G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2 Gini(p)=k=1Kpk(1pk)=1k=1Kpk2
对于给定的样本集合 D D D,其基尼指数为:
G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D)=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2 Gini(D)=1k=1K(DCk)2
其中 C k C_k Ck D D D中属于第 k k k类的样本子集, K K K是类的个数。基尼指数值越大,样本集合的不确定性越大,与熵相似。

二、决策树的不同分类算法

有了以上的概念基础,则可以更好地理解决策树算法。这里介绍三种经典算法,分别是ID3、C4.5和CART算法。

生成算法划分标准
ID3信息增益
C4.5信息增益率
CART基尼指数

ID3算法

核心思想就是以信息增益来度量属性的选择,选择分裂后信息增益最大的属性进行分裂。该算法采用自顶向下的贪婪搜索遍历可能的决策空间。
具体方法如下:

  1. 从根节点开始,对节点计算所有可能的特征的信息增益,选择信息增益值最大的特征作为节点的划分特征;
  2. 由该特征的不同取值建立子节点;
  3. 再对子节点递归地调用以上方法,构建决策树;
  4. 到所有特征的信息增益都很小或者没有特征可以选择为止,得到最终的决策树

ID3算法只有树的生成,因此该算法生成的树容易产生过拟合。其采用信息增益作为选择最优划分特征的标准,然而信息增益会偏向那些取值较多的特征(这也是C4.5采用信息增益率的原因)

C4.5算法

当一个属性的可取值数目较多时,那么可能在这个属性对应的可取值下的样本只有一个或者是很少个,那这时信息增益非常高。因此C4.5算法是基于ID3算法后,改进的一种重要算法,与ID3相比,运用信息增益率而不是信息增益来选择属性,具体方法与ID3类似。

信息增益率(information gain ratio) 是信息增益 g ( D , A ) \mathrm{g}(D,A) g(D,A)与训练数据集 D D D关于特征 A A A的值的熵 H A ( D ) H_A(D) HA(D)之比,即:
g R ( D , A ) = g ( D , A ) H A ( D ) \mathrm{g}_R(D,A)=\frac{\mathrm{g}(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)

但是信息增益率对可取值数目较少的属性有所偏好,因此C4.5决策树先从候选划分属性中找出信息增益高于平均水平的属性,在从中选择增益率最高的。

CART分类树

CART决策树的全称为 Classification and Regression Tree,可以应用于分类和回归。这里先讲分类树。CART分类树区别于ID3和C4.5, CART假设决策树是二叉树,内部节点特征的取值为“是”和“否”,左分支为取值为“是”的分支,右分支为取值为”否“的分支。这样的决策树等价于递归地二分每个特征,将输入空间(即特征空间)划分为有限个单元。

CART的分类树用基尼指数来选择最优特征的最优划分点,具体过程如下:

  1. 从根节点开始,对节点计算现有特征的基尼指数,对每一个特征,例如 A A A,再对其每个可能的取值如 a a a,根据样本点对 A = a A=a A=a 结果的 ”是“与”否“划分为两个部分,利用 G i n i ( D , A = a ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) Gini(D,A=a)=\frac{|D1|}{|D|}Gini(D1)+\frac{|D2|}{|D|}Gini(D2) Gini(D,A=a)=DD1Gini(D1)+DD2Gini(D2)进行计算;
  2. 在所有可能的特征 A A A以及该特征所有的可能取值 a a a中,选择基尼指数最小的特征及其对应的取值作为最优特征最优切分点。然后根据最优特征和最优切分点,将本节点的数据集二分,生成两个子节点
  3. 对两个字节点递归地调用上述步骤,直至节点中的样本个数小于阈值,或者样本集的基尼指数小于阈值,或者没有更多特征后停止;
  4. 生成CART分类树;

三、回归树原理

回归树是可以用于回归的决策树模型,一个回归树对应着输入空间(即特征空间)的一个划分以及在划分单元上的输出值。与分类树不同的是,回归树对输入空间的划分采用一种启发式的方法,会遍历所有输入变量,找到 最优的切分变量 j j j 和最优的切分点 s s s ,即选择第 j j j个特征 x ( j ) x^{(j)} x(j)和它的取值 s s s将输入空间划分为两部分,然后重复这个操作。这样的回归树通常称为最小二乘回归树(least squares regression tree)下面是更详细的解释。

首先将输入空间划分为 M M M个单元 R 1 , R 2 , … , R m , R_1,R_2,…,R_m, R1R2Rm,

f ( x i ) f(x_i) f(xi)是每个划分空间的预测值,也是该单元内每个样本点的均值,有 f ( x i ) = c m = a v e ( y i ∣ x i ∈ R m ) f(x_i)=c_m=ave(y_i|x_i \in R_m) f(xi)=cm=ave(yixiRm)

而如何决定输入空间的划分,则是用真实值和划分区域的预测值的最小二乘来衡量的 ∑ x i ∈ R m ( y i − f ( x i ) ) 2 \sum_{x_i \in R_m}(y_i-f(xi))^2 xiRm(yif(xi))2
也就是平方误差最小化准则 j j j s s s的求解可用一下函数:
m i n j , s [ m i n c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + m i n c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] min_{j,s}[min_{c_1}\sum_{x_i \in R_1(j,s)}(y_i-c_1)^2+min_{c_2}\sum_{x_i \in R_2(j,s)}(y_i-c_2)^2] minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2]
这个单元的输出值 c ^ 1 = a v e ( y i ∣ x i ∈ R 1 ( j , s ) ) \hat c_1=ave(y_i|x_i \in R_1(j,s)) c^1=ave(yixiR1(j,s)), c ^ 2 = a v e ( y i ∣ x i ∈ R 2 ( j , s ) ) \hat c_2=ave(y_i|x_i \in R_2(j,s)) c^2=ave(yixiR2(j,s))

综上总结,最小二乘回归树的生成方法如下:

  1. 按照以上目标函数,选择最优切分变量 j j j和最优的切分点 s s s
  2. 用选定的对 ( j , s ) (j,s) (j,s)划分区域,并确定该区域的预测值;
  3. 继续对两个区域调用上述步骤,直至满足停止条件;
  4. 生成回归树

四、决策树防止过拟合手段

剪枝(pruning)是决策树学习算法解决过拟合问题的主要手段。而剪枝策略,则分为“预剪枝”和“后剪枝”。预剪枝是在决策树生成过程中,对树进行剪枝,提前结束树的分支生长,后剪枝是在决策树生长完成之后,对树进行剪枝,得到简化版的决策树。

  • 预剪枝(Pre-Pruning)
    在构造决策树的同时进行剪枝。所有决策树的构建方法,都是在无法进一步降低熵的情况下才会停止创建分支的过程,为了避免过拟合,可以设定一个阈值,熵减小的数量小于这个阈值,即使还可以继续降低熵,也停止继续创建分支。预剪枝可能带来欠拟合的风险
  • 后剪枝(Post-Pruning)
    决策树构造完成后进行剪枝。剪枝的过程是对拥有同样父节点的一组节点进行检查,判断如果将其合并,熵的增加量是否小于某一阈值。如果确实小,则这一组节点可以合并一个节点,其中包含了所有可能的结果。后剪枝是目前最普遍的做法。
    后剪枝的剪枝过程是删除一些子树,然后用其叶子节点代替,这个叶子节点所标识的类别通过大多数原则(majority class criterion)确定。所谓大多数原则,是指剪枝过程中, 将一些子树删除而用叶节点代替,这个叶节点所标识的类别用这棵子树中大多数训练样本所属的类别来标识,所标识的类称为majority class。

后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶节点逐一考察,因此训练时间开销比预剪枝决策树要大。

CART剪枝算法,还没有完全理解,先贴两篇文章再慢慢研究。
https://blog.youkuaiyun.com/wjc1182511338/article/details/76793164
https://blog.youkuaiyun.com/zhengzhenxian/article/details/79083643

五、模型评估

分类树的模型评估,可以用分类模型的评估指标。

  • Accuracy
  • Precision
  • Recall
  • F1 score
  • ROC曲线和AUC
  • PR曲线

回归树的模型评估,可以用回归模型的评估指标。

  • MSE
  • MAE
  • R 2 R^2 R2

六、sklearn参数详解

scikit-learn决策树算法类库内部实现是使用了调优过的CART树算法,既可以做分类,又可以做回归。分类决策树的类对应的是DecisionTreeClassifier,而回归决策树的类对应的是DecisionTreeRegressor,下表可见参数的不同

from sklearn.tree import DecisionTreeRegressor
DecisionTreeRegressor(criterion="mse",
                      splitter="best",
                      max_depth=None,
                      min_samples_split=2,
                      min_samples_leaf=1,
                      min_weight_fraction_leaf=0.,
                      max_features=None,
                      random_state=None,
                      max_leaf_nodes=None,
                      min_impurity_decrease=0.,
                      min_impurity_split=None,
                      presort=False)
                         
from sklearn.tree import DecisionTreeClassifier
DecisionTreeClassifier(criterion="gini",
                       splitter="best",
                       max_depth=None,
                       min_samples_split=2,
                       min_samples_leaf=1,
                       min_weight_fraction_leaf=0.,
                       max_features=None,
                       random_state=None,
                       max_leaf_nodes=None,
                       min_impurity_decrease=0.,
                       min_impurity_split=None,
                       class_weight=None,
                       presort=False)

参数DecisionTreeClassifierDecisionTreeRegressor
criterion可以使用"gini"或者"entropy",默认使用gini,即CART算法可以使用"mse"或者"mae",推荐使用默认的"mse"。一般来说"mse"比"mae"更加精确。
splitter可以使用"best"或者"random"。前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。默认的"best"适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐"random"同左
max_depth最大深度,默认不输入,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间同左
min_samples_split限制子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。默认是2,如果样本量数量级非常大,则推荐增大这个值同左
min_samples_leaf限制叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量数量级非常大,推荐增大这个值同左
min_weight_fraction_leaf限制叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时需要注意这个值。同左
max_features划分时考虑的最大特征数,默认是"None",意味着划分时考虑所有的特征数,一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了同左
random_stateint, RandomState instance or None,如果为整数,则它指定了随机数生成器的种子;如果为RandomState实例,则指定了随机数生成器;如果为None,则使用默认的随机数生成器同左
max_leaf_nodes限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。同左
min_impurity_decrease如果节点的分裂导致不纯度的减少(分裂后样本比分裂前更加纯净)大于或等于min_impurity_decrease,则分裂该节点。同左
min_impurity_split节点划分最小不纯度,这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点,即为叶子节点 。同左
class_weight指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。不适用于回归树
presort数据是否预排序,默认是False不排序。同左

https://www.cnblogs.com/pinard/p/6056319.html

七、Python绘制决策树

from IPython.display import Image  
from sklearn import tree
import pydotplus 
dot_data = tree.export_graphviz(clf, out_file=None, 
                         feature_names=iris.feature_names,  
                         class_names=iris.target_names,  
                         filled=True, rounded=True,  
                         special_characters=True)  
graph = pydotplus.graph_from_dot_data(dot_data)  
Image(graph.create_png())

From : https://www.cnblogs.com/pinard/p/6056319.html

八、总结

决策树可以认为是if-then规则的集合,也可以认为是定义在特征空间和类空间上的条件概率分布。其学习通常包括三个步骤:特征选择,决策树的生成和决策树的修剪。常用的算法是ID3,C4.5和CART。

优点

  • 决策树易于理解和解释.人们在通过解释后都有能力去理解决策树所表达的意义。
  • 对于决策树,数据的准备往往是简单或者是不必要的.其他的技术往往要求先把数据一般化,比如去掉多余的或者空白的属性。
  • 能够同时处理数据型和常规型属性。其他的技术往往要求数据属性的单一。
  • 决策树是一个白盒模型。如果给定一个观察的模型,那么根据所产生的决策树很容易推出相应的逻辑表达式。
  • 易于通过静态测试来对模型进行评测。表示有可能测量该模型的可信度。
  • 在相对短的时间内能够对大型数据源做出可行且效果良好的结果。
  • 可以对有许多属性的数据集构造决策树。

缺点

  • 对于那些各类别样本数量不一致的数据,在决策树当中,信息增益的结果偏向于那些具有更多数值的特征。
  • 决策树处理缺失数据时的困难。
  • 过度拟合问题的出现。
  • 忽略数据集中属性之间的相关性。

Reference
李航 统计学习方法 西瓜书

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值