《机器学习》阅读笔记 第四章

本文详细介绍了机器学习中决策树的建立过程,包括选择划分属性的标准,如信息增益、增益率和基尼指数。讨论了剪枝策略,包括预剪枝和后剪枝,以及如何处理连续值和缺失值的问题。内容深入浅出,适合机器学习初学者理解。
摘要由CSDN通过智能技术生成

1. 建立决策树的基本流程1

看这一章时有一种直观的感受:决策树是一种基于计算机算法的方法,而不太像是基于统计学习理论的方法。用决策树做分类的过程,就是很符合人类思考方式地一个一个属性判断过去,只是判断用哪一种属性更好时借用了一个概率的指标,而整个算法流程(至少是基础的决策树)没有建立在某种概率或者统计模型之上。

用决策树作划分时,每一个结点都是对一个属性做二分,在坐标轴中表示出来,就是一条平行于坐标轴的直线,可以用如下一张图(两种属性、二分类)来说明用决策树做分类的过程:

决策树划分实例

图1:决策树划分示例

先看“颜色”这一属性,画一条线:

  • 浅白为坏瓜
  • 乌黑需要进一步划分

对于颜色为乌黑的西瓜,再看“根蒂”这一属性,画一条线

  • 蜷缩为好瓜
  • 硬挺为坏瓜

这样就完成了划分,实际上,上图对应了这样一棵决策树:

图1对应的决策树

图2:图1对应的决策树

注意,划分的结果并不纯,这是因为并非所有分类任务都可以用平行于坐标轴的直线划分出来。《机器学习》书中4.5节介绍了多变量决策树,也就是在每一个非叶结点采用属性的线性组合满足的条件作为划分的依据,这样,划分线就变成了“线性分类器”。

建立决策树是一个递归的过程。简单来说,就是要用作为数据结构,在建树的函数中调用它自己,将关键信息存在栈中,到了递归出口,把栈中存的所有东西全部pop出来。决策树的思想说起来简单,可是要想实现它(建树、用树做预测)可一点都不简单,c语言中二叉树相关算法是基于链表的,python是一种解释语言,貌似无法实现链表。在python中,可以用字典来建立一棵决策树作为展示,但(好像)没法用这棵树做预测……sklearn中的决策树是用cpython写的,比较复杂。

即使没法直接看决策树的代码,也可以大致勾勒一下,最重要的部分其一是递归出口,其二是划分过程。对于递归出口的设定,书中做了这样的描述,对于对应属性为 A A A 的结点:

  • 递归出口1:该结点的样本全部属于同一类别 C C C,那么就将其标记为 C C C 类叶结点
  • 递归出口2:该结点的样本在属性 A A A取值相同或者属性已经用完了,那么就将其标记为其中样本数最多的类
  • 递归出口3:选择了划分属性后,某一分支不包含任何样本,那么就将其标记为其父节点中样本最多的类

对于划分过程,在每一个非叶结点需要选择一个属性,将这一结点对应的样本按照在这一属性上的取值划分成不同的分支,每个分支接受对应的样本后,成为一个新的结点,要么选择属性再做划分,要么进入递归出口。

2. 选择划分属性的标准

2.1 信息增益

1947年,Shannon提出了“信息熵”(information entropy)这一概念,用来表示排除了冗余后的平均信息量或者样本集合的纯度。假定集合 D D D 中第 k k k 类样本占的比例是 p k p_k pk,共 N N N 类样本,那么集合 D D D 的信息熵定义为

E n t ( D ) = − ∑ k = 1 N p k log ⁡ 2 p k {\rm Ent}(D) = -\sum_{k=1}^{N} p_k \log_2 p_k Ent(D)=k=1Npklog2pk

为什么 E n t ( D ) {\rm Ent}(D) Ent(D) 能反映样本集合的纯度呢?可以用极端情况来理解:

  • 当集合中只有一类样本,此时样本集合的纯度最高, E n t ( D ) = log ⁡ 2 1 = 0 {\rm Ent}(D) = \log_2 1 = 0 Ent(D)=log21=0
  • 当集合中每一个样本都自成一类,此时样本集合的纯度最低, E n t ( D ) = − N × 1 N log ⁡ 2 1 N = log ⁡ 2 N {\rm Ent}(D) = -N \times \frac{1}{N} \log_2 \frac{1}{N} = \log_2 N Ent(D)=N×N1log2N1=log2N

可以证明2 E n t ( D ) {\rm Ent}(D) Ent(D) 是关于类别数 N N N 的单调上升函数,且取值范围就是 ( 0 , log ⁡ 2 N ) (0,\log_2 N) (0,log2N),因此,“信息熵”能够反映样本的“纯度”,也就是随机试验不确定性的大小,这个值越小,做随机试验(随便选一个样本,看它属于哪一类)的不确定性就越小,有利于分类的完成。

