【算法梳理】决策树

目录

1. 信息论基础(熵 联合熵 条件熵 信息增益 基尼不纯度)

2.决策树的不同分类算法(ID3算法、C4.5、CART分类树)的原理及应用场景

3. 回归树原理

4. 决策树防止过拟合手段

5. 模型评估

6. sklearn参数详解,Python绘制决策树


1. 信息论基础(熵 联合熵 条件熵 信息增益 基尼不纯度)

  • 熵(信息熵)

度量样本集合纯度最常用的指标。假设样本集合D中第k类样本所占的比例为pk,则D的信息熵定义为:

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

  • 联合熵

两个随机变量X,Y的联合分布,可以形成联合熵(Joint Entropy),用H(X, Y)表示。

  • 条件熵

H(X, Y) - H(Y):

表示(X, Y)发生所包含的熵,减去Y单独发生包含的熵:在Y发生的前提下,X发生新带来的熵。

H(X|Y)推导如下:

 

用处:决策树的特征选择,实际上使用的信息增益,就是用G(D,A)=H(Y)-H(Y|X)。可以看出在X的条件下,Y的不确定度下降了多少。

  • 相对熵/交叉熵/K-L散度

相对熵,又称互熵,交叉熵,鉴别信息,Kullback-Leible散度等。

  • 互信息

两个随机变量X,Y的互信息,定义为X,Y的联合分布和独立分布乘积的相对熵。

H(X|Y) = H(X) - I(X, Y)。即互信息为0,则随机变量X和Y是互相独立的。

  • 各种熵之间的关系

  • 信息增益(ID3)

属性a对样本D进行划分获得的‘信息增益’定义如下:

Dv表示样本集合D中在属性a上取值为av的样本。信息增益越大意味着属性a进行划分得到的“纯度提升”越大。

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

  • 增益率(C4.5)

定义如下:

IV(a)是属性a的固有值。属性a的可能取值越多,IV(a)通常越大。增益率准则对于取值数目少的属性有偏好。

C4.5不是选择增益率最大的属性,而是采用了一种启发式:先从候选属性中找到信息增益高于平均水平的属性,再从中选择增益率最高的。

  • 基尼不纯度(CART决策树)

数据集D的纯度可以用基尼值(基尼不纯度)来度量:

反应了从数据集D中随机抽取两个样本,其类别标记不一致的概率。Gini(D)越小,数据集D的纯度越高。

属性a的基尼指数定义如下:

在候选属性集合中选择基尼指数最小的属性作为最有划分属性。

参考:https://www.cnblogs.com/little-YTMM/p/5582271.html

2.决策树的不同分类算法(ID3算法、C4.5、CART分类树)的原理及应用场景

  • 决策树算法的关键点:

1)分裂属性选择

2)树的剪枝。

  • ID3

核心:在各个节点上应用信息增益准则选择特征。

原理:

从根节点开始,对节点计算所有可能的特征的增益,选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点;再对子节点递归的调用以上方法构建决策树;直到所有特征的信息增益均很小或者没有特征可以选择为止,最后得到一个决策树,相当于用极大似然法进行概率模型的选择。

优点

不存在无解的危险;可以利用全部训练例的统计性质进行决策,从而抵抗噪音。

缺点

1)处理大型数据速度较慢,经常出现内存不足,不可以并行;ID3(并行)解决了最后1个问题。

2)只适用于非增量数据集,不适用于增量数据集,可能会收敛到局部最优解而非全局最优解,最佳分离属性容易选择属性值多一些的属性。

3)ID3算法只有树的生成,所以该算法生成的树容易过拟合。

  • C4.5

C4.5由J.Ross Quinlan在ID3的基础上提出的。用信息增益比来选择特征。

工作流程:

  • CART

CART 为二叉树,且可用于回归

分类树(基尼指数最小化准则)生成:

采用基尼指数来选择最优的切分特征,而且每次都是二分。】

假设现在用特征 A对数据进行分割,若特征 A为离散特征,则根据 A的某一可能取值 a 将 D 分为 D1 与 D2。即:

分类树算法:

输入:训练数据集 D={(x1,y1),(x2,y2),…,(xN,yN)}D={(x1,y1),(x2,y2),…,(xN,yN)} ,停止条件

输出:分类树 T

1)利用特征 A的取值 a将数据分为两部分,计算 A=a时的基尼系数:

