第4章
回归算法
4.1 回归分析
回归分析(Regression Analysis)是估计因变量和自变量之间关系的一系列统计手段。
它有多种分类方法,例如,按照变量多少可以分为一元回归分析和多元回归分析;按照因变量的多少可以分为简单回归分析和多重回归分析;按照自变量和因变量之间的关系类型可以分为线性回归分析和非线性回归分析,等等,如图4-1所示。
图4-1 回归分析的分类
其中的线性回归,以及线性回归理论引申出的逻辑回归,都是非常经典的机器学习算法,因此,在接下来的内容中,我们将会针对它们做重点阐述。
4.2 线性回归
线性回归(Linear Regression)是监督学习中的一个经典模型。它的实现原理较为简单,因而经常被当作机器学习的入门级算法。
4.2.1 线性回归的定义
由前面的分析,我们知道线性回归可以根据变量的数量分为一元线性回归和多元线性回归。它们的定义如下。
1.一元线性回归
对应的表达式如下。
y=α0+α1x+ϕ
其中,
● y:因变量。
● α0:截距。
● α1:变量系数。
● x:自变量。
● ϕ:误差项。
2.多元线性回归
对应的表达式如下。
y=α0+α1x1+α2x2+…+αkxk+ϕ
其中:
● y:因变量。
● α0:截距。
● α1、α2、…、αk:各变量系数。
● x1、x2、…、xk:自变量。
● ϕ:误差项。
从上述公式可以看出,不管是一元回归还是多元回归,它们相对而言都比较简单。
4.2.2 线性回归的损失函数
假设有数据集:
D={(x1,y1),(x2,y2),(x3,y3),(x4,y4),…,(xn,yn)}
那么线性回归的训练目标在于学得一个可以尽可能准确地预测出实值的模型,或者换句话说,就是让预测值和实际值的误差尽可能小——协助完成这个任务的是损失函数。
线性回归有多种损失函数,包括但不限于:
(1)平均绝对误差(Mean Absolute Error,MAE)。平均绝对误差,又被称为L1误差,常见表达式如下。
(2)均方误差(Mean Square Error,MSE)。均方误差在某些资料中也被称为L2误差,常用表达式如下。
(3)均方根误差(Root Mean Square Error,RMSE)。均方根误差和前述的L2比较类似,其常见表达式如下。
4.2.3 线性回归范例
本节以scikit-learn为开发平台,讲解一个实际的线性回归范例。
代码片段以及释义如下。
import matplotlib.pyplot as plt import numpy as np from sklearn import datasets, linear_model from sklearn.metrics import mean_squared_error, r2_score ##引入scikit-learn的包 #加载scikit-learn提供的一个diabetes dataset diabetes = datasets.load_diabetes() #为了方便演示,这里只用了1个维度的数据 diabetes_X = diabetes.data[:, np.newaxis, 2] #将数据拆分为训练和测试数据 diabetes_X_train = diabetes_X[:-20] diabetes_X_test = diabetes_X[-20:] diabetes_y_train = diabetes.target[:-20] diabetes_y_test = diabetes.target[-20:] #创建一个线性回归模型 regr = linear_model.LinearRegression() #执行训练 regr. fit(diabetes_X_train, diabetes_y_train) #基于测试数据进行预测 diabetes_y_pred = regr.predict(diabetes_X_test) #绘制结果值 plt.scatter(diabetes_X_test, diabetes_y_test, color='black') plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3) plt.xticks(()) plt.yticks(()) plt.show()
在这个范例中,训练了一个“糖尿病”的线性回归预测模型。其中的数据集是由scikit-learn提供的——需要特别指出的是,这个数据集其实包含10个维度的数据,其属性如图4-2所示。为了方便读者理解,我们在代码中只使用了其中的一个维度。
图4-2 diabetes dataset属性
最终结果如图4-3所示。
图4-3 线性回归模型范例
4.3 逻辑回归
4.3.1 逻辑回归——二分类
逻辑回归(Logistic Regression)是用于在统计学中处理因变量多分类问题的一种回归模型,最初是由英格兰统计学家David Cox于1958年提出并发展起来的。逻辑回归在生物医学、心理学、经济学、社会学、市场统计以及机器学习等多个领域和学科中都有非常广泛的应用。
逻辑回归的因变量既可以是二分类的,也可以是多分类的,不过前者在业界应用得更多。它的用途包括但不限于:
(1)预测。根据模型,预测在某些自变量情况下因变量的可能值。例如,从患有癌症和没有患癌症的病人中提取出关键的自变量(如年龄、性别、某些人体特征、检测报告数据等)属性,以便通过这些信息来预测某人是否患有癌症。
(2)分类。根据模型来判断被观测对象所属的类别。例如,用于判断某人所得的是感冒、胃炎,还是低血糖等。
从人类文明的发展过程中,不难发现大部分学科或者新技术的创立和成长的规律是:观察自然界→探寻出规律→应用到其他领域。譬如牛顿观察到苹果从树上坠落逐步探索出了万有引力,从而对后续多个学科的发展产生了深远影响。统计学也同样适用这样的发展规律,只不过它的研究对象是数据——基于概率论建立数学模型,进而量化分析、推断出所观察到的数据的规律,并为其他相关决策提供依据和有效的参考。
逻辑回归的基础是逻辑函数(Logistic Function)、判定边界和代价函数。本节接下来的内容结构如下:首先通过实际范例来引出问题,然后再阐述解决这些问题所需要的技术——也就是逻辑回归的几个基础,最后再讲解多分类与二分类任务的区别及技术实现上的一些差异。
下面先给出一个问题范例。
假设在实验活动中观测到如图4-4所示的数据集。
图4-4 逻辑回归范例1
其中,圆圈表示1,叉表示0(二分类问题)。逻辑回归的任务简单来说就是要求出一个能拟合这些数据集的函数。读者可以自己思考一下,你会如何解答这个问题呢?
逻辑回归给出的方案由如下几部分组成。
1.逻辑函数
它的输入是),对于二分类问题输出是0或者1。根据这一属性要求,最常见的逻辑回归函数的表达式如下。
其中:
● e就是我们熟知的自然常数。
● x0称为midpoint,即中值。
● L是曲线的最大值。
● k描述了曲线的陡度。
当然,上面所述的是Logistic Function的通用形式,通常情况下会将各个参数值固化,然后形成具体的函数,例如下面这种:
读者对上面这个函数应该不会感到陌生,它也被称为Sigmoid函数(注:Sigmoid单词的含义是“S形状的”,而Sigmoid函数实际上是一系列具有类似形状的函数的统称。譬如还有Gompertz Curve、Ogee Curve等其他形状),是神经网络早期相当常用的一种激活函数(读者可以结合本书的神经网络章节来做穿插阅读)。
如图4-5所示,此时L=1,k=1,x0=0。
图4-5 Logistic Function的直观呈现
通常,Logistic Function还需要结合实际问题做一些变化。
例如,如果再假设:
t=β0+β1x
那么Logistic Function又可以写成
或者t=θTx,那么
其中,T是指矩阵转置。
2.判定边界(Decision Boundary)
上面已经解释了逻辑函数,但这似乎还不能完全解决问题。因为针对这个范例问题,拟合函数的输出值范围数量应该为2(即1或者0),而Sigmoid(x)∈(0,1),所以还要有如下的规定。
(1)如果F(x)≥0.5,预测结果为1。
(2)如果F(x)<0.5,预测结果为0。
这样就把最终结果限定在0或者1。
现在问题又转换为——什么时候F(x)≥0.5呢?根据Sigmoid函数的特性,显然就是当t=θTx≥0时。其中,θTx=0就是判定边界。当然针对不同的问题类型,θTx=0的表现形式会有所差异。
以之前的二分类范例为例,它的判定边界比较简单,如图4-6中间的直线。
图4-6 逻辑回归范例1的判定边界
不难得出它的函数表达式是
x1+x2-3=0
所以当x1+x2-3≥0时预测为1;而x1+x2-3<0时则预测为0。
对于稍微复杂一些的情况,判定边界也需要做相应的改变。例如,类似如图4-7所示这样的数据集,它的判定边界就变成
图4-7 逻辑回归范例2
3.代价函数(Cost Function)和优化过程
上面只是通过范例直接给出判定边界的最终形态,但是这些“答案”是怎么计算出来的呢?这就要使用到代价函数和优化算法。
具体而言,我们需要通过学习来确定预测函数中的θ。和线性回归中的情况类似,此时该代价函数出场。我们知道线性回归(Linear Regression)中使用的是平方误差(Squared Error)来作为代价函数
理论上来讲,逻辑回归也可以采用上述方法,不过它不是最佳方案。其中一个重要的原因就是平方误差在逻辑回归场景下求梯度容易陷入局部最优解,而我们显然更希望得到全局的最优化(Global Optimization)结果。为了解决这个问题,通常会选择convex类型的函数来作为逻辑回归的代价函数。
例如,下面这种类型
对于代价函数,我们要做的无非就是:
(1)保证代价函数是凸函数。
(2)当模型的输出值与样本目标值越接近时,代价函数的值越趋向于0;反之变大。
以y=1的情况为例,log函数的曲线如图4-8所示。
图4-8 log(x)曲线
而h(x)∈(0,1),所以很显然代价函数在y=1时对应的曲线段如图4-9所示。
图4-9 -log(x),x∈(0,-1)的曲线
换句话说,随着h(x)→1,那么代价函数→0,所以它符合我们上述的两个期望。
代价函数确定后,接下来的优化目标就很明确了,即通过学习使得它针对所有样本的求和平均值达到全局最小。目标函数的表达式如下。
实现这一目标的可选优化算法很多,其中比较常见的就是梯度下降。它的核心思想是针对参数各分量求偏导数,即:
然后每次的更新都朝着J(θ)下降的方向前进,直至达到结束标准。
伪代码如下。
其中的α是学习率(Learning Rate),它用于指示每次前进的“步伐”应该多大。
关于梯度下降算法,我们在深度神经网络等多个章节中都有详细分析,因而这里就不做过多阐述了,建议读者结合起来阅读。
4.3.2 逻辑回归——多分类及Softmax
4.3.1节都是以二分类的逻辑回归问题为范例来展开分析的。多分类和二分类场景相比既有相同的地方,也有些差异点,但总的来说它们的核心思想是类似的。
针对多分类的逻辑回归技术,通常可以划分为如下几种类型。
1.转换为二分类问题(Transformation to Binary)
简单来讲就是把多分类的问题转换为二分类问题来解决,又可以细分为以下两种。
(1)one-vs-rest。
假设有n个类别,那么one-vs-rest将建立n个二项分类器,每个分类器都用于一个类别和剩余其他类别之间的区分。
(2)one-vs-one。
假设有n个类别,那么one-vs-one就将建立m=n×(n-1)/2个二项分类器,换句话说就是所有类别两两之间都必须建立一个二项分类器。
2.基于二分类的扩展(Extension from Binary)
基于二项分类器的扩展实现,包括但不限于:
(1)深度神经网络。
(2)决策树。
(3)k-nearest neighbors。
(4)naive Bayes。
(5)SVM。
3.层次化分类器(Hierarchical Classification)
层次化分类器,每个叶子节点代表了一种类型。
接下来选取其中很具有代表性的Softmax分类器来讲解多分类场景下的逻辑回归实现原理。值得一提的是,在后续深度神经网络的学习中,大家会发现很多网络结构的最后一层都采用了Softmax来完成多类型的映射,因而可以说它的应用还是比较广泛的。
从训练集的角度来看,二分类和多分类的区别在于它们的y取值范围不同。
对于二分类
{(x(1),y(1)),…,(x(m),y(m))},y(i)∈{0,1}
对于多分类
{(x(1),y(1)),…,(x(m),y(m))},y(i)∈{1,2,…,k}
不过多分类任务的目标和二分类是类似的,即给出每个类别j的概率值p(y=j|x),所以多分类Hypothesis Function的表达式如下。
另外,Softmax回归的Cost Function为
所以接下来我们的问题就转换为:如何通过优化算法来使得J()达到最小值。在二分类问题中使用的梯度下降方法在这里也仍然适用,即每次更新过程为
其中
1{·}代表的是指示函数,简单来讲就是
1{表达式为真}=1
1{表达式为假}=0
比如上面的y(i)如果和j相等,那么就输出1;否则结果值为0。
是一个向量,由很多元素组成——它的第L个元素是J(θ)对θ的第l个分量的偏j导数。
这样一来就得到了多分类场景下的梯度更新方法,其伪代码如下。
可见多分类和二分类逻辑回归算法的基本原理是相近的,只不过在代价函数等几个方面需要结合多种类别的场景进行适当的改良。同时,Softmax在深度神经网络中也有广泛的应用,读者可以结合后续章节来做进一步学习。