当我们用决策树做分类任务时,总希望经过一次划分后,每一个分支的样本变得更纯、不确定性更低,如果只有一类就最好了。因此,可以用这一属性划分得到的每一个子结点信息熵的加权平均值减去父节点的信息熵作为划分时选择属性的依据,这个指标称作信息增益(information gain),信息增益越大,说明划分后的纯度越高。假定离散属性 A A A V V V 个不同的取值,划分后得到的子结点分别对应样本集合 D 1 , . . . , D V D^1,...,D^V D1,...,DV,那么用信息增益做划分的表达是:

A ∗ = a r g    m a x A    E n t ( D ) − ∑ i = 1 V ∣ D i ∣ ∣ D ∣ E n t ( D i ) ≡ G a i n ( D , A ) A^* = {\rm \underset{A}{arg \; max}} \; {\rm Ent}(D) - \sum_{i=1}^{V} \frac{|D^i|}{|D|} {\rm Ent}(D^i) \equiv {\rm Gain}(D,A) A=AargmaxEnt(D)i=1VDDiEnt(Di)Gain(D,A)

2.2 增益率

信息增益准则对于可取值数目较多的属性有所偏好。还是考虑极端情况,当集合中每一个样本都自成一类时,划分后必然得到许多分支,且每个分支仅包含一个样本,此时每一个结点的纯度都达到了最大,信息增益显然最大。但是这种划分未必能达到理想的分类效果(泛化能力差)。为了缓解这一问题,可以用增益率作为划分准则。首先定义属性 A A A固有值 I V ( A ) {\rm IV}(A) IV(A)

I V ( A ) = ∑ i = 1 V ∣ D i ∣ D log ⁡ 2 ∣ D i ∣ D {\rm IV}(A) = \sum_{i=1}^{V} \frac{|D^i|}{D} \log_2 \frac{|D^i|}{D} IV(A)=i=1VDDilog2DDi

这个值随着属性取值数目增大而增大,再用信息增益除以 I V ( A ) {\rm IV}(A) IV(A) 就得到了增益率。这个指标平抑了属性取值数目对于划分准则的影响。

增益率准则对可取值数目较少的属性有所偏好。为此,在原始的算法中,会先找出信息增益高于平均水平的属性,再找出增益率最高的属性。

2.3 基尼指数

还可用基尼指数来作为样本划分的依据。基尼指数反映了从数据集 D D D 中随机抽取两个样本,其类别不一致的概率:

G i n i ( D ) = ∑ k ≠ j p k p j = 1 − ∑ i = 1 N p i 2 {\rm Gini}(D) = \sum_{k \neq j} p_kp_j = 1-\sum_{i=1}^{N} p_i^2 Gini(D)=k=jpkpj=1i=1Npi2

因此,基尼指数越小,类别不一致的概率越小,样本纯度越高。在划分时,选择最小化划分后各结点基尼指数加权值的那个属性:

A ∗ = a r g    m i n A    ∑ i = 1 N ∣ D i ∣ D G i n i ( D i ) A^* = {\rm \underset{A}{arg \; min}} \; \sum_{i=1}^{N} \frac{|D^i|}{D} {\rm Gini}(D^i) A=Aargmini=1NDDiGini(Di)

3. 剪枝

注意,这里的剪枝和数据结构中的剪枝含义不同。在数据结构中,使用递归回溯法时往往采用剪枝处理,在每一层递归时就判断一下是否满足(或已经不可能满足)递归出口条件,如果已经不可能满足,就不用往下继续了,从而减少计算时间与空间占用,减少爆栈的可能性。而决策树的剪枝是一种对抗过拟合的手段。为了防止分支划分过多而产生过拟合,主动去掉一些分支。剪枝办法有两种:

  • 预剪枝
  • 后剪枝

3.1 预剪枝

就是在每次选出最优属性,将要做划分时,将已经建成的树划分后的树用测试集测试一下,如果这次划分没能提升测试精度,就不做这次划分了。

可以看出,预剪枝的策略是贪心的,即每一步都选取当前的最优解,但未必是整个算法的全局最优解。目前的划分可能没法使得测试精度提升,但是这次划分之后的划分可能使得测试精度提升,如果做了预剪枝,则失去了之后划分的机会,有可能陷入局部最优解,产生欠拟合。

3.2 后剪枝

