决策树——机器学习(周志华)

C++实现决策树

决策树

决策数学习的基本算法

划分选择

决策树的关键在第8行,如何选择最优划分属性,一般而言,随着划分过程不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一类别,即节点的“纯度”越来越高。

信息增益

“信息熵”是度量样本集合纯度最常用的一种指标。

信息熵

E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g ( p k ) Ent(D) = -\sum_{k=1}^{|y|}p_klog (p_k) Ent(D)=k=1ypklog(pk)

当前样本D中的第k类样本(比如好瓜、坏瓜)所占的比例为 p k p_k pk,则D的信息熵为上面公式,值越小,纯度越高

信息增益(ID3决策树)

G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a) = Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)v=1VDDvEnt(Dv)

V V V表示属性a的可能取值为 { a 1 , a 2 , . . . , a V } \{a^1,a^2,...,a^V\} {a1,a2,...,aV}, 信息增益越大,使用a属性来划分所获得的“纯度提升越大”,因此我们可以使用信息增益作为决策树的划分属性选择,就如第8行的 a ∗ = arg ⁡ a ∈ A max ⁡ G a i n ( D , a ) a_* = \arg \limits_{a\in A} \max Gain(D, a) a=aAargmaxGain(D,a), ID3决策树学习算法就是使用信息增益为准则划分属性

增益率(C4.5决策树)

使用信息增益的缺点可能划分纯度很大,但是决策树不具有泛化能力,就是过拟合,无法对新样本进行有效的预测,信息增益准则对可能取值数目较多的属性有所偏好。C4.5决策树算法使用增益率来选择最优划分属性。
G a i n r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) Gain_ratio(D,a) = \frac{Gain(D,a)}{IV(a)} Gainratio(D,a)=IV(a)Gain(D,a)
I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ IV(a) =-\sum_{v=1}^{V}\frac{|D^v|}{|D|}log_2 \frac{|D^v|}{|D|} IV(a)=v=1VDDvlog2DDv

I V ( a ) IV(a) IV(a)称为属性a的“固有值”,属性a的取值数目越多,值越大。增益率准则对可取值数目较少的属性有所偏好。所以C4.5决策树算法使用了一个启发式的算法:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择信息增益率最高的。

基尼指数(CART决策树)

数据集D的纯度用基尼指数表示为:

G i n i ( D ) = − ∑ k = 1 ∣ y ∣ p k 2 Gini(D) = -\sum_{k=1}^{|y|}p_k^2 Gini(D)=k=1ypk2

基尼指数越小,纯度越高

属性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) Giniindex(D,a)=v=1VDDvGini(Dv)

在候选属性集合A中,选择使得划分后基尼指数最小的属性作为最优划分属性, a ∗ = arg ⁡ a ∈ A min ⁡ G i n i _ i n d e x ( D , a ) a_* = \arg \limits_{a\in A} \min Gini\_index(D, a) a=aAargminGini_index(D,a)

剪枝处理

是一种决策树学习算法对付“过拟合”的手段。

  • 预剪枝
  • 后剪枝

预剪枝

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

未剪枝决策树

在这里插入图片描述

预剪枝决策树

在这里插入图片描述

后剪枝

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

在这里插入图片描述

连续与缺失值

连续值处理

我们之前都是基于离散属性来生成决策树,现实中可能遇到连续属性。
如图中地密度和含糖率
在这里插入图片描述

最简单地策略是采用二分法对来内需属性进行处理,C4.5决策树就是采用地这样地机制。

  • 将连续属性a排序为 { a 1 , a 2 , . . . , a n } \{a^1, a^2,...,a^n\} {a1,a2,...,an}
  • 基于划分点t将D分为子集 D − D^- D D + D^+ D+
  • 对相邻地属性取值 a i a^i ai a i + 1 a^{i+1} ai+1,t在区间 [ a i , a i + 1 ) [a^i,a^{i+1}) [ai,ai+1)中取任意值产生地划分结果相同
  • 划分点集合
    T a = { a i + a i + 1 2 ∣ 1 &lt; = i &lt; = n − 1 } T_a = \{\frac{a^i + a^{i+1}}{2}| 1 &lt;= i &lt;= n - 1\} Ta={2ai+ai+11<=i<=n1}
  • 信息增益
    G a i n ( D , a ) = max ⁡ t ∈ T a G a i n ( D , a , t ) = max ⁡ t ∈ T a E n t ( D ) − ∑ λ ∈ { − , + } ∣ D t λ ∣ ∣ D ∣ E n t ( D t λ ) Gain(D,a) =\max \limits_{t\in T_a} Gain(D,a,t) =\max \limits_{t\in T_a} Ent(D)-\sum \limits_{\lambda\in \{-,+\}} \frac{|D_t^{\lambda}|}{|D|}Ent(D_t^{\lambda}) Gain(D,a)=tTamaxGain(D,a,t)=tTamaxEnt(D)λ{,+}DDtλEnt(Dtλ)