2)对整个数据集中所有的可能特征 A 以及其可能取值 a 选取基尼系数最小的特征 A∗与特征下的取值 a∗,来将数据集切分,将数据 D1、D2分到两个子节点中去。

3)对子节点递归的调用 1)∼2),直至满足停止条件

4)返回 CART 树 T

算法的停止条件可以是节点中的样本数不能小于给定阈值,或者样本集的基尼系数小于给定阈值,或者没有更多的特征。

CART剪枝:

剪枝时使用的损失函数如下:

剪枝算法:

输入:CART 生成树 T0

输出:剪枝后的最优树 T∗

1)设 k=0, T=T0 

2)a=+∞

3) 自下而上的对内部节点 t 计算 :

4)自上而下的访问内部节点 t, 对最小的 g(t)=a进行剪枝,并对叶节点 t以多数表决形式决定其类别,得到树 T

5) k=k+1, ak=a,Tk=T

6) 如果 T为非单节点树,回到 4).

7) 对于产生的子树序列 {T0,T1,…,Tn}分别计算损失,得到最优子树 T∗并返回.

3. 回归树原理

当数据呈现分段特性的时候,分而治之明显是一个不错的选择。分片之后可以对每个分片做一个线性模型,这种情况称之为模型树也可以简单的对分片后的数据取均值,这种情况就是普通的回归树

回归树采用均方误差作为损失函数,树生成时会递归的按最优特征与最优特征下的最优取值对空间进行划分,直到满足停止条件为止。停止条件可以人为设定,比如说设置某个节点的样本容量小于给定的阈值 c,或者当切分后的损失减小值小于给定的阈值小于给定的 ε,则停止切分,生成叶节点。

回归树算法:

输入: 训练数据集 D={(x1,y1),(x2,y2),…,(xN,yN)}D={(x1,y1),(x2,y2),…,(xN,yN)}

输出: 回归树 T

1)求解选择切分特征 j与 切分特征取值 s,将训练集 D划分为两部分,R1与 R2,依照(j,s)切分后如下:

2)遍历所有可能的解(j,s),找到最优的 (j∗,s∗) ,最优的解使得对应损失最小,按照最优特征 (j∗,s∗)来切分即可。

3)递归条用 1)∼2) ,直到满足停止条件。

4)返回决策树 T.

参考:https://www.cnblogs.com/ooon/p/5647309.html

4. 决策树防止过拟合手段

剪枝是决策树防止过拟合的主要手段。分为预剪枝和后剪枝。

  • 预剪枝

在决策树生成过程中,对每个节点划分前进行评估,若当前节点的划分不能带来泛化性能的提升则停止划分。

优点:显著减少了决策树的训练时间开销和测试时间开销,降低了过拟合。

缺点:基于“贪心”本质,带来了欠拟合的风险。

  • 后剪枝

先从训练集生成一颗完整的决策树,然后自底向上对非叶节点进行考察,若该节点对应的子树替换为叶节点能够带来泛化性能的提升,则将该子树替换为叶节点。

优点:欠拟合风险很小,泛化性能往往优于预剪枝决策树

缺点:训练时间开销比未剪枝决策树以及预剪枝决策树大得多。

5. 模型评估

  • 留出法(hold-out)

将被标记的原始数据划分成两个不相交的集合,分别称为训练集和检验集。在训练数据集上归纳分类模型,在检验集上评估模型的性能。训练集和检验集的划分比例通常根据分析家的判断(常见做法是2/3~4/5的样本用于训练)。分类器的准确率根据模型在检验集上的准确率估计。

一般采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。

局限性

第一,用于训练的被标记样本较少,因为要保留一部分记录用于检验。因此,建立的模型不如使用所有被标记样本建立的模型好。

第二,模型可能高度依赖于训练集和检验集的构成。一方面,训练集越小,模型的方差越大。另一方面,如果训练集太大,根据用较小的检验集估计的准确率又不太可靠。这样的估计具有很宽的置信区间。

第三,训练集合检验集不再是相互独立的。因为训练集和检验集来源于同一个数据集,在一个子集中超出比例的类在另一个子集就低于比例,反之亦然。

  • 交叉验证法

