【机器学习】决策树——CART分类回归树(理论+图解+公式)

简介: 【机器学习】决策树——CART分类回归树(理论+图解+公式)


一、概述

针对于ID3和C4.5只能处理分类的问题,后来有人提出了CART,该模型是由Breima等人在1984年提出的,它是被应用广泛的决策树学习方法,它可以用于分类与回归问题,同样CART也是由特征选择、树的生成以及剪枝组成。

所以针对于该算法可以分为几种情况:

数据:离散型特征、连续型特征

标签:离散值、连续值

针对于不同的场景处理方式也大不相同,一般情况下选择特征划分节点时,如果标签为离散的,我们可以使用基尼系数作为划分标准,在ID3和C4.5中是使用信息增益方式进行评估,在CART中是使用基尼系数,如果标签是连续性的,显然不能够使用基尼系数,因为此时无法计算每个节点不同类别的概率,应使用均方误差来进行评估,原来是使用每个节点的熵值期望与原来的熵做差,如果标签连续使用均方误差,每个节点的均方误差与分割前节点的均方误差做对比。

二、CART决策树

1.分类树

其实CART分类树和ID3和C4.5的树生成算法差不多,只不过是在特征选择是采用了基尼系数

1.1 基尼系数

基尼系数公式的定义如下:

G i n i ( p ) = ∑ i = k K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(p)=\sum_{i=k}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2Gini(p)=i=kKpk(1pk)=1k=1Kpk2

G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D)=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2Gini(D)=1k=1K(DCk)2

  • K:样本的类别个数
  • p k p_kpk :每个类别的概率
  • C k C_kCk :每个类别的样本数
  • D:样本总数

所以我们需要计算根据一个特征分割后的基尼系数与分割前的基尼系数做差:

假设A特征有两个值,所以可以分成两个节点,那么分割后的基尼系数为:

G i n i ( D , A ) = p 1 G i n i ( D 1 ) + p 2 G i n i ( D 2 ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) Gini(D,A)=p_1Gini(D_1)+p_2Gini(D_2)\\=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)Gini(D,A)=p1Gini(D1)+p2Gini(D2)=DD1Gini(D1)+DD2Gini(D2)

我们也需要获得增益:

G i n i ( D , A ) − G i n i ( D ) Gini(D,A)-Gini(D)Gini(D,A)Gini(D)

其实这个和熵非常相似,只不过是换个衡量指标罢了。

1.1 特征离散

如果特征是离散的,那么它就是按照特征的可选值进行划分节点,该特征有几个离散值,那么就划分成几个节点,和ID3、C4.5决策树一样。

1.2 特征连续

如果特征值是连续的,划分节点时就不能够按照特征的可选数量进行分割节点,因为连续特征有很多可选值,所以肯定不能和离散特征一样的分割方式,它是采用二叉树的方式,每次按照连续特征分成两个分支,分割方式为将待分割特征的所有值从小到大排序,然后选中其中一个值作为划分点,将样本划分为两个部分。

比如说,有一列特征A,值为 [ 1 , 5 , 2 , 6 , 8 , 3 ] [1,5,2,6,8,3][1,5,2,6,8,3] ,按照顺序进行排序,[ 1 , 2 , 3 , 5 , 6 , 8 ] [1,2,3,5,6,8][1,2,3,5,6,8] ,所以可选的值很多,我们假设选中3作为划分点,将原始样本划分为:[ 1 , 2 , 3 ] [1,2,3][1,2,3][ 5 , 6 , 8 ] [5,6,8][5,6,8]

按照连续型特征分割后然后在用基尼系数进行评估。

2.回归树

其实回归树就是标签为连续型的,所以此时不能够使用基尼系数、熵这种的概率评估作为评估指标,因为不是分类不能够利用古典概型求出概率,所以我们考虑使用均方误差作为特征划分的好坏,将划分后的每个节点所有样本的均方误差之和之前没划分的节点的均方误差做差来代替基尼系数。