选择使 max ⁡ t ∈ T a G a i n ( D , a , t ) \max \limits_{t\in T_a} Gain(D,a,t) tTamaxGain(D,a,t)最大化地划分点

缺失值处理

现实任务中总会遇到不完整地样本,样本地某些属性值缺失。我们不能完全丢弃,否则是一种信息浪费。

所以我们要解决两个问题:

  • 如何在属性值缺失的情况下进行划分属性选择?
  • 给定划分属性?若样本在该属性上的值缺失,如何对样本进行划分?

下面

  • D ~ \widetilde{D} D 表示D中在属性a上没有缺失值地样本子集
  • D ~ v \widetilde{D}^v D v表示 D ~ \widetilde{D} D 在属性a上取值为 a v a^v av地样本子集
  • 假定我们给每一个x赋予一个权重 ω x \omega_x ωx,并定义

ρ = ∑ x ∈ D ~ ω x ∑ x ∈ D ω x \rho = \frac{\sum_{x\in \widetilde{D}}\omega_x}{\sum_{x\in D}\omega_x} ρ=xDωxxD ωx

表示无缺失值样本所占比例

ρ ~ k = ∑ x ∈ D ~ k ω x ∑ x ∈ D ~ ω x \widetilde{\rho }_k= \frac{\sum_{x\in \widetilde{D}_k}\omega_x}{\sum_{x\in \widetilde{D}}\omega_x} ρ k=xD ωxxD kωx

表示无缺失值样本中第k类所占地比例

r ~ v = ∑ x ∈ D ~ v ω x ∑ x ∈ D ~ ω x \widetilde{r }_v= \frac{\sum_{x\in \widetilde{D}^v}\omega_x}{\sum_{x\in \widetilde{D}}\omega_x} r v=xD ωxxD vωx

表示无缺失值样本中在属性a上取值 a v a^v av地样本所占地比例

  • 信息增益

G a i n ( D , a ) = ρ ∗ G a i n ( D ~ , a ) = ρ ∗ ( E n t ( D ~ ) − ∑ v = 1 V r ~ v E n t ( D ~ v ) ) Gain(D,a) = \rho * Gain(\widetilde{D},a)\\ = \rho * (Ent(\widetilde{D})-\sum_{v=1}^{V}\widetilde{r }_vEnt(\widetilde{D}^v)) Gain(D,a)=ρGain(D ,a)=ρ(Ent(D )v=1Vr vEnt(D v))

E n t ( D ) = − ∑ k = 1 ∣ y ∣ ρ ~ k l o g ( ρ ~ k ) Ent(D) = -\sum_{k=1}^{|y|}\widetilde{\rho }_klog (\widetilde{\rho }_k) Ent(D)=k=1yρ klog(ρ k)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
周志华是一位著名的机器学习专家,他在《机器学习》一书中详细介绍了决策树算法。下面是决策树算法的伪代码: 1. 定义决策树节点类: class DecisionTreeNode: def __init__(self): self.feature = None # 当前节点选择的特征 self.threshold = None # 特征的阈值 self.label = None # 叶子节点的类别标签 self.left_child = None # 左子树 self.right_child = None # 右子树 2. 定义决策树构建函数: def build_decision_tree(data, labels): # 创建新节点 node = DecisionTreeNode() # 如果所有样本属于同一类别,则将当前节点标记为叶子节点,并返回 if all_same_class(labels): node.label = labels return node # 如果没有特征可用,则将当前节点标记为叶子节点,并返回 if no_more_features(): node.label = majority_class(labels) return node # 选择最优特征和阈值 best_feature, best_threshold = choose_best_feature(data, labels) node.feature = best_feature node.threshold = best_threshold # 根据最优特征和阈值划分数据集 left_data, left_labels, right_data, right_labels = split_data(data, labels, best_feature, best_threshold) # 递归构建左子树和右子树 node.left_child = build_decision_tree(left_data, left_labels) node.right_child = build_decision_tree(right_data, right_labels) return node 3. 定义决策树预测函数: def predict(node, sample): if node.label is not None: return node.label if sample[node.feature] <= node.threshold: return predict(node.left_child, sample) else: return predict(node.right_child, sample) 以上是决策树算法的伪代码,其中包括了决策树节点类的定义、决策树构建函数和决策树预测函数。通过递归地选择最优特征和阈值来构建决策树,并使用构建好的决策树进行样本的预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值