给定一个包含d个属性的实例
一般写作向量形式:$f(\mathbf{x}) = \mathbf{w}^T\mathbf{x} + b$。其中权重向量
线性模型有良好的可解释性,每个属性对应的权重可以理解为它对预测的重要性。并且建模较为简单,许多功能更为强大的非线性模型都是在线性模型的基础上引入层级结构或高维映射得到的。
这一章的内容大致如下:
-
线性回归:如何把离散属性连续化?怎样用最小二乘法进行参数估计?多元线性回归如何求解?广义线性模型是怎样的?。
-
对数几率回归:分类任务和线性回归是如何关联起来的?从概率的角度来看,如何用极大似然法进行参数估计并获取最优解?
-
线性判别分析:二分类任务如何求得LDA模型的参数?如何推广到多分类任务?
-
多分类学习:如何把多分类任务拆分为二分类任务?有哪些拆分策略?是如何进行建模和预测的?
-
类别不平衡问题:再缩放思想以及三种解决类别不平衡问题的主要方法。
由于不同模型对数据的要求不一样,在建模之前,我们需要对数据做相应的处理。一般的线性回归模型要求属性的数据类型为连续值,故需要对离散属性进行连续化。
具体分两种情况:
-
属性值之间有序:也即属性值有明确的大小关系,比方说把三值属性 “高度” 的取值 {高,中,低} 转换(编码)为 {1.0,0.5,0.0};
-
属性值之间无序:若该属性有
$k$ 个属性值,则把它转换为$k$ 维向量(把1个属性扩展为k个属性),比方说把无序离散属性 “商品” 的取值 {牙膏,牙刷,毛巾} 转换为 (0,0,1),(0,1,0),(1,0,0)。 这种做法在自然语言处理和推荐系统实现中很常见,属性 “单词” 和 “商品” 都是无序离散变量,在建模前往往需要把这样的变量转换为哑变量,否则会引入不恰当的序关系,从而影响后续处理(比如距离的计算)。
补充:对应于离散属性连续化,自然也有连续属性离散化。比方说决策树建模就需要将连续属性离散化。此外,在作图观察数据分布特征时,往往也需要对连续属性进行离散化处理(比方说画直方图)。
回归任务最常用的性能度量是均方误差(mean squared error, MSE)。首先介绍单变量线性回归,试想我们要在二维平面上拟合一条曲线,则每个样例(即每个点)只包含一个实值属性(x值)和一个实值输出标记(y值),此时均方误差可定义为:
有时我们会把这样描述模型总误差的式子称为损失函数或者目标函数(当该式是优化目标的时候)。这个函数的自变量是模型的参数
最小二乘法(least square method)就是基于均方误差最小化来进行模型求解的一种方法,寻找可使损失函数值最小的参数
通过对损失函数分别求参数
在实际任务中,只要我们把自变量(x, y, m)的值代入就可以求出数值解了。
为什么可以这样求解呢?因为损失函数是一个凸函数(记住是向下凸,类似U型曲线),导数为0表示该函数曲线最低的一点,此时对应的参数值就是能使均方误差最小的参数值。特别地,要判断一个函数是否凸函数,可以求其二阶导数,若二阶导数在区间上非负则称其为凸函数,若在区间上恒大于零则称其为严格凸函数。
前面是直线拟合,样例只有一个属性。对于样例包含多个属性的情况,我们就要用到多元线性回归(multivariate linear regression)(又称作多变量线性回归)了。
令
同样使用最小二乘法进行参数估计,首先对
令该式值为0可得到
这就要求
除了直接让模型预测值逼近实值标记
其中
前面说的是线性模型在回归学习方面的应用,这节开始就是讨论分类学习了。
线性模型的输出是一个实值,而分类任务的标记是离散值,怎么把这两者联系起来呢?其实广义线性模型已经给了我们答案,我们要做的就是找到一个单调可微的联系函数,把两者联系起来。
对于一个二分类任务,比较理想的联系函数是单位阶跃函数(unit-step function):
但是单位阶跃函数不连续,所以不能直接用作联系函数。这时思路转换为如何近似单位阶跃函数呢?**对数几率函数(logistic function)**正是我们所需要的(注意这里的
对数几率函数有时也称为对率函数,是一种Sigmoid函数(即形似S的函数)。将它作为
该式可以改写为:
其中,$\frac{y}{1-y}$ 称作几率(odds),我们可以把
由此可以看出,对数几率回归的实质使用线性回归模型的预测值逼近分类任务真实标记的对数几率。它有几个优点:
- 直接对分类的概率建模,无需实现假设数据分布,从而避免了假设分布不准确带来的问题;
- 不仅可预测出类别,还能得到该预测的概率,这对一些利用概率辅助决策的任务很有用;
- 对数几率函数是任意阶可导的凸函数,有许多数值优化算法都可以求出最优解。
有了预测函数之后,我们需要关心的就是怎样求取模型参数了。这里介绍一种与最小二乘法异曲同工的办法,叫做极大似然法(maximum likelihood method)。我在另一个项目中有这方面比较详细的讲解,欢迎前往项目主页交流学习。
前面说道可以把
但是!由于预测概率都是小于1的,如果直接对所有样本的预测概率求积,所得的数会非常非常小,当样例数较多时,会超出精度限制。所以,一般来说会对概率去对数,得到对数似然(log-likelihood),此时求所有样本的预测概率之积就变成了求所有样本的对数似然之和。对率回归模型的目标就是最大化对数似然,对应的似然函数是:
可以理解为若标记为正例,则加上预测为正例的概率,否则加上预测为反例的概率。其中
对该式求导,令导数为0可以求出参数的最优解。特别地,我们会发现似然函数的导数和损失函数是等价的,所以说最大似然解等价于最小二乘解。最大化似然函数等价于最小化损失函数:
这是一个关于
线性判别分析(Linear Discriminant Analysis,简称LDA),同样是利用线性模型,LDA提供一种不同的思路。在LDA中,我们不再是拟合数据分布的曲线,而是将所有的数据点投影到一条直线上,使得同类点的投影尽可能近,不同类点的投影尽可能远。二分类LDA最早有Fisher提出,因此也称为Fisher判别分析。
具体来说,投影值
其中,分子的
定义类内散度矩阵(within-class scatter matrix):
定义类间散度矩阵(between-class scatter matrix):
这两个矩阵的规模都是
也即
可以注意到,分子和分母中
令分母为1,用拉格朗日乘子法把约束转换为方程,再稍加变换我们便可以得出:
但一般不直接对矩阵
多分类LDA与二分类不同在于,学习的是一个规模为
有些二分类学习方法(如LDA)可以直接推广到多分类,但现实中我们更多地是基于一些策略,把多分类任务分解为多个二分类任务,利用二分类模型来解决问题。有三种最经典的拆分策略,分别是一对一,一对其余,和多对多。
**一对一(One vs. One,简称OvO)**的意思是把所有类别两两配对。假设样例有N个类别,OvO会产生
一对其余(One vs. Rest,简称OvR)在有的文献中也称为一对所有(One vs. All,简称OvA),但这种说法并不严谨。因为OvR产生
OvO和OvR各有优劣:OvO需要训练的分类器较多,因此OvO的存储开销和测试时间开销通常比OvR更大;OvR训练时要用到所有样例,因此OvR的训练时间开销通常比OvO更大。测试性能取决于具体的数据分布,大多情况下这两个拆分策略都差不多。
**多对多(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 |
f2 |
f3 |
f4 |
f5 |
海明距离 |
欧氏距离 |
|
---|---|---|---|---|---|---|---|
-1 | +1 | -1 | +1 | +1 | 4 | 4 | |
+1 | -1 | -1 | +1 | -1 | 2 | 2 | |
-1 | +1 | +1 | -1 | +1 | 5 | 2$\sqrt{5}$ | |
-1 | -1 | +1 | +1 | -1 | 3 | ||
测试样本$\rightarrow$ | -1 | -1 | +1 | -1 | +1 | - | - |
这里一共有4个类别,对应每一行。计划做5次划分,得到f1至f5共五个二分类器,对应每一列。可以看到每一个类别有一个5位的编码表示。测试时,把新样本输入到5个模型,得到预测编码。然后计算这个预测编码和每个类别编码的距离。这里举了海明距离(不同的位数的数目)和欧氏距离作为例子。可以看到测试样本与类别2的距离最近,因此预测该样本为类别2。
特别地,为什么称这种方法为纠错输出码呢?因为ECOC编码对分类器的错误有一定的容忍和修正能力。即使预测时某个分类器预测成了错误的编码,在解码时仍然有机会产生正确的最终结果。具体来说,对同一个学习任务,编码越长,纠错能力越强。但是相应地也需要训练更多分类器,增大了计算和存储的开销。
对同等长度的编码来说,理论上任意两个类别之间的编码距离越远,纠错能力越强。但实际任务中我们一般不需要获取最优编码,一方面非最优编码已经能产生不错的效果;另一方面,即使获得理论上最优的编码,实际性能也不一定最好。因为机器学习还涉及其他一些方面,在划分多个类时产生的新问题难度往往也不同,有可能理论最优的编码产生的类别子集难以区分,问题难度更大,从而使得性能下降。
**类别不平衡(class-imbalance)**问题非常普遍,比方说推荐系统中用户购买的商品(通常视作正例)和用户未购买的商品(通常视作反例)比例是极为悬殊的。如果直接用类别不平衡问题很严重的数据集进行训练,所得模型会严重偏向所占比例较大的类别。本节默认正类样例较少,负类样例较多。这里主要介绍三种做法:
欠采样(undersampling)针对的是负类,也即移取训练集的部分反例,使得正类和负类的样例数目相当。由于丢掉了大量反例,所以时间开销也大大减少。但是带来一个问题就是,随机丢弃反例可能会丢失一些重要信息。书中提到一种解决方法是利用集成学习机制,将反例划分为多个集合,用于训练不同的模型,从而使得对每个模型来说都进行了欠采样,但全局上并无丢失重要信息。
过采样(oversampling)针对的是正类,也即增加训练集的正例,使得正类和负类的样例数目相当。过采样的时间开销会增大很多,因为需要引入很多正例。注意!过采样不能简单地通过重复正例来增加正例的比例,这样会引起严重的过拟合问题。一种较为常见的做法是对已有正例进行插值来产生新的正例。
阈值移动(threshold-moving)利用的是再缩放思想。回想前面对数几率回归中,几率
这就是再缩放(rescaling)。当几率大于
问:试析在什么情形下,预测函数
$f(\mathbf{x}) = \mathbf{w}^T\mathbf{x} + b$ 中不必考虑偏置项$b$ 。
Quora上就有这个问题,而且解释得也不错。试想一下,拟合曲线时,如果不考虑偏置项,则只能拟合一条过原点的曲线。在多元线性回归中也同理,如果不考虑偏置项,那么拟合的超平面就只能过原点,但现实中数据点的分布并不是这样的。使用一个不依赖于属性的的偏置项能够让权重向量所描述的超平面更好地拟合数据点的分布。如果输出值的期望(均值)为0就不需要考虑偏置项了,或者说偏置项此时就等于0。
问:试证明,对于参数w,对率回归(logistics回归)的目标函数(式1)是非凸的,但其对数似然函数(式2)是凸的。
式1:$y = \frac{1}{1+ e^{-(\mathbf{w^Tx} + b)}}$
式2:$E(\beta) = \sum_{i=1}^m (-y_i\beta^T\hat{x_i} + \ln (1+e^{\beta^T\mathbf{\hat{x_i}}}))$
笔记中已经提到了,检验一个函数是否凸函数,可以看其二阶导数是否在区间上恒大于0.
目标函数(也即sigmoid函数):
显然,sigmoid的二阶导数在自变量大于0处取值小于0,所以它不是凸函数。
对数似然函数:
可以看到这个函数在区间上恒大于0(两边无限延伸),符合凸函数的要求,但我不太明白的是为什么作者把这个函数仍然称为对数似然函数,对数几率回归目标是最大化对数似然,最小化损失,私以为把这个函数称为损失函数更合适。
问:编程实现对率回归,并给出西瓜数据集3.0α上的结果
西瓜数据集3.0α:
编号 | 密度 | 含糖率 | 好瓜 |
---|---|---|---|
1 | 0.697 | 0.460 | 是 |
2 | 0.774 | 0.376 | 是 |
3 | 0.634 | 0.264 | 是 |
4 | 0.608 | 0.318 | 是 |
5 | 0.556 | 0.215 | 是 |
6 | 0.403 | 0.237 | 是 |
7 | 0.481 | 0.149 | 是 |
8 | 0.437 | 0.211 | 是 |
9 | 0.666 | 0.091 | 否 |
10 | 0.243 | 0.0267 | 否 |
11 | 0.245 | 0.057 | 否 |
12 | 0.343 | 0.099 | 否 |
13 | 0.639 | 0.161 | 否 |
14 | 0.657 | 0.198 | 否 |
15 | 0.36 | 0.37 | 否 |
16 | 0.593 | 0.042 | 否 |
17 | 0.719 | 0.103 | 否 |
把这个数据集转换为csv表格,并且注意要把标记转换为0、1,注意不是-1、+1!!逻辑回归的二分类标记必须是0、1,对应于sigmoid函数的值域。
代码实现放在了code文件下的exercise3.3.ipynb,不过Github似乎不支持ipynb的在线预览,可以下载下来用ipython notebook打开。结果如下:
用了梯度上升法来更新权值,步长0.05,最大迭代次数2000次。上图中红色为好瓜,绿色为坏瓜,圆形标记表示预测正确,叉号标记表示预测错误。可以看到有一个好瓜被预测为坏瓜,有两个坏瓜被预测为好瓜。事实上,在200次迭代后,已经基本定型了,权值并没有太大的变化。
问:选择两个UCI数据集,比较10折交叉验证法和留一法所估计出的对率回归的错误率。
在UCI数据集上可以进行下载。最近时间不多,暂且挖个坑。
问:编程实现线性判别分析,并给出西瓜数据集3.0α上的结果
最近时间不多,暂且挖个坑。
问:LDA仅在线性可分数据上能获得理想结果,试设计一个改进方法,使其能较好地用于非线性可分数据
可以利用核方法,把非线性可分数据的分布转换为线性可分,书上137页有介绍:KLDA(核线性判别分析方法)。
问:令码长为9,类别数为4,试给出海明距离意义下理论最优的EOOC二元码并证明之。
码长为9,即要产生9个分类器,因此需要9种划分方面。类别数为4,因此1V3有4种分法,2V2有6种分法,3V1同样有4种分法。书上说理论上任意两个类别之间的距离越远,纠错能力就越强。这句话可以理解为各个类别之间的距离之和越大约好。对于1个2V2分类器,4个类别的海明距离累积为4;对于3V1与1V3分类器,海明距离均为3,所以可以认为2V2的效果更好。故最优EOOC二元码由6个2V2分类器和3个3v1或1v3分类器构成。
问:EOOC编码能起到理想纠错作用的重要条件是:在每一位编码上出错的概率相当且独立。试析多分类任务经ECOC编码后产生的二类分类器满足该条件的可能性及由此产生的影响。
在每一位编码上出错的概率即指在第i个分类器上的错误率,假设每个分类器选择相同的模型与最优的参数。那么满足概率相当并且独立应该需要每个分类器的正负例比例相当,并且每个分类器划分的正负例在空间中的相对分布情况应当相近。一般情况下一般很难满足这样的条件,肯定会有错误率较高的分类器。错误率较高的分类器在较少时影响不大,但当高错误率分类器占到多数时,就会拖低整体的错误率。所以我认为在某些极端情况下,增加码长可能会降低正确率
问:使用OvR和MvM将多分类任务分解为二分类任务求解时,试述为何无需专门针对类别不平衡性进行处理。
因为OvR或者MvM在输出结果阶段,是对各个二分类器的结果进行汇总,汇总的这个过程就会消除不平衡带来的影响(因为总和总是1)
问:试推导出多分类代价敏感学习(仅考虑基于类别的误分类代价)使用“再缩放“能获得理论最优解的条件。
最近时间不多,暂且挖个坑。