就是在整棵树建完后,按照自下而上的顺序分别考察每个结点,看看将这个结点之后的分支去掉(并将这一节点的类别标记为其中占比最多的类)会不会提高测试精度,如果会,就剪去这一节点之后的分支,并将这一节点的类别标记为其中占比最多的类;如果一样,根据奥卡姆剃刀原则,也做剪枝处理;如果反而降低了,就不剪枝。

相比于预剪枝,后剪枝不会陷入局部最优解中,泛化性能往往更好,但是计算开销最大。

4. 连续与缺失值

4.1 连续值离散化

在《机器学习》第三章,用到了离散属性数值化的办法。这里由于决策树的每次划分是基于有限、离散的属性的,如果遇到连续属性,就没法用有限的取值来计算信息增益等指标了。因此,需要将连续值离散化。书中介绍了二分法的办法,简单来说,就是:

  1. 对于某个连续属性,先数出其在训练样本中的所有取值,按从小到大的顺序排列;
  2. 再对每两个值取平均数,得到一个新的序列,作为候选划分点序列
  3. 再用每个候选的划分点来划分样本,计算信息增益等指标

从而选出最好的划分点作为这一属性的划分,再和其它属性作比较,选出最优属性。

若当前划分结点时联连续属性,则该属性还可以作为子结点的划分属性。如果是离散属性,则划分后每个结点中所有的样本在这个属性上取值是相同的,就没法作为后代结点的划分属性了。

4.2 缺失值处理

第一种办法:放弃不完整样本,但是会造成信息浪费。

第二种办法,就是书上介绍的处理办法,仅用无缺失样本计算增益。用 D ~ \tilde{D} D~ 表示属性 A A A 中没有缺失值的样本子集,假定其有 V V V 个取值, N N N 种类别,用 D ~ v \tilde{D}^v D~v 表示在属性 A A A 上取值为 a v a^v av 的样本,用 D ~ k \tilde{D}_k D~k 表示类别为 k k k 的样本,为每个样本赋予权重 w i w_{i} wi,再定义一系列比值:

ρ = ∑ i ∈ D ~ w i ∑ i ∈ D w i p ~ k = ∑ i ∈ D k ~ w i ∑ i ∈ D ~ w i r ~ v = ∑ i ∈ D ~ v w i ∑ i ∈ D ~ w i \begin{align} \rho &= \frac{\sum_{i \in \tilde{D}} w_i}{\sum_{i \in D} w_{i}}\\[2mm] \tilde{p}_{k} &= \frac{\sum_{i \in \tilde{D_k}} w_i}{\sum_{i \in \tilde{D}} w_{i}}\\[2mm] \tilde{r}_{v} &= \frac{\sum_{i \in \tilde{D}^v} w_i}{\sum_{i \in \tilde{D}} w_{i}}\\[2mm] \end{align} ρp~kr~v=iDwiiD~wi=iD~wiiDk~wi=iD~wiiD~vwi

其中,

  • ρ \rho ρ 表示某一结点中无缺失样本占比
  • p ~ k \tilde{p}_{k} p~k 表示无缺失样本中第 k k k 类占比
  • r ~ v \tilde{r}_{v} r~v 表示无缺失样本在属性 A A A 上取值为 a v a^v av 的样本占比

由此,可将信息增益推广为(用无缺失样本计算的增益 × \times × 无缺失样本占比)

ρ × [ E n t ( D ~ ) − ∑ v = 1 V r ~ v E n t ( D ~ v ) ] \rho \times \Big[{\rm Ent}(\tilde{D}) - \sum_{v=1}^{V} \tilde{r}^v {\rm Ent}(\tilde{D}^v) \Big] ρ×[Ent(D~)v=1Vr~vEnt(D~v)]

若某个样本在属性 A A A 上取值已知,则做正常划分即可。若取值未知,则将这一样本同时划入所有子结点,并将其在第 v v v 个子结点中的权值调整为 r ~ v ⋅ w i \tilde{r}^v \cdot w_i r~vwi

为什么这样的处理是合理的呢?

  • 首先考虑 ρ \rho ρ 的作用:其作用是防止信息增益这一指标偏好缺失值较少的属性
  • 接着考虑将有缺失值样本划分如不同结点时,对权重做的处理:实际上是用无缺失值样本中属性取值比例来估计有缺失值样本在这一属性上取值的可能性,进而调整其在下一结点中的权重。
  • 最后考虑同一样本(带缺失值)在不同子结点中权重不同,会产生什么影响?根本上说,就是赋予权重这一操作的意义何在?可以这样理解:权重代表了该样本属于这一分支的概率(对于无缺失值的样本,实际上可设权重为1,也永远不需要调整),对于在该属性上有缺失值的样本,调整权重实际上是为了构造一个条件概率,进而调整无缺失样本占比。即在子结点中计算 ( 1 ) ∼ ( 3 ) (1) \sim (3) (1)(3) 式时,某个样本对于这一系列占比的贡献实际上表示为

