决策树(Decision Tree)

决策树

最近要学习的东西很多,今天看了决策树和集成学习。感觉内容不是很复杂,其中决策树的内容我在信息论课上也学过。所以来写篇博客记录一下。

这篇博客的主要参考资料是周志华老师的西瓜书《机器学习》

决策树是什么

决策树是一类常见的机器学习方法。顾名思义,决策树是基于树结构来进行决策的,这恰是人类在面临决策问题时一种很自然的处理机制。我们对一个东西的多个属性进行依次判别,最后得到最终决策。

一般的,一颗决策树包含一个根节点、若干个内部节点和若干个叶节点;叶节点对应于决策结果,其他每个节点则对应一个属性测试;每个节点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集,从根结点到每个叶节点的路径对应了一个判定测试序列。决策树学习的目的是为了产生一颗泛化能力强,即处理未见示例能力强的决策树。

划分选择

这是决策树中我认为最重要的内容。要在每一步都要选择最优划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的纯度越来越高

信息熵

这里直接用到我信息论课程中的公式
H ( X ) = − ∑ x ∈ X p ( x ) log ⁡ p ( x ) = ∑ x ∈ X p ( x ) log ⁡ 1 p ( x ) H(X)=-\sum_{x \in \mathcal{X}} p(x) \log p(x)=\sum_{x \in \mathcal{X}} p(x) \log \frac{1}{p(x)} H(X)=xXp(x)logp(x)=xXp(x)logp(x)1
这个可以度量样本集合纯度,是最常用的一种指标。例如,p(x)=1,就代表仅有这一个元素,纯度最高。此时 H ( x ) = 0 H(x)=0 H(x)=0。高中化学其实有提到过,熵可以代表一个系统的混乱无序的程度。而这个我们也把它成为信息熵

信息增益(ID3)

在决策树中,我们要用的不仅仅是信息熵,还要信息增益。熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏。

因此有下面的公式, 使用某个特征A划分数据集D,计算划分后的数据子集的熵 entroy(后)
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D, A)=H(D)-H(D | A) g(D,A)=H(D)H(DA)

具体的, H ( D ∣ A ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ H ( D v ) H(D|A)=\sum_{v=1}^V\frac{|D^v|}{|D|}H(D^v) H(DA)=v=1VDDvH(Dv)

其中 D v D^v Dv表示在属性A上取值为 a v a^v av的样本。

缺点:信息增益偏向取值较多的特征
原因:当特征的取值较多时,根据此特征划分更容易得到纯度更高的子集,因此划分之后的熵更低,由于划分前的熵是一定的,因此信息增益更大,因此信息增益比较 偏向取值较多的特征。

信息增益率(C4.5)

g R ( D , A ) = g ( D , A ) H A ( D ) g_{R}(D, A)=\frac{g(D, A)}{H_{A}(D)} gR(D,A)=HA(D)g(D,A)

H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ log ⁡ 2 ∣ D i ∣ ∣ D ∣ H_{A}(D)=-\sum_{i=1}^{n} \frac{\left|D_{i}\right|}{|D|} \log _{2} \frac{\left|D_{i}\right|}{|D|} HA(D)=i=1nDDilog2DDi

缺点:信息增益比偏向取值较少的特征
原因: 当特征取值较少时 H A ( D ) H_A(D) HA(D)的值较小,因此其倒数较大,因而信息增益比较大。因而偏向取值较少的特征。

使用信息增益比:基于以上缺点,并不是直接选择信息增益率最大的特征,而是现在候选特征中找出信息增益高于平均水平的特征,然后在这些特征中再选择信息增益率最高的特征。

基尼指数(CART算法)

CART是Classification and Regression Tree的简称,这是一种著名的决策树学习算法,分类和回归任务都可以。

CART决策树使用“基尼指数”来选择划分属性。
G i n i ( D ) = ∑ k = 1 ∣ Y ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ Y ∣ p k 2 Gini(D)=\sum_{k=1}^{|Y|}\sum_{k^{\prime}\neq k}p_k p_{k^{\prime}}=1-\sum_{k=1}^{|Y|}p_k^2 Gini(D)=k=1Yk=kpkpk=1k=1Ypk2

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

属性A的基尼指数定义为
G i n i _ i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini\_index(D,a)=\sum_{v=1}^{V}\frac{|D^v|}{|D|}Gini(D^v) Gini_index(D,a)=v=1VDDvGini(Dv)
于是,我们在候选属性集合A中,选择那个使得划分后基尼指数最小的那个属性作为最优划分属性。即
a ∗ = arg min ⁡ a ∈ A G i n i _ i n d e x ( D , a ) a^*=\argmin_{a\in A} Gini\_index(D,a) a=aAargminGini_index(D,a)

剪枝

实际上在刚刚完成的一颗决策树是不具有泛化能力的。也就是说它不具备预测正确没有遇到过的数据的能力。我们要主动通过去掉一些分支来降低过拟合的风险。

为了计算是否剪枝,我们要首先把整个数据集随机的分成训练集和验证集。简单来说,训练出来的决策树剪枝或不剪枝,取决于在验证集上哪个的效果更好。

预剪枝是从上至下进行验证。如果在划分后的验证集精度小于等于划分前精度,那么就不能再划分。

后剪枝是先正常的构建一颗决策树,然后自底向上的对树中的所有非叶节点进行逐一考察。

比较

后剪枝决策树通常比预剪枝决策树保留了更多的分支;
后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树;
后剪枝决策树训练时间开销比未剪枝决策树和预剪枝决策树都要大的多。

猜你喜欢

转载自blog.csdn.net/Code_Tookie/article/details/104841129
今日推荐