给定由d个属性描述的示例 x= (x1; x2; …; xd) ,其中 xi 是 x 在第 i 个属性上的取值, 线性模型(inear model) 试图学得一个通过属性的线性组合来进行预测的函数,即:
一般用向量形式写成:
其中 w= (w1;w;…;wd). w和b学得之后,模型就得以确定.
线性模型具有良好的可解释性(comprehensibility),每个属性对应的权重可以理解为它对预测的重要性,并且建模较为简单,许多功能更为强大的非线性模型(nonlinear model)都是在线性模型的基础上引入层级结构或高维映射得到的。
本章介绍几种经典的线性模型.我们先从回归任务开始,然后讨论二分类和多分类任务.
给定数据集 D = {(x1,y1), (x2,y2))…,.(xm,ym)} ,其中 xi = (xi1;xi…;xid), yi∈R .“ 线性回归”(linear regression) 试图学得一个线性模型以尽可能准确地预测实值输出标记.
由于不同模型对数据的要求不一样,在建模之前,我们需要对数据做相应的处理。一般的线性回归模型要求属性的数据类型为连续值,故需要对离散属性进行连续化。
具体分两种情况:
属性值之间有序:也即属性值有明确的大小关系,比方说把二值属性“身高”的取值 {高,矮} 可转化为 {1.0,0.0},三值属性 “高度”的取值 {高,中,低} 转换(编码)为 {1.0,0.5,0.0};
属性值之间无序:若该属性有 k 个属性值,则通常把它转换为 k 维向量(把1个属性扩展为k个属性),比方说把无序离散属性 “商品” 的取值 {牙膏,牙刷,毛巾} 转换为 (0,0,1),(0,1,0),(1,0,0)。 这种做法在 自然语言处理 和 推荐系统 实现中很常见,属性 “单词” 和 “商品” 都是无序离散变量,在建模前往往需要把这样的变量转换为哑变量,否则会引入不恰当的序关系,从而影响后续处理(比如距离的计算 。
补充:对应于离散属性连续化,自然也有 连续属性离散化,比方说决策树建模就需要将连续属性离散化。此外,在作图观察数据分布特征时,往往也需要对连续属性进行离散化处理(比方说画直方图)。
回归任务最常用的性能度量是 均方误差(mean squared error, MSE),亦称 平方损失(square loss)。首先介绍 单变量线性回归,试想我们要在二维平面上拟合一条曲线,则每个样例(即每个点)只包含一个实值属性(x值)和一个实值输出标记(y值),此时均方误差可定义为:
有时我们会把这样描述模型总误差的式子称为 损失函数 或者 目标函数(当该式是优化目标的时候)。这个函数的自变量是模型的参数 w 和 b。由于给定训练集时,样本数 m 是一个确定值,也即常数,所以可以把 1/m这一项拿走。
最小二乘法(least square method) 就是基于均方误差最小化来进行模型求解的一种方法,寻找可使损失函数值最小的参数 w 和 b 的过程称为最小二乘 参数估计(parameter estimation)。在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。
通过对损失函数分别求参数 w 和 b 的偏导,并且令导数为0,可以得到这两个参数的 闭式(closed-form)解(也即解析解)
关于最小二乘法的详细推导过程,可以去看下面这篇文章:
前面是直线拟合,样例只有一个属性。对于样例包含多个属性的情况,我们就要用到 多元线性回归(multivariate linear regression)(又称作多变量线性回归)了。
令^w = (W; b),把数据集表示为 m * (d + 1) 大小的矩阵 X,
每一行对应一个样例,前 d 列是样例的 d 个属性,最后一列恒置为1,对应偏置项。样例的实值标记也写作向量形式,记作 y。则此时损失函数为:
这就要求 (XT)X 必须是可逆矩阵, 也即必须是 满秩矩阵(full-rank matrix) 或者是 正定矩阵(positive definite matrix),这是线性代数方面的知识,书中并未展开讨论。但是!现实任务中 (XT)X 往往不是满秩的, 很多时候 X 的列数很多,甚至超出行数(例如 推荐系统,商品数是远远超出用户数的),此时 (XT)X 显然不满秩,会解出多个 ^w。这些解都能使得均方误差最小化,选择哪一个解作为输出,这时就需要由学习算法的 归纳偏好决定了,常见的做法是引入 正则化(regularization) 项。
除了直接让模型预测值逼近实值标记 y,我们还可以让它逼近 y 的衍生物,这就是 广义线性模型(generalized linear model) 的思想,也即:
其中 g(.) 称为 联系函数(link function),要求单调可微。使用广义线性模型我们可以实现强大的 非线性函数映射 功能。比方说 对数线性回归(log-linear regression),令 g(.) = ln(.),此时模型预测值对应的是 实值标记在指数尺度上的变化:
前面说的是线性模型在回归学习方面的应用,这节开始就是讨论分类学习了。
线性模型的输出是一个实值,而分类任务的标记是离散值,怎么把这两者联系起来呢?
其实广义线性模型已经给了我们答案,我们要做的就是 找到一个单调可微的联系函数,把两者联系起来。
对于一个二分类任务,比较理想的联系函数是 单位阶跃函数(unit-step function):
但是单位阶跃函数不连续,所以不能直接用作联系函数。这时思路转换为 如何在一定程度上近似单位阶跃函数 呢?对数几率函数(logistic function) 正是我们所需要的常用的替代函数(注意这里的 y 依然是实值):
对数几率函数有时也称为对率函数,是一种 Sigmoid函数(即形似S的函数)。将它作为 g(.) 代入广义线性模型可得:
该式可以改写为:
其中,y / (1 - y) 称作 几率(odds) 我们可以把 y 理解为该样本是正例的概率,把 1−y 理解为该样本是反例的概率,而几率表示的就是 该样本作为正例的相对可能性。 若几率大于1,则表明该样本更可能是正例。对几率取对数就得到 对数几率(log odds,也称为logit)。几率大于1时,对数几率是正数。
由此可以看出,对数几率回归的实质使用线性回归模型的预测值逼近分类任务真实标记的对数几率。
它有几个优点:
有了预测函数之后,我们需要关心的就是怎样求取模型参数了。这里介绍一种与最小二乘法异曲同工的办法,叫做 极大似然法(maximum likelihood method)。
前面说到可以把 y 理解为一个样本是正例的概率,把 1 - y 理解为一个样本是反例的概率。而所谓极大似然,就是最大化预测事件发生的概率,也即 最大化所有样本的预测概率之积。 令 p(c = 1|x) 和 p(c = 0|x) 分别表示 y 和 1 - y。
简单变换一下公式,可以得到:
但是!由于预测概率都是小于1的,如果直接对所有样本的预测概率求积,所得的数会非常非常小,当样例数较多时,会超出精度限制。所以,一般来说会对概率取对数,得到 对数似然(log-likelihood),此时 求所有样本的预测概率之积就变成了求所有样本的对数似然之和。对率回归模型的目标就是最大化对数似然,对应的似然函数是:
可以理解为若标记为正例,则加上预测为正例的概率,否则加上预测为反例的概率。其中 β = (w;b)。
对该式求导,令导数为0可以求出参数的最优解。特别地,我们会发现似然函数的导数和损失函数是等价的,所以说 最大似然解等价于最小二乘解。最大化似然函数等价于最小化损失函数:
线性判别分析(Linear Discriminant Analysis, 简称LDA) 是一种经典的线性学习方法,在二分类问题上因为最早由(Fisher, 1936] 提出,亦称“Fisher 判别分析”
LDA的思想非常朴素:给定训练样例集, 设法将样例投影到一条直线上, 使得同类样例的投影点尽可能接近、异类样例的投影点尽可能远离;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别.图3.3给出了一个二维示意图.
如何实现呢?
其中,分子的 μi 表示第 i 类样例的 均值向量(即表示为向量形式后对各维求均值所得的向量)。分子表示的是两类样例的均值向量投影点(也即类中心)之差的 ℓ2 范数的平方,这个值越大越好。 分母中的 Σi 表示第 i 类样例的 协方差矩阵。 分母表示两类样例投影后的协方差之和,这个值越小越好。
定义 类内散度矩阵(within-class scatter matrix):
定义 类间散度矩阵(between-class scatter matrix):
这两个矩阵的规模都是 d×d ,其中 d 是样例的维度(属性数目)。于是可以重写目标函数为:
也即 Sb 和 Sw的 广义瑞利熵(generalized Rayleigh quotient)。
可以注意到,分子和分母中 w 都是二次项,因此,最优解与 w 的大小无关,只与方向有关。令分母为1,用拉格朗日乘子法把约束转换为方程,再稍加变换我们便可以得出:
但一般不直接对矩阵 Sw 求逆,而是采用奇异值分解的方式。
从而分类问题转化为最优化求解w的问题,当求解出w后,对新的样本进行分类时,只需将该样本点投影到这条直线上,根据与各个类别的中心值进行比较,从而判定出新样本与哪个类别距离最近。
求解w的方法如下所示,使用的方法为λ乘子。
**类别不平衡(class-imbalance) **问题非常普遍,比方说推荐系统中用户购买的商品(通常视作正例)和用户未购买的商品(通常视作反例)比例是极为悬殊的。如果直接用类别不平衡问题很严重的数据集进行训练,所得模型会严重偏向所占比例较大的类别。本节默认正类样例较少,负类样例较多。
这里主要介绍三种做法:
欠采样(undersampling) 针对的是负类,也即移取训练集的部分反例,使得正类和负类的样例数目相当。由于丢掉了大量反例,所以 时间开销也大大减少。但是带来一个问题就是,随机丢弃反例可能会丢失一些重要信息。书中提到一种解决方法是利用 集成学习机制,将反例划分为多个集合,用于训练不同的模型,从而使得 对每个模型来说都进行了欠采样,但全局上并无丢失重要信息。
过采样(oversampling) 针对的是正类,也即增加训练集的正例,使得正类和负类的样例数目相当。过采样的时间开销会增大很多, 因为需要引入很多正例。注意!过采样 不能简单地通过重复正例来增加正例的比例,这样会引起严重的过拟合问题。一种较为常见的做法是对已有正例进行 插值 来产生新的正例。
阈值移动(threshold-moving) 利用的是 再缩放 思想。回想前面对数几率回归中,几率 y / (1 - y) 表示正例的相对可能性,我们默认以1作为阈值,其实是假设了样本的真实分布为正例反例各一半。但这可能不是真相,假设我们有一个存在类别不平衡问题的训练集,正例数目为 m+, 反例数目为 m-,可以重定义:
这就是 再缩放(rescaling)。 当几率大于 m+ / m- 时就预测为正例。但必须注意,这种思想是 基于观测几率近似真实几率这一假设 的,现实任务中这一点未必成立。