P ( 占比贡献 ) = P ( 占比贡献 ∣ 在这一结点的概率 ) ⋅ P ( 在这一结点的概率 ) = r ~ v ⋅ w i \begin{aligned} P(占比贡献) &= P(占比贡献|在这一结点的概率) \cdot P(在这一结点的概率)\\ &=\tilde{r}^v \cdot w_i \end{aligned} P(占比贡献)=P(占比贡献在这一结点的概率)P(在这一结点的概率)=r~vwi


  1. 全文参考《机器学习》(周志华)第四章 ↩︎

  2. 参见《概率论基础》(李贤平)第四章第三节 ↩︎

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 支持向量机非线性回归通用MATLAB程序解析 #### 一、概述 本文将详细介绍一个基于MATLAB的支持向量机(SVM)非线性回归的通用程序。该程序采用支持向量机方法来实现数据的非线性回归,并通过不同的核函数设置来适应不同类型的数据分布。此外,该程序还提供了数据预处理的方法,使得用户能够更加方便地应用此程序解决实际问题。 #### 二、核心功能与原理 ##### 1. 支持向量机(SVM) 支持向量机是一种监督学习模型,主要用于分类和回归分析。对于非线性回归任务,SVM通过引入核技巧(kernel trick)将原始低维空间中的非线性问题转换为高维空间中的线性问题,从而实现有效的非线性建模。 ##### 2. 核函数 核函数的选择直接影响到模型的性能。本程序内置了三种常用的核函数: - **线性核函数**:`K(x, y) = x'y` - **多项式核函数**:`K(x, y) = (x'y + 1)^d` - **径向基函数(RBF)**:`K(x, y) = exp(-γ|x - y|^2)` 其中RBF核函数被广泛应用于非线性问题中,因为它可以处理非常复杂的非线性关系。本程序默认使用的是RBF核函数,参数`D`用于控制高斯核函数的宽度。 ##### 3. 数据预处理 虽然程序本身没有直接涉及数据预处理的过程,但在实际应用中,对数据进行适当的预处理是非常重要的。常见的预处理步骤包括归一化、缺失值处理等。 ##### 4. 模型参数 - **Epsilon**: ε-insensitive loss function的ε值,控制回归带宽。 - **C**: 松弛变量的惩罚系数,控制模型复杂度与过拟合的风险之间的平衡。 #### 三、程序实现细节 ##### 1. 函数输入与输出 - **输入**: - `X`: 输入特征矩阵,维度为(n, l),其中n是特征数量,l是样本数量。 - `Y`: 目标值向量,长度为l。 - `Epsilon`: 回归带宽。 - `C`: 松弛变量的惩罚系数。 - `D`: RBF核函数的参数。 - **输出**: - `Alpha1`: 正的拉格朗日乘子向量。 - `Alpha2`: 负的拉格朗日乘子向量。 - `Alpha`: 拉格朗日乘子向量。 - `Flag`: 标记向量,表示每个样本的类型。 - `B`: 偏置项。 ##### 2. 核心代码解析 程序首先计算所有样本间的核矩阵`K`,然后构建二次规划问题并求解得到拉格朗日乘子向量。根据拉格朗日乘子的值确定支持向量,并计算偏置项`B`。 - **核矩阵计算**:采用RBF核函数,通过`exp(-(sum((xi-xj).^2)/D))`计算任意两个样本之间的相似度。 - **二次规划**:构建目标函数和约束条件,使用`quadprog`函数求解最小化问题。 - **支持向量识别**:根据拉格朗日乘子的大小判断每个样本是否为支持向量,并据此计算偏置项`B`。 #### 四、程序扩展与优化 - **多核函数支持**:可以通过增加更多的核函数选项,提高程序的灵活性。 - **自动调参**:实现参数自动选择的功能,例如通过交叉验证选择最优的`Epsilon`和`C`值。 - **并行计算**:利用MATLAB的并行计算工具箱加速计算过程,特别是当样本量很大时。 #### 五、应用场景 该程序适用于需要进行非线性回归预测的场景,如经济预测、天气预报等领域。通过调整核函数和参数,可以有效应对各种类型的非线性问题。 ### 总结 本程序提供了一个支持向量机非线性回归的完整实现框架,通过灵活的核函数设置和参数调整,能够有效地处理非线性问题。对于需要进行回归预测的应用场景,这是一个非常实用且强大的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值