之前分类问题是计算所有特征的信息增益,此时我们会计算每个特征按照每个划分点的均方误差:

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_{xi\in R_1(j,s)}(y_i-c1)^2+min_{c_2}\sum_{xi\in R_2(j,s)}(y_i-c2)^2]minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2]

上面的j是不同的特征,s是对应每个特征可供选择的划分点,因为一个连续特征的值很多,所以划分点很多,要选择最优的。

中括号内的意思就是找出针对特征j的最优划分点s,采用均方误差,最外层是特征,计算不同特征。

回归的比分类相对麻烦一些,分类只需要计算每个特征的信息增益,回归是计算每个特征的均方误差增益,但是它多了一个步骤就是求每个特征增益的时候还要找出最优划分值s。

这样生成的树成为最小二乘回归树。

算法流程:

  1. 选择最优切分特征j和切分点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_{xi\in R_1(j,s)}(y_i-c1)^2+min_{c_2}\sum_{xi\in R_2(j,s)}(y_i-c2)^2]minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2]

  1. 用选定的对(j,s)划分区域并决定相应的输出值:

R 1 ( j , s ) = { x ∣ x ( j ) ≤ s } R 2 ( j , s ) = { x ∣ x ( j ) > s } R_1(j,s)=\{x|x^{(j)}\leq s\}\quad R_2(j,s)=\{x|x^{(j)}> s\}R1(j,s)={xx(j)s}R2(j,s)={xx(j)>s}

c m = 1 N m ∑ x i ∈ R m ( j , s ) y i x ∈ R m , m = 1 , 2 c_m=\frac{1}{N_m}\sum_{x_i\in R_m(j,s)}y_i \quad x\in R_m,m=1,2cm=Nm1xiRm(j,s)yixRm,m=1,2

第一个式子是将数据按照切分点分成两个节点,第二个是求每个节点的均方误差之和。

  1. 继续对两个子区域调用步骤1,2直至满足停止条件
  2. 将输入空间划分为M个区域, R 1 , R 2 , . . . R M R_1,R_2,...R_MR1,R2,...RM ,生成决策树:

f ( x ) = ∑ i = 1 M c m I ( x ∈ R m ) f(x)=\sum_{i=1}^Mc_mI(x\in R_m)f(x)=i=1McmI(xRm)

该式子的意思是求分到相同节点的均值作为预测值,后面的指示函数作为划分到那么区域。

三、剪枝算法

同样针对于CART决策树也存在防止过拟合的方法剪枝,CART剪枝算法由两步组成,首先从生成算法产生的决策树 T 0 T_0T0 底端开始不断剪枝,直到 T 0 T_0T0 的根节点,形成一个子树序列 { T 0 , T 1 , . . . , T n } \{T_0,T_1,...,T_n\}{T0,T1,...,Tn} ,然后通过交叉验证法在独立的验证数据集熵对于子树序列进行测试,从中选择最优子树。

我们定义树模型的损失函数为:

C a ( T ) = C ( T ) + a ∣ T ∣ C_a(T)=C(T)+a|T|Ca(T)=C(T)+aT

其中 C ( T ) C(T)C(T) 为模型的预测误差(基尼系数、熵信息增益等),a ∣ T ∣ a|T|aT 代表模型的复杂度,其中 ∣ T ∣ |T|T 代表模型叶节点的个数,所以 C a ( T ) C_a(T)Ca(T) 可以作为树的整体损失,参数 a用于权衡训练数据的拟合程度与模型的复杂度。

取两个极端情况,如果a=0,那么此时的树是最茂盛的,如果a趋于无穷大,那么此时的树就为一个根节点,所以随着a的增大,我们的树会不断变小。

首先对 T 0 T_0T0 的任意内部节点t,以t为单节点树的损失函数为:

C a ( t ) = C ( t ) + a C_a(t)=C(t)+aCa(t)=C(t)+a

因为此时只有一个叶子节点。

以t为根节点的子树 T t T_tTt 的损失函数为:

C a ( T t ) = C ( T t ) + a ∣ T t ∣ C_a(T_t)=C(T_t)+a|T_t|Ca(Tt)=C(Tt)+aTt