在该方法中,把数据分为大小相同的k分,在每次运行,选择其中一份做检验集,而其余的全部作为训练集,该过程重复k次,使得每份数据都用于检验恰好一次。同样,总误差是所有k次运行的误差值之和。称为k折交叉验证

为了减少样本划分不同而引入的差别,k折交叉验证通常随机的使用不同的划分重复p次称为p次k折交叉验证

k折交差验证方法的一种特殊情况使令k=N,其中N是数据集的大小,在这种所谓留一(leave-one-out,简称LOO)方法中,每个检验集只有一个记录。

【对于留一法】

优点:

使用尽可能多的训练记录,此外,检验集之间是互斥的,并且有效地覆盖了整个数据集

缺点:

整个过程重复N次,计算上开销很大,此外,因为每个检验集只有一个记录,性能估计度量的方差偏高。

局限性:

保留一部分样本用于测试,实际评估所用的模型所用的训练集变小,这会引入因为训练及样本规模不同而导致的偏差,留一法守样本规模影响较小,当时计算的复杂度太高。

  • 自助法

在自助(boostrap)方法中,训练记录采用有放回抽样,即已经选作训练的记录将放回原来的记录集中,使得它等概率地被重新抽取。

如果原始数据有N个记录,可以证明,平均来说,大小为N的自助样本大约包含原始数据中63.2%的记录,因为:

这样,实际评估的模型和期望评估的模型都是m个训练样本,我们仍有约1/3的没有在训练及中出现的样本用于测试,这样的测试结果我们称为“包外估计”。

优点:在训练集较小以及难以有效划分训练集测试集时很有用。可以从训练集中产生多个不同的训练集,对集成学习很有用。

缺点:自助法改变了初始数据集的分布,引入了估计偏差。所以数据量足够时,留出法和交叉验证更常用。

6. sklearn参数详解,Python绘制决策树

参数 DecisionTreeClassifier DecisionTreeRegressor
特征选择标准criterion

默认的基尼系数"gini"

可以使用"gini"或者"entropy",前者代表基尼系数,后者代表信息增益。一般说使用默认的基尼系数"gini"就可以了,即CART算法。

默认“mse

可以使用"mse"或者"mae",前者是均方差,后者是和均值之差的绝对值之和。推荐使用默认的"mse"。一般来说"mse"比"mae"更加精确。

特征划分点选择标准splitter

默认的"best"适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐"random" 

可以使用"best"或者"random"。前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。

划分时考虑的最大特征数

max_features

默认是"None",意味着划分时考虑所有的特征数

可以使用很多种类型的值,如果是"log2"意味着划分时最多考虑log2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。

一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

决策树最大深max_depth

默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。 

决策树的最大深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

内部节点再划分所需最小样本数min_samples_split

 默认是2

这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

叶子节点最少样本数min_samples_leaf

默认是1 

这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

叶子节点最小的样本权重和min_weight_fraction_leaf

默认是0,就是不考虑权重问题。

这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

最大叶子节点数max_leaf_nodes

默认是"None”,即不限制最大的叶子节点数。 

通过限制最大叶子节点数,可以防止过拟合。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。一般来说,如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

类别权重

class_weight

默认的"None",表示不管这个参数。比如样本类别分布没有明显的偏倚。

指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。

 不适用于回归树
节点划分最小不纯度min_impurity_split

默认 

这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。

数据是否预排序

presort

默认是False不排序

这个值是布尔值。一般来说,如果样本量少或者限制了一个深度很小的决策树,设置为true可以让划分点选择更加快,决策树建立的更加快。如果样本量太大的话,反而没有什么好处。问题是样本量少的时候,我速度本来就不慢。所以这个值一般懒得理它就可以了。

除了这些参数要注意以外,其他在调参时的注意点有:

1)当样本少数量但是样本特征非常多的时候,决策树很容易过拟合,一般来说,样本数比特征数多一些会比较容易建立健壮的模型

2)如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。

3)推荐多用决策树的可视化,同时先限制决策树的深度(比如最多3层),这样可以先观察下生成的决策树里数据的初步拟合情况,然后再决定是否要增加深度。

4)在训练模型先,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。

5)决策树的数组使用的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运行。

6)如果输入的样本矩阵是稀疏的,推荐在拟合前调用csc_matrix稀疏化,在预测前调用csr_matrix稀疏化。

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

猜你喜欢

转载自blog.csdn.net/m0_38019841/article/details/86091382