【机器学习】《机器学习》周志华西瓜书 笔记/习题答案 总目录
——————————————————————————————————————————————————————
给定一个由d个属性描述的实例 x = ( x 1 ; x 2 ; . . . ; x d ) \mathbf{x} = (x_1;x_2;...;x_d) x=(x1;x2;...;xd),其中 x i x_i xi是 x \mathbf{x} x在第 i i i个属性上的取值,线性模型(linear model) 的原理是试图学得一个通过属性的线性组合来进行预测的函数,也即:
f ( x ) = w 1 x 1 + w 2 x 2 + . . . + w d x x + b f(\mathbf{x}) = w_1x_1 + w_2x_2 + ... + w_dx_x + b f(x)=w1x1+w2x2+...+wdxx+b
一般用向量形式写成:
f ( x ) = w T x + b f(\mathbf{x}) = \mathbf{w}^T\mathbf{x} + b f(x)=wTx+b
其中 w = ( w 1 ; w 2 ; . . . ; w d ) \mathbf{w} = (w_1;w_2;...;w_d) w=(w1;w2;...;wd),权重向量 w \mathbf{w} w 和偏置项 b b b 就是我们需要学习的参数,学得之后,模型就可以确定了。
线性模型具有良好的可解释性(comprehensibility),每个属性对应的权重可以理解为它对预测的重要性,并且建模较为简单,许多功能更为强大的非线性模型(nonlinear model)都是在线性模型的基础上引入层级结构或高维映射得到的。
这一章的内容大致如下:
线性回归:如何把离散属性连续化?怎样用最小二乘法进行参数估计?多元线性回归如何求解?广义线性模型是怎样的?。
对数几率回归:分类任务和线性回归是如何关联起来的?从概率的角度来看,如何用极大似然法进行参数估计并获取最优解?
线性判别分析:二分类任务如何求得LDA模型的参数?如何推广到多分类任务?
多分类学习:如何把多分类任务拆分为二分类任务?有哪些拆分策略?是如何进行建模和预测的?
类别不平衡问题:再缩放思想以及三种解决类别不平衡问题的主要方法。
由于不同模型对数据的要求不一样,在建模之前,我们需要对数据做相应的处理。一般的线性回归模型要求属性的数据类型为连续值,故需要对离散属性进行连续化。
具体分两种情况:
属性值之间有序:也即属性值有明确的大小关系,比方说把二值属性“身高”的取值 {高,矮} 可转化为 {1.0,0.0},三值属性 “高度”的取值 {高,中,低} 转换(编码)为 {1.0,0.5,0.0};
属性值之间无序:若该属性有 k k k 个属性值,则通常把它转换为 k k k 维向量(把1个属性扩展为k个属性),比方说把无序离散属性 “商品” 的取值 {牙膏,牙刷,毛巾} 转换为 (0,0,1),(0,1,0),(1,0,0)。 这种做法在 自然语言处理 和 推荐系统 实现中很常见,属性 “单词” 和 “商品” 都是无序离散变量,在建模前往往需要把这样的变量转换为哑变量,否则会引入不恰当的序关系,从而影响后续处理(比如距离的计算)。
补充:对应于离散属性连续化,自然也有 连续属性离散化,比方说决策树建模就需要将连续属性离散化。此外,在作图观察数据分布特征时,往往也需要对连续属性进行离散化处理(比方说画直方图)。
回归任务最常用的性能度量是 均方误差(mean squared error, MSE),亦称 平方损失(square loss)。首先介绍 单变量线性回归,试想我们要在二维平面上拟合一条曲线,则每个样例(即每个点)只包含一个实值属性(x值)和一个实值输出标记(y值),此时均方误差可定义为:
E ( f ; D ) = 1 m ∑ i = 1 m ( y i − f ( x i ) ) 2 = 1 m ∑ i = 1 m ( y i − w x i − b ) 2 E(f;D) = \frac{1}{m} \sum_{i=1}^m(y_i-f(x_i))^2\\ \qquad\qquad = \frac{1}{m} \sum_{i=1}^m(y_i-wx_i-b)^2 E(f;D)=m1i=1∑m(yi−f(xi))2=m1i=1∑m(yi−wxi−b)2
有时我们会把这样描述模型总误差的式子称为 损失函数 或者 目标函数(当该式是优化目标的时候)。这个函数的自变量是模型的参数 w w w 和 b b b。由于给定训练集时,样本数 m m m 是一个确定值,也即常数,所以可以把 1 m \frac{1}{m} m1 这一项拿走。
最小二乘法(least square method) 就是基于均方误差最小化来进行模型求解的一种方法,寻找可使损失函数值最小的参数 w w w 和 b b b 的过程称为最小二乘 参数估计(parameter estimation)。在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。
通过对损失函数分别求参数 w w w 和 b b b 的偏导,并且令导数为0,可以得到这两个参数的 闭式(closed-form)解(也即解析解):
w = ∑ i = 1 m y i ( x i − x ˉ ) ∑ i = 1 m x i 2 − 1 m ( ∑ i = 1 m x i ) 2 w = \frac{\sum_{i=1}^m y_i(x_i - \bar{x})}{\sum_{i=1}^m x_i^2 - \frac{1}{m}(\sum_{i=1}^m x_i)^2} w=∑i=1mxi2−m1(∑i=1mxi)2∑i=1myi(xi−xˉ)
b = 1 m ∑ i = 1 m ( y i − w x i ) b = \frac{1}{m} \sum_{i=1}^m (y_i-wx_i) b=m1i=1∑m(yi−wxi)
在实际任务中,只要我们把自变量(x, y, m)的值代入就可以求出数值解了。
为什么可以这样求解呢?
因为损失函数是一个 凸函数(记住是向下凸,类似U型曲线),导数为0表示该函数曲线最低的一点,此时对应的参数值就是能使均方误差最小的参数值。特别地,要判断一个函数是否凸函数,可以求其二阶导数,若二阶导数在区间上非负则称其为凸函数,若在区间上恒大于零则称其为 严格凸函数。
前面是直线拟合,样例只有一个属性。对于样例包含多个属性的情况,我们就要用到 多元线性回归(multivariate linear regression)(又称作多变量线性回归)了。
令 w ^ = ( w ; b ) \mathbf{\hat{w}} = (\mathbf{w};b) w^=(w;b),把数据集表示为 m × ( d + 1 ) m \times (d+1) m×(d+1) 大小的矩阵 X X X,每一行对应一个样例,前 d d d 列是样例的 d d d 个属性,最后一列恒置为1,对应偏置项。把样例的实值标记也写作向量形式,记作 y \mathbf{y} y。则此时损失函数为:
E w ^ = ( y − X w ^ ) T ( y − X w ^ ) E_{\mathbf{\hat{w}}} = (\mathbf{y} - X\mathbf{\hat{w}})^T (\mathbf{y} - X\mathbf{\hat{w}}) Ew^=(y−Xw^)T(y−Xw^)
同样使用最小二乘法进行参数估计,首先对 w ^ \mathbf{\hat{w}} w^ 求导:
∂ E w ^ ∂ w ^ = 2 X T ( X w ^ − y ) \frac{\partial E_{\mathbf{\hat{w}}}}{\partial \mathbf{\hat{w}}} = 2 X^T(X\mathbf{\hat{w}} - \mathbf{y}) ∂w^∂Ew^=2XT(Xw^−y)
令该式值为0可得到 w ^ \mathbf{\hat{w}} w^ 的闭式解:
w ^ ∗ = ( X T X ) − 1 X T y \mathbf{\hat{w}}* = (X^TX)^{-1}X^T\mathbf{y} w^∗=(XTX)−1XTy
这就要求 X T X X^TX XTX 必须是可逆矩阵,也即必须是满秩矩阵(full-rank matrix) 或者是 正定矩阵(positive definite matrix),这是线性代数方面的知识,书中并未展开讨论。但是!现实任务中 X T X X^TX XTX 往往不是满秩的,很多时候 X X X 的列数很多,甚至超出行数(例如 推荐系统,商品数是远远超出用户数的),此时 X T X X^TX XTX 显然不满秩,会解出多个 w ^ \mathbf{\hat{w}} w^。这些解都能使得均方误差最小化,选择哪一个解作为输出,这时就需要由学习算法的归纳偏好决定了,常见的做法是引入 正则化(regularization) 项。
除了直接让模型预测值逼近实值标记 y y y,我们还可以让它逼近 y y y 的衍生物,这就是 广义线性模型(generalized linear model) 的思想,也即:
y = g − 1 ( w T x + b ) y = g^{-1}(\mathbf{w^Tx} + b) y=g−1(wTx+b)
其中 g ( ⋅ ) g(\cdot) g(⋅) 称为 联系函数(link function),要求单调可微。使用广义线性模型我们可以实现强大的 非线性函数映射 功能。比方说 对数线性回归(log-linear regression),令 g ( ⋅ ) = l n ( ⋅ ) g(\cdot) = ln(\cdot) g(⋅)=ln(⋅),此时模型预测值对应的是实值标记在指数尺度上的变化:
前面说的是线性模型在回归学习方面的应用,这节开始就是讨论分类学习了。
线性模型的输出是一个实值,而分类任务的标记是离散值,怎么把这两者联系起来呢?
其实广义线性模型已经给了我们答案,我们要做的就是 找到一个单调可微的联系函数,把两者联系起来。
对于一个二分类任务,比较理想的联系函数是 单位阶跃函数(unit-step function):
y = { 0 z<0; 0.5 z=0; 1 z>0, y = \begin{cases} 0& \text{z<0;}\\ 0.5& \text{z=0;}\\ 1& \text{z>0,} \end{cases} y=⎩⎪⎨⎪⎧00.51z<0;z=0;z>0,
但是单位阶跃函数不连续,所以不能直接用作联系函数。这时思路转换为 如何在一定程度上近似单位阶跃函数 呢?对数几率函数(logistic function) 正是我们所需要的常用的替代函数(注意这里的 y y y 依然是实值):
对数几率函数有时也称为对率函数,是一种 Sigmoid函数(即形似S的函数)。将它作为 g − ( ⋅ ) g^-(\cdot) g−(⋅) 代入广义线性模型可得:
y = 1 1 + e − ( w T x + b ) y = \frac{1}{1+ e^{-(\mathbf{w^Tx} + b)}} y=1+e−(wTx+b)1
该式可以改写为:
ln y 1 − y = w T x + b \ln{\frac{y}{1-y}} = \mathbf{w^Tx} + b ln1−yy=wTx+b
其中, y 1 − y \frac{y}{1-y} 1−yy 称作 几率(odds),我们可以把 y y y 理解为该样本是正例的概率,把 1 − y 1-y 1−y 理解为该样本是反例的概率,而几率表示的就是 该样本作为正例的相对可能性。若几率大于1,则表明该样本更可能是正例。对几率取对数就得到 对数几率(log odds,也称为logit)。几率大于1时,对数几率是正数。
由此可以看出,对数几率回归的实质使用线性回归模型的预测值逼近分类任务真实标记的对数几率。
它有几个优点:
有了预测函数之后,我们需要关心的就是怎样求取模型参数了。这里介绍一种与最小二乘法异曲同工的办法,叫做极大似然法(maximum likelihood method)。
前面说到可以把 y y y 理解为一个样本是正例的概率,把 1 − y 1-y 1−y 理解为一个样本是反例的概率。而所谓极大似然,就是最大化预测事件发生的概率,也即 最大化所有样本的预测概率之积。令 p ( c = 1 ∣ x ) p(c=1|\mathbf{x}) p(c=1∣x) 和 p ( c = 0 ∣ x ) p(c=0|\mathbf{x}) p(c=0∣x) 分别代表 y y y 和 1 − y 1-y 1−y。(注:书中写的是 y = 1 y=1 y=1 和 y = 0 y=0 y=0,这里为了和前面的 y y y 区别开来,我用了 c c c 来代表标记)。
简单变换一下公式,可以得到:
但是!由于预测概率都是小于1的,如果直接对所有样本的预测概率求积,所得的数会非常非常小,当样例数较多时,会超出精度限制。所以,一般来说会对概率去对数,得到 对数似然(log-likelihood),此时 求所有样本的预测概率之积就变成了求所有样本的对数似然之和。对率回归模型的目标就是最大化对数似然,对应的似然函数是:
可以理解为若标记为正例,则加上预测为正例的概率,否则加上预测为反例的概率。其中 β = ( w ; b ) \beta = (\mathbf{w};b) β=(w;b)。
对该式求导,令导数为0可以求出参数的最优解。特别地,我们会发现似然函数的导数和损失函数是等价的,所以说 最大似然解等价于最小二乘解。最大化似然函数等价于最小化损失函数:
l ( β ) = ∑ i = 1 m ( − y i β T x i ^ + ln ( 1 + e β T x i ^ ) ) l(\beta) = \sum_{i=1}^m (-y_i\beta^T\hat{x_i} + \ln (1+e^{\beta^T\mathbf{\hat{x_i}}})) l(β)=i=1∑m(−yiβTxi^+ln(1+eβTxi^))
这是一个关于 β \beta β 的高阶可导连续凸函数,可以用最小二乘求(要求矩阵的逆,计算开销较大),也可以用数值优化算法如 梯度下降法(gradient descent method)、牛顿法(Newton method) 等逐步迭代来求最优解(可能陷入局部最优解)。
线性判别分析(Linear Discriminant Analysis,简称LDA),同样是利用线性模型,LDA提供一种不同的思路。在LDA中,我们不再是拟合数据分布的曲线,而是 将所有的数据点投影到一条直线上,使得 同类点的投影尽可能近,不同类点的投影尽可能远。二分类LDA最早有Fisher提出,因此也称为 Fisher判别分析。
具体来说,投影值 y = w T x y = \mathbf{w}^T\mathbf{x} y=wTx,我们不再用 y y y 逼近样例的真实标记,而是希望同类样例的投影值尽可能相近,异类样例的投影值尽可能远离。
如何实现呢?
J = ∥ w T μ 0 − w T μ 1 ∥ 2 2 w T Σ 0 w + w T Σ 1 w = w T ( μ 0 − μ 1 ) ( μ 0 − μ 1 ) T w w T ( Σ 0 + Σ 1 ) w J = \frac{\Vert \mathbf{w}^T\mu_0 - \mathbf{w}^T\mu_1 \Vert^2_2}{\mathbf{w}^T\Sigma_0\mathbf{w}+\mathbf{w}^T\Sigma_1\mathbf{w}}\\ = \frac{\mathbf{w}^T(\mu_0 - \mu_1)(\mu_0 - \mu_1)^T\mathbf{w}}{\mathbf{w}^T(\Sigma_0+\Sigma_1)\mathbf{w}} J=wTΣ0w+wTΣ1w∥wTμ0−wTμ1∥22=wT(Σ0+Σ1)wwT(μ0−μ1)(μ0−μ1)Tw
其中,分子的 μ i \mu_i μi 表示第i类样例的均值向量(即表示为向量形式后对各维求均值所得的向量)。分子表示的是两类样例的均值向量投影点(也即类中心)之差的 ℓ 2 \ell_2 ℓ2 范数的平方,这个值越大越好。 分母中的 Σ i \Sigma_i Σi 表示第i类样例的协方差矩阵。分母表示两类样例投影后的协方差之和,这个值越小越好。
定义类内散度矩阵(within-class scatter matrix):
定义类间散度矩阵(between-class scatter matrix):
这两个矩阵的规模都是 d × d d\times d d×d,其中 d d d 是样例的维度(属性数目)。于是可以重写目标函数为:
也即 S b S_b Sb 和 S w S_w Sw 的广义瑞利熵(generalized Rayleigh quotient)。
可以注意到,分子和分母中 w w w 都是二次项,因此,最优解与 w w w 的大小无关,只与方向有关。令分母为1,用拉格朗日乘子法把约束转换为方程,再稍加变换我们便可以得出:
w = S w − 1 ( μ 0 − μ 1 ) \mathbf{w} = S_w^{-1}(\mu_0 - \mu_1) w=Sw−1(μ0−μ1)
但一般不直接对矩阵 S w S_w Sw 求逆,而是采用奇异值分解的方式。
从而分类问题转化为最优化求解w的问题,当求解出w后,对新的样本进行分类时,只需将该样本点投影到这条直线上,根据与各个类别的中心值进行比较,从而判定出新样本与哪个类别距离最近。
求解w的方法如下所示,使用的方法为λ乘子。
多分类LDA与二分类不同在于,学习的是一个规模为 d × d ′ d \times d' d×d′ 的投影矩阵 W \mathbf{W} W,而不是规模为 d × 1 d \times 1 d×1 的投影向量 w \mathbf{w} w。这个投影矩阵把样本投影到 d ′ d' d′ 维空间(或者说 d ′ d' d′ 维超平面)上,由于 d ′ d' d′ 通常远小于样例原来的属性数目 d d d,且投影过程用到了类别信息(标记值),所以LDA也常常被视为一种监督降维技术。(注: d ′ d' d′ 最大可取为类别数-1)
现实中我们经常遇到不只两个类别的分类问题,即多分类问题,在这种情形下,我们常常运用“拆分”的策略,基于一些策略,把多分类任务分解为多个二分类任务,通过多个二分类学习器来解决多分类问题,即将多分类问题拆解为多个二分类问题,训练出多个二分类学习器,最后将多个分类结果进行集成得出结论。最为经典的拆分策略有三种:“一对一”(OvO)、“一对其余”(OvR)和“多对多”(MvM)。
一对一(One vs. One,简称OvO) 的意思是把所有类别两两配对。假设给定数据集D,其中有N个真实类别,OvO会进行两两配对(一个正类/一个反类),从而产生 N ( N − 1 ) 2 \frac{N(N-1)}{2} 2N(N−1) 个二分类学习器。在测试阶段时,将新样本放入所有的二分类学习器中测试,产生 N ( N − 1 ) 2 \frac{N(N-1)}{2} 2N(N−1) 个分类结果,最终预测的标记由投票产生,也即把被预测得最多的类别作为该样本的类别。
一对其余(One vs. Rest,简称OvR) 在有的文献中也称为 一对所有(One vs. All,简称OvA),但这种说法并不严谨。因为OvR产生 N N N 个子任务,每个任务都使用完整数据集,把一个类的样例当作正例,其他类的样例当作反例,所以应该是一对其余而非一对所有。
OvR产生 N N N 个二分类模型,在测试阶段时,新样本输入到这些模型,产生 N N N 个分类结果,若只有一个模型预测为正例,则对应的类别就是该样本的类别;若有多个模型预测为正例,则选择置信度最大的类别(参考模型评估与选择中的比较检验)。
OvO和OvR各有优劣:
测试性能取决于具体的数据分布,大多情况下这两个拆分策略都差不多。
多对多(Many vs. Many,简称MvM) 是每次将多个类作为正例,其他的多个类作为反例。OvO和OvR都是MvM的特例。书中介绍的是一种比较常用的MvM技术—— 纠错输出码(Error Correcting Outputs Codes,简称ECOC)。
MvM的正反例划分不是任意的,必须有特殊的构造,否则组合起来时可能就无法定位到预测为哪一类了。ECOC的工作过程分两步:
编码:对应于训练。假设有N个类别,计划做M次划分,每次划分把一部分类别划为正类,一部分类别划分为反类,最终训练出M个模型。而每个类别在M次划分中,被划为正类则记作+1,被划为负类则记作-1,于是可以表示为一个M维的编码。
解码:对应于预测。把新样本输入M个模型,所得的M个预测结果组成一个预测编码。把这个预测编码和各个类别的编码进行比较,跟哪个类别的编码距离最近就预测为哪个类别。
类别划分由 编码矩阵(coding matrix) 指定,编码矩阵有多重形式,常见的有二元码(正类为+1,负类为-1)和三元码(多出了停用类,用0表示,因为有停用类的存在,训练时可以不必使用全部类别的样例)。举个三元码的例子:
f1 ↓ \downarrow ↓ |
f2 ↓ \downarrow ↓ |
f3 ↓ \downarrow ↓ |
f4 ↓ \downarrow ↓ |
f5 ↓ \downarrow ↓ |
海明距离 ↓ \downarrow ↓ |
欧氏距离 ↓ \downarrow ↓ |
|
---|---|---|---|---|---|---|---|
C 1 → C_1\rightarrow C1→ | -1 | +1 | -1 | +1 | +1 | 4 | 4 |
C 2 → C_2\rightarrow C2→ | +1 | -1 | -1 | +1 | -1 | 2 | 2 |
C 3 → C_3\rightarrow C3→ | -1 | +1 | +1 | -1 | +1 | 5 | 2 5 \sqrt{5} 5 |
C 4 → C_4\rightarrow C4→ | -1 | -1 | +1 | +1 | -1 | 3 | 10 \sqrt{10} 10 |
测试样本 → \rightarrow → | -1 | -1 | +1 | -1 | +1 | - | - |
这里一共有4个类别,对应每一行。计划做5次划分,得到f1至f5共五个二分类器,对应每一列。可以看到每一个类别有一个5位的编码表示。测试时,把新样本输入到5个模型,得到预测编码。然后计算这个预测编码和每个类别编码的距离。这里举了海明距离(不同的位数的数目)和欧氏距离作为例子。可以看到测试样本与类别2的距离最近,因此预测该样本为类别2。
特别地,为什么称这种方法为 纠错 输出码呢?因为 ECOC编码对分类器的错误有一定的容忍和修正能力。即使预测时某个分类器预测成了错误的编码,在解码时仍然有机会产生正确的最终结果。具体来说,对同一个学习任务,编码越长,纠错能力越强,但是相应地也需要训练更多分类器,增大了计算和存储的开销。
对同等长度的编码来说,理论上 任意两个类别之间的编码距离越远,纠错能力越强。但实际任务中我们一般不需要获取最优编码,一方面非最优编码已经能产生不错的效果;另一方面,即使获得理论上最优的编码,实际性能也不一定最好。因为机器学习还涉及其他一些方面,在划分多个类时产生的新问题难度往往也不同,有可能理论最优的编码产生的类别子集难以区分,问题难度更大,从而使得性能下降。
类别不平衡(class-imbalance) 问题非常普遍,比方说推荐系统中用户购买的商品(通常视作正例)和用户未购买的商品(通常视作反例)比例是极为悬殊的。如果直接用类别不平衡问题很严重的数据集进行训练,所得模型会严重偏向所占比例较大的类别。本节默认正类样例较少,负类样例较多。
这里主要介绍三种做法:
欠采样(undersampling) 针对的是负类,也即移取训练集的部分反例,使得正类和负类的样例数目相当。由于丢掉了大量反例,所以 时间开销也大大减少。但是带来一个问题就是,随机丢弃反例可能会丢失一些重要信息。书中提到一种解决方法是利用 集成学习机制,将反例划分为多个集合,用于训练不同的模型,从而使得 对每个模型来说都进行了欠采样,但全局上并无丢失重要信息。
过采样(oversampling) 针对的是正类,也即增加训练集的正例,使得正类和负类的样例数目相当。过采样的时间开销会增大很多,因为需要引入很多正例。注意!过采样 不能简单地通过重复正例来增加正例的比例,这样会引起严重的过拟合问题。一种较为常见的做法是对已有正例进行 插值 来产生新的正例。
阈值移动(threshold-moving) 利用的是 再缩放 思想。回想前面对数几率回归中,几率 y 1 − y \frac{y}{1-y} 1−yy 表示正例的相对可能性,我们默认以1作为阈值,其实是假设了样本的真实分布为正例反例各一半。但这可能不是真相,假设我们有一个存在类别不平衡问题的训练集,正例数目为 m + m^+ m+,反例数目为 m − m^- m−,可以重定义:
这就是 再缩放(rescaling)。当几率大于 m + m − \frac{m^+}{m^-} m−m+ 时就预测为正例。但必须注意,这种思想是 基于观测几率近似真实几率这一假设 的,现实任务中这一点未必成立。