当a=0时,有:

C a ( T t ) < C a ( t ) C_a(T_t)<C_a(t)Ca(Tt)<Ca(t)

因为此时此时过拟合,很显然可以看出,当a增大时,存在a使得:

C a ( T t ) = C a ( t ) C_a(T_t)=C_a(t)Ca(Tt)=Ca(t)

此时我们认为t节点和以该节点为根节点的子树损失值相同,损失同等情况下,我们选择复杂度小的t,所以进行剪枝,将t作为叶子节点。

此时的a为:

g ( t ) = a = C ( t ) − C ( T t ) ∣ T t ∣ − 1 g(t)=a=\frac{C(t)-C(T_t)}{|T_t|-1}g(t)=a=Tt1C(t)C(Tt)

T 0 T_0T0 中减去 g ( t ) g(t)g(t) 最小的 T ( t ) T(t)T(t) ,将得到的子树作为 T 1 T_1T1 ,同时将最小的 g ( t ) g(t)g(t) 设为 a 1 a_1a1 ,如此剪枝下去,直至得到根节点,然后利用独立的验证数据集取交叉验证获得的子树序列 T 0 , T 1 , . . . T n T_0,T_1,...T_nT0,T1,...Tn 获得最优决策树 T a T_aTa ,其中每个决策子树对应一个 a。


目录
相关文章
|
3月前
|
机器学习/深度学习 存储 算法
决策树和随机森林在机器学习中的应用
在机器学习领域,决策树(Decision Tree)和随机森林(Random Forest)是两种非常流行且强大的分类和回归算法。它们通过模拟人类决策过程,将复杂的数据集分割成易于理解和处理的子集,从而实现对新数据的准确预测。
130 10
|
5天前
|
机器学习/深度学习 数据可视化 大数据
机器学习与大数据分析的结合:智能决策的新引擎
机器学习与大数据分析的结合:智能决策的新引擎
61 15
|
1月前
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
116 1
|
3月前
|
机器学习/深度学习 数据采集 监控
探索机器学习:从数据到决策
【9月更文挑战第18天】在这篇文章中,我们将一起踏上一段激动人心的旅程,穿越机器学习的世界。我们将探讨如何通过收集和处理数据,利用算法的力量来预测未来的趋势,并做出更加明智的决策。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和思考方式。
|
3月前
|
机器学习/深度学习 算法 Python
从菜鸟到大师:一棵决策树如何引领你的Python机器学习之旅
【9月更文挑战第9天】在数据科学领域,机器学习如同璀璨明珠,吸引无数探索者。尤其对于新手而言,纷繁复杂的算法常让人感到迷茫。本文将以决策树为切入点,带您从Python机器学习的新手逐步成长为高手。决策树以其直观易懂的特点成为入门利器。通过构建决策树分类器并应用到鸢尾花数据集上,我们展示了其基本用法及效果。掌握决策树后,还需深入理解其工作原理,调整参数,并探索集成学习方法,最终将所学应用于实际问题解决中,不断提升技能。愿这棵智慧之树助您成为独当一面的大师。
51 3
|
3月前
|
机器学习/深度学习 算法 Python
决策树下的智慧果实:Python机器学习实战,轻松摘取数据洞察的果实
【9月更文挑战第7天】当我们身处数据海洋,如何提炼出有价值的洞察?决策树作为一种直观且强大的机器学习算法,宛如智慧之树,引领我们在繁复的数据中找到答案。通过Python的scikit-learn库,我们可以轻松实现决策树模型,对数据进行分类或回归分析。本教程将带领大家从零开始,通过实际案例掌握决策树的原理与应用,探索数据中的秘密。
55 1
|
4月前
|
机器学习/深度学习 算法 数据挖掘
【白话机器学习】算法理论+实战之决策树
【白话机器学习】算法理论+实战之决策树
|
29天前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
96 4
|
8天前
|
算法
PAI下面的gbdt、xgboost、ps-smart 算法如何优化?
设置gbdt 、xgboost等算法的样本和特征的采样率
22 2
|
26天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
43 1