前言
《机器学习》,又称西瓜书,是南京大学教授周志华教授编著的一本机器学习领域的经典教材。《机器学习》系统地介绍了机器学习的基本理论、常用算法及其应用。全书内容丰富,涵盖了机器学习的多个重要方面,包括监督学习、无监督学习、强化学习等主要学习范式。《机器学习》适合计算机科学、人工智能、数据科学等相关专业的本科生、研究生以及对机器学习感兴趣的自学者。无论是初学者希望系统地学习机器学习的基础知识,还是有一定基础的研究人员和从业者希望深入了解前沿技术,这本书都能提供有价值的参考。
在接下来的日子里,我将每周精心打磨一章内容,全方位、多角度地为大家剖析书中精髓。无论是复杂难懂的算法,还是晦涩难解的公式,我都会以通俗易懂的方式逐一解读,力求让每一位读者都能轻松掌握其中的奥秘。让我们一起在知识的海洋中遨游,探索机器学习的无限魅力!
第一章:西瓜书《机器学习》全网最详细解读 第一章:绪论_机器学习 西瓜书-优快云博客
第二章:西瓜书《机器学习》全网最详细解释 第二章:模型评估-优快云博客
在本系列中:
- 重点内容将使用加粗或者红字显示
- 普通内容使用普通颜色显示
- 示例使用蓝色显示
-
-
3.1 基本形式
给定由d个属性描述的示例,其中
是
在第i个属性上的取值,线性模型(linear model)试图学得一个通过属性的线性组合来进行预测的函数,即
是数据x的第i个属性,如西瓜的颜色、瓜蒂曲直等
是对
的权重,如果
重要,那么
也相应更大一些。
- b是偏置
- 最终的计算结果就是f(x)
一般用向量形式写成
,其中
。
和 b学得之后,模型就得以确定。
假设我们有一个西瓜评估模型,该模型的目标是预测一个西瓜是否是“好瓜”。在这个模型中,我们考虑了三个属性:色泽(x色泽)、根蒂(x根蒂)和敲声(x敲声)。每个属性都有一个对应的权重(w色泽、w根蒂、w敲声),这些权重表示了每个属性在预测中的重要性。
根据模型,我们得到了以下线性模型: f好瓜(x)=0.2⋅x色泽+0.5⋅x根蒂+0.3⋅x敲声+1
在这个模型中:
-
色泽(x色泽)的权重是0.2,表示色泽在判断西瓜是否是好瓜时的重要性相对较低。
-
根蒂(x根蒂)的权重是0.5,表示根蒂是最重要的属性,对判断西瓜是否是好瓜有很大的影响。
-
敲声(x敲声)的权重是0.3,表示敲声的重要性介于色泽和根蒂之间。
-
线性模型形式简单、易于建模,但却蕴涵着机器学习中一些重要的基本思想。
许多功能更为强大的非线性模型(nonlinear model)可在线性模型的基础上通过引入层级结构或高维映射而得。
此外,由于直观表达了各属性在预测中的重要性,越重要的属性其wi权重越高,因此线性模型有很好的可解释性(comprehensibility)。
-
-
3.2 线性回归
给定数据集,其中
,
。“线性回归”(linear regression)试图学得一个线性模型以尽可能准确地预测输出标记(也就是通过
得到
)。
我们先考虑一种最简单的情形:输入属性的数目只有一个。
连续属性可以直接带入,而对离散属性:
- 若属性值间存在“序”(order)关系,可通过连续化将其转化为连续值,例如二值属性“身高”的取值“高”“矮”可转化为{1.0,0.0},三值属性“高度”的取值“高”“中”“低”可转化为{1.0,0.5,0.0};
- 若属性值间不存在序关系,假定有k个属性值,则通常转化为k维向量,例如属性“瓜类”的取值“西瓜”“南瓜”“黄瓜”可转化为(0,0,1),(0,1,0),(1,0,0)。(可以理解为第一个值代表西瓜,第二个值代表南瓜,第三个值代表黄瓜)
线性回归试图学得,使得
,(我们要找到一条直线,尽可能地拟合所有点)我们可以通过下图可视化地理解:

很显然,我们只需要确定w和b就可以了。
-
那么如何确定 w 和 b 呢? 显然,关键在于如何衡量 f(x) 与 y 之间的差别(即模型预测值和真实值的差异)。
均方误差是回归任务中最常用的性能度量(详见第二章),因此我们可试图让均方误差最小化,即
均方误差有非常好的几何意义,它对应了常用的欧几里得距离或简称“欧氏距离”(Euclidean distance)。基于均方误差最小化来进行模型求解的方法称为“最小二乘法”(least square method)。在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。
求解 w 和 b 是使 最小化的过程,称为线性回归模型的最小二乘“参数估计”(parameter estimation)。由高数知识可知,求方程的极小值就是求解偏导为0的点,因此,接下来我们求解方程,使偏导为0。
- 将
分别对 w 和 b 求偏导,得到
- 然后令上式为零可得到 w 和 b 最优解的闭式(closed-form)解
,
其中为 x 的均值。
-
我们刚刚讨论的是输入属性的数目只有一个的情况,更一般的情形是样本由 d 个属性描述,而我们要根据d个属性得到进行回归计算。此时我们试图学得,使得
,这称为“多元线性回归”(multivariate linear regression)。
此时我们仍然可利用最小二乘法来对 w 和 b 进行估计。
我们首先简化表达
- 我们把 w 和 b变成向量形式
,
- 相应的,把数据集 D 表示为一个 m × (d + 1) 大小的矩阵 X,其中每行对应于一个示例,该行前 d 个元素对应于示例的 d 个属性值,最后一个元素恒置为 1,即:
,
这样一来,我们就可以将原式简化为。
再把标记y也写成向量形式 ,则类似于上式,有
。
矩阵的求导方法类似于普通方程(把当成
),如下:
- 令
,对
求导得到
。
- 令上式为零可得
最优解的闭式解。
但由于涉及矩阵逆的计算,比单变量情形要复杂一些。下面我们做一个简单的讨论。
- 当
为满秩矩阵(full-rank matrix)或正定矩阵(positive definite matrix)时,令
为零可得
。其中
是矩阵
的逆矩阵。令
,则最终学得的多元线性回归模型为
。
- 然而,现实任务中
往往不是满秩矩阵。此时可解出多个
,它们都能使均方误差最小化。选择哪一个解作为输出,将由学习算法的归纳偏好决定,常见的做法是引入正则化(regularization)项。
不是满秩的情况:
- 特征数量>样本数量(小样本)
- 线性相关
-
接下来我们对线性模型做一些变换。
可将输出标记的对数作为线性模型逼近的目标,即。 这就是“对数线性回归”(log-linear regression),它实际上是在试图让
逼近 y。
它在形式上仍是线性回归,但实质上已是在求取输入空间到输出空间的非线性函数映射,如下图所示。这里的对数函数起到了将线性回归模型的预测值与真实标记联系起来的作用。
-
-
3.3 对数几率回归(逻辑回归)
上一节讨论了如何使用线性模型进行回归学习,但若要做的是分类任务该怎么办?
我们先考虑二分类任务,其输出标记为 (如0代表负例,1代表正例),而线性回归模型产生的预测值
是实值(即连续的小数)。于是,我们需将实值z转换为 0/1 值。也就是说,我们想找一个分类面,越过分类面的为正例,没越过分类面的为负例。而最理想的分类面是“单位阶跃函数”(unit-step function):
即若预测值z大于零就判为正例,小于零则判为反例,预测值为临界值零则可任意判别,如图所示。
然而,单位阶跃函数不连续,不连续函数在不连续点处的导数通常不存在。而现代深度学习模型最基本的数学原理就是求导,无法求导也就意味着我们无法使用阶跃函数。
于是我们希望找到能在一定程度上近似单位阶跃函数的“替代函数”(surrogate function),并希望它单调可微。
对数几率函数(logistic function)正是这样一个常用的替代函数:,我们也称其为Sigmoid 函数,它将输入值转化为一个接近 0 或 1 值,并且其输出值在z = 0附近变化很陡。
我们将3.1的线性模型带入对数几率函数,得到
,经过变换,得到
。变换过程如下:
若将 y 视为样本 x 作为正例的可能性,则 1-y 是其反例可能性,两者的比值称为“几率”(odds),反映了 x 作为正例的相对可能性(
是正例,反之为负例)。对几率取对数则得到“对数几率”(log odds, 亦称 logit),即
。
-
实际上,对数几率回归是在用线性回归模型的预测结果去逼近真实标记的对数几率,因此,其对应的模型称为“对数几率回归”(logistic regression,亦称 logit regression)。
特别需注意的是,虽然它的名字是“回归”,但实际却是一种分类学习方法。这种方法有很多优点,例如:
- 它是直接对分类可能性进行建模,无需事先假设数据分布,这样就避免了假设分布不准确所带来的问题;
- 它不是仅预测出“类别”,而是可得到近似概率预测,这对许多需利用概率辅助决策的任务很有用;
- 此外,对率函数是任意阶可导的凸函数,有很好的数学性质,现有的许多数值优化算法都可直接用于求取最优解。
-
一旦确定了参数w和b,我们就能确定这个线性模型。而现在,问题又回到了3.2类似的地方,我们该如何确定参数w和b?
为了方便起见,我们将式中的 y 视为类后验概率估计 ,则式
可重写为
,进行拆解可得:
我们可通过“极大似然法”(maximum likelihood method)来估计 w 和 b。
给定数据集
- 首先将每组数据带入
- 然后进行“对数似然”(log-likelihood)(主要目的是将乘法运算转换为加法运算,这在处理多个概率值的乘积时特别有用):
- 我们的目的就是最大化所有样本的预测正确率:
(如果不做对数似然,现在这个式子就是所有样本准确率相乘,经过对数似然后,我们转换为了加法) - 其中每个
都有两种可能(判断正确或判断错误):
(如果标签是正例,即1,那么右半边式子为0,概率p等于左半边,即只计算正例的概率;如果标签
是负例,即0,那么左半边式子为0,概率p等于右半边,即只计算负例的概率)
- 为了和书本内容保持一致,我们做一下简化:
将表示为
,将
表示为
- 把
和
带入上式,再把上式带入
,得到
- 最大化就是取负后最小化,得到
,
- 该式是关于β的高阶可导连续凸函数,根据凸优化理论,可利用经典的数值优化算法如梯度下降法(gradient descent method)、牛顿法(Newton method)等都可求得其最优解。
-
-
3.4 线性判别分析
线性判别分析(Linear Discriminant Analysis,简称 LDA)是一种经典的线性学习方法,亦称“Fisher 判别分析”。
LDA 的思想非常朴素:给定训练样例集,设法将样例投影到一条直线上,使得同类样例的投影点尽可能接近、异类样例的投影点尽可能远离;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。下图给出了一个二维示意图。
给定数据集 ,令
、
、
分别表示第
类示例的集合、均值向量、协方差矩阵。
- 若将数据投影到直线 w 上,则两类样本的中心在直线上的投影分别为
和
;(后面我们希望不同类的中心之间尽可能离得远)
- 若将所有样本点都投影到直线上,则两类样本的协方差分别为
和
。(后面我们希望同类点之间尽可能离得近)
由于直线是一维空间,因此 、
、
和
均为实数。
接下来,我们从数学角度定义上面的要求:
- 欲使同类样例的投影点尽可能接近,可以让同类样例投影点的协方差尽可能小,即
尽可能小;
- 欲使异类样例的投影点尽可能远离,可以让异类中心之间的距离尽可能大,即
尽可能大。
而同时考虑二者,则可得到欲最大化的目标:(我们希望分子越大越好,分母越小越好,因此,我们应让J越大越好)
根据上面的分析,我们定义两个式子:
- “类内散度矩阵”(within-class scatter matrix):
- “类间散度矩阵”(between-class scatter matrix):
而J可重写为 ,这就是 LDA 欲最大化的目标,即
与
的“广义瑞利商”(generalized Rayleigh quotient)。
的主要目的是让最大化目标变成标量,而转换为标量是为了简化求导过程,使得梯度计算更加直接和高效(我们知道现代神经网络的最核心原理就是梯度下降)。
-
那么我们如何确定 w 呢?
为了方便起见,我们令(固定分母),然后转换为求最小化目标(取负号),则J可转化为:
这样转换的目的是可以使用拉格朗日法计算
- 使用拉格朗日进行转化,得到
- 对上式求偏导:
(详细求偏导的公式请看附录A.32)
- 令上式为0,得到
,其中
是拉格朗日乘子。
其中,其中
是标量,所以
的方向恒为
。
我们令,代入上式即得
。
- 在实践中通常是对
进行奇异值分解,即
,这里Σ是一个实对角矩阵,其对角线上的元素是
的奇异值,然后再由
得到
。
- 在实践中通常是对
-
我们可以将LDA推广到多分类任务中。
- 假定存在N个类,且第i类示例数为mi,我们先定义“全局散度矩阵”:
(可理解为所有点距离中心点的方差)其中
是所有示例的均值向量。
- 然后将类内散度矩阵
重定义为每个类别的散度矩阵之和,即
,其中
(可理解为每个类内所有点距离中心点的方差)
和
已知,则
- 相应的,我们可采用优化目标
进行计算,其中
,
表示矩阵的迹(trace)。
- 经过拉格朗日法,我们得到:
,
的闭式解则是
的 N-1 个最大广义特征值所对应的特征向量组成的矩阵。
LDA的意义:
多分类 LDA 将原本N维样本样本投影到 N-1 维空间,我们可将LDA看做一种降维技术。
LDA试图找到一个投影,使得投影后的类间距离尽可能大,类内距离尽可能小,从而提高分类的准确性。然后选择对应最大特征值的特征向量作为最优投影方向,这些特征向量构成了新的特征空间。于是,可通过这个投影来减小样本点的维数,且投影过程中使用了类别信息,因此 LDA 也常被视为一种经典的监督降维技术。
如下图中,我们将原本二维空间的点投影到一维直线上,即将二维降低到一维。
-
-
3.5 多分类学习
我们之前讨论的都是二分类问题,但日常生活中,我们经常遇到的是多分类问题,那么我们该怎么解决多分类问题呢?
一个常见的思路是将二分类问题进行推广。
多分类学习的基本思路是“拆解法”,即将多分类任务拆为若干个二分类任务求解。具体来说,先对问题进行拆分,然后为拆出的每个二分类任务训练一个分类器;在测试时,对这些分类器的预测结果进行集成以获得最终的多分类结果。
这里的关键是如何对多分类任务进行拆分,以及如何对多个分类器进行集成。最经典的拆分策略有三种:“一对一”(One vs. One, 简称 OvO)、“一对其余”(One vs. Rest, 简称 OvR)和“多对多”(Many vs. Many, 简称 MvM)。
- OvO:
- 训练阶段:给定N个数据集:OvO 将这N个类别两两配对(模型将一类定义为正例,另一类定义为负例,遇到其他类随便判为正负),从而产生
个二分类任务,
- 在测试阶段,新样本将同时提交给所有分类器,于是我们将得到
个分类结果,最终结果可通过投票产生:即把预测得最多的类别作为最终分类结果。
- 举例:假设我们有一个数据集,包含三种类型的动物:猫、狗和鸟。使用 OvO 策略,我们将训练以下分类器:一个分类器区分猫和狗、一个分类器区分猫和鸟、一个分类器区分狗和鸟。对于一个新的动物样本,我们将使用这三个分类器进行预测,然后通过投票或其他策略决定最终的类别。
- 训练阶段:给定N个数据集:OvO 将这N个类别两两配对(模型将一类定义为正例,另一类定义为负例,遇到其他类随便判为正负),从而产生
-
OvR
-
训练阶段:每次将一个类的样例作为正例、所有其他类的样例作为反例来训练 N 个分类器。
-
测试阶段:在测试时若仅有一个分类器预测为正类,则对应的类别标记作为最终分类结果,若有多个分类器预测为正类,则通常考虑各分类器的预测置信度,选择置信度最大的类别标记作为分类结果。
-
举例:我们要区分20种动物,其中一个是天鹅,那么我们需要专门训练一个模型判断某动物是不是天鹅(即天鹅是正类,其他19种动物是负类)
-
OvO 和 OvR
-
OvR 只需训练 N 个分类器,而 OvO 需训练
个分类器,因此,OvO 的存储开销和测试时间开销通常比 OvR 更大。
-
在训练时,OvR 的每个分类器均使用全部训练样例,而 OvO 的每个分类器仅用到两个类的样例,因此,在类别很多时,OvO 的训练时间开销通常比 OvR 更小。
-
至于预测性能,则取决于具体的数据分布,在多数情形下两者差不多。
-
MvM
-
每次将若干个类作为正类,若干个其他类作为反类。显然,OvO 和 OvR 是 MvM 的特例。
-
举例:我们要区分若干种动物,第一个分类器用于分类鸟类和猫科动物,第二个分类器用于分类猛禽和家禽,第三个分类器用于分类涉水鸟和非涉水鸟......,组合多个分类器的结果,可以知道最终分类结果
-
MvM 的正、反类构造必须有特殊的设计,不能随意选取。而我们最常用的 MvM 技术是:“纠错输出码”(Error Correcting Output Codes, 简称 ECOC)。
-
ECOC是将编码的思想引入类别拆分,并尽可能在解码过程中具有容错性。ECOC 工作过程:
-
设计编码方案:创建一个码本,其中每一行代表一个类别的二元编码,每一列代表一个二分类问题。确保码本中任意两行(即任意两个类别的编码)之间的汉明距离尽可能大,以增强错误纠正能力。
-
训练二分类器:对于码本中的每一列(即每一个二分类问题),训练一个二分类器
-
编码训练数据:使用码本对训练数据集中的每个类别进行编码,生成二元特征向量。
-
预测新样本:
-
对于一个新的测试样本,使用每个二分类器进行预测,得到一个二元预测向量。
-
将预测向量与码本中的编码进行比较,找到最匹配的编码(距离最小的)对应的类别作为预测结果。
-
-
解码:将预测得到的二元向量解码为类别标签。
二元码将每个类别分别指定为正类和反类,如下面的图解所示:
三元码在正、反类之外,还可指定“停用类”(表示为0)。如下所示:
为什么称为“纠错输出码”呢?这是因为在测试阶段,ECOC编码对分类器的错误有一定的容忍和修正能力。例如二元码图中对测试示例的正确预测编码是(−1,+1,+1,−1,+1),假设在预测时某个分类器出错了,例如f2出错从而导致了错误编码(−1,−1,+1,−1,+1),但基于这个编码仍能产生正确的最终分类结果C3。
-
ECOC通过将多类问题转化为多个二分类问题来实现分类。编码长度与纠错能力成正比,编码越长,纠错能力越强,但这会导致需要训练更多的分类器,从而增加计算和存储开销。对于有限类别数,可能的编码组合是有限的,过长的编码没有实际意义。
对于相同长度的编码,理论上编码距离越大,纠错能力越强。在编码长度较短时,可以计算出理论上的最优编码。然而,随着编码长度的增加,确定最优编码变得困难,因为这实际上是一个NP难问题。
尽管如此,实践中并不总是需要理论最优编码,因为非最优编码往往已经能够产生足够好的分类器。此外,编码的理论性质好并不一定意味着分类性能好,因为机器学习问题涉及许多因素。例如,在将多个类别拆分为两个“类别子集”时,不同的拆分方式会导致不同的区分难度,进而影响二分类问题的难度。因此,一个理论纠错性质很好但导致较难二分类问题的编码,与一个理论纠错性质稍差但导致较简单二分类问题的编码相比,最终的模型性能优劣难以确定。
-
-
3.6 类别不平衡问题
我们之前在做讨论时都有一个共同的基本假设,即不同类别的训练样例数目相当。如果不同类别的训练样例数目稍有差别,通常影响不大,但若差别很大,则会对学习过程造成困扰。例如有998个反例,但正例只有2个,那么学习方法只需返回一个永远将新样本预测为反例的学习器,就能达到99.8%的精度;然而这样的学习器往往没有价值,因为它不能预测出任何正例。
类别不平衡(class-imbalance)就是指分类任务中不同类别的训练样例数目差别很大的情况。
应对类别不平衡,现有技术大体上有三类做法:
- 第一类是直接对训练集里的反类样例进行“欠采样”(undersampling),即去除一些反例使得正、反例数目接近,然后再进行学习;
- 第二类是对训练集里的正类样例进行“过采样”(oversampling),即增加一些正例使得正、反例数目接近,然后再进行学习;
- 第三类则是直接基于原始训练集进行学习,但在用训练好的分类器进行预测时,更改分类模型的阈值,将新的判断标准嵌入到其决策过程中,称为“阈值移动”(threshold-moving)。
比较 :
- 欠采样法的时间开销通常远小于过采样法,因为前者丢弃了很多反例,使得分类器训练集远小于初始训练集,而过采样法增加了很多正例,其训练集大于初始训练集。需注意的是,过采样法不能简单地对初始正例样本进行重复采样,否则会招致严重的过拟合;过采样法的代表性算法SMOTE是通过对训练集里的正例进行插值来产生额外的正例。
- 欠采样法若随机丢弃反例,可能丢失一些重要信息;欠采样法的代表性算法EasyEnsemble则是利用集成学习机制,将反例划分为若干个集合供不同学习器使用,这样对每个学习器来看都进行了欠采样,但在全局来看却不会丢失重要信息。
-
接下来我们来看看阈值移动法:
首先我们来理解一下线性模型的数学原理,在我们用对新样本x进行分类时,事实上是在用预测出的y值与一个阈值进行比较,例如通常在y>0.5时判别为正例,否则为反例。由此可见y实际上表达了正例的可能性。而几率
则反映了正例可能性与反例可能性之比值,若
,则预测为正例;若
,则预测为负例。
上述讨论是站在数据集中正负样本数目一样的情况下,然而,当训练集中正、反例的数目不同时,直接使用上式进行分类可能会导致偏差。
我们令表示正例数目,
表示反例数目,则观测几率是
,由于我们通常假设训练集是真实样本总体的无偏采样,因此可以认为观测几率就代表了真实几率,即正负例的分界线是
。于是,只要分类器的预测几率高于观测几率就应判定为正例,即
,否则为负例。
但是,我们的分类器是基于式进行决策,我们需对其预测值进行调整,只需令
,然后使用
判断,这样就可以兼容现有的模型,无需做太大更改。上述就是类别不平衡学习的一个基本策略——“再缩放”(rescaling),也即“阈值移动”。
然而再缩放的实际实现却并不容易,主要因为“训练集是真实样本总体的无偏采样”这个假设往往并不成立,也就是说,我们未必能有效地基于训练集观测几率来推断出真实几率。
-
值得一提的是,“再缩放”也是“代价敏感学习”(cost-sensitive learning)的基础。在代价敏感学习中将式中的
用
代替即可,其中
是将正例误分为反例的代价,
是将反例误分为正例的代价。
-
-
亲爱的朋友们,非常感谢您抽出宝贵的时间阅读我的博客。在这里,我分享了一些自己学习的点滴。如果您在阅读过程中有所收获,或者觉得这些内容引起了您的共鸣,希望能得到您的一次点赞,这对我来说是莫大的鼓励。同时,如果您对我的分享感兴趣,不妨关注一下我的博客,这样就能及时收到我的更新通知,不错过更多有趣的内容。另外,如果这些文章对您有帮助,也可以收藏起来,方便日后查阅。您的支持是我不断前行的动力,再次感谢您的陪伴!