机器学习-逻辑回归学习总结

4/26/2017 mlreview

终于把Coursera上Andrew的机器学习课第三周完成了😌

第三周主要讲了 逻辑回归(Logistic Regression) 的概念和实现方法。

在课程中,Andrew讲到逻辑回归主要是为了解决 分类问题(Classification) ,即最终我们需要得到的结果是几个离散的值,例如是/不是的二分类问题,就可以看作是对其取值——

  • 是: y=1y=1
  • 不是: y=0y=0

在这种情境下,区别于上一章的 线性回归(Linear Regression) ,这里的 假设函数(Hypothesis) 采用 Sigmoid 函数,意在表示某一样本属于其中一个分类的概率:

P(y=1x;θ)=hθ(x)=g(θTx)P(y=1|x;\theta) = h_\theta(x) = g(\theta^Tx)
g(z)=11+ezg(z) = \frac{1}{1+e^{-z}}

g(z)g(z)的函数图像如下: Sigmoid函数图像

可以看出,这个函数的取值范围是[0,1][0, 1],正好符合概率的定义,即一个事件发生的概率最大为1(绝对发生),最小为0(绝不发生)。而在分类中,一个样本总是属于一个类别(y=1y=0y=1 || y=0),不存在中间值,因此我们规定:

y={1,hθ(x)0.50,hθ(x)<0.5 y=\begin {cases} 1, & h_\theta(x) \geq 0.5 \\ 0, & h_\theta(x) < 0.5 \end {cases}

由上图可知,当hθ(x)0.5h_\theta(x) \geq 0.5时,z0z \geq 0,即θTx0\theta^Tx \geq 0

为了满足这个条件(即θTx0\theta^Tx \geq 0),引入 决策边界(Decision Boundary) 的概念。以课程中的例子为例:

在有两个特征(x1,x2x_1, x_2)的情况下,令z=θ0+θ1x1+θ2x2=0z = \theta_0 + \theta_1x_1 + \theta_2x_2 = 0,可以在上图中得到一条直线(决策边界),将分别取属于两个类别的样本划分开来。

在这个例子中,根据上面的公式,我们可以规定:

θ0+θ1x1+θ2x20\theta_0 + \theta_1x_1 + \theta_2x_2 \geq 0 时,我们预测 y=1y = 1 ;当 θ0+θ1x1+θ2x2<0\theta_0 + \theta_1x_1 + \theta_2x_2 < 0 时,我们预测 y=0y = 0

逻辑回归的 目的 就是通过调整θ\theta,使得这条直线能够以最小的误差将两种样本分开,从而对新的样本进行预测。

为了得到满足要求的 θ\theta ,引入 代价函数(Cost Function) 的概念,记作 J(θ)J(\theta)

与之前的线性回归中的代价函数不同,如果直接拿来用的话,会导致 J(θ)J(\theta) 为非凸函数,不能保证其收敛到全局最优解:

因此为了保证代价函数 J(θ)J(\theta) 能够经过迭代取得全局最小值,我们将逻辑回归的 J(θ)J(\theta) 定义为如下形式: (其中 mm 为样本数,下同)

J(θ)=1mi=1mCost(hθ(x),y) J(\theta) = \frac{1}{m}\sum_{i=1}^m Cost(h_\theta(x), y)
Cost(hθ(x),y)={log(hθ(x)),y=1log(1hθ(x)),y=0 Cost(h_\theta(x), y) = \begin {cases} -log(h_\theta(x)), & y = 1 \\ -log(1 - h_\theta(x)), & y = 0 \end {cases}

y=0y = 0时,Cost(hθ(x),y)Cost(h_\theta(x), y)的函数图像形状如下图:

可以看到,当hθ(x)=0h_\theta(x) = 0时,代价函数J(θ)J(\theta)的值也为0,意味着没有代价,完全符合;同样当hθ(x)=1h_\theta(x) = 1时,代价函数J(θ)=J(\theta) = \infty,意味着此时预测函数取得了与实际结果完全相反的值,因此代价无限大。当y=1y = 1时也是同理。

为了使得最终的假设函数hθ(x)h_\theta(x)能够合理地预测之后的样本结果,我们需要不断迭代θ\theta,使得代价函数J(θ)J(\theta)取得一个合理的最小值。为了使这一过程称为可能,我们将上面的分段函数合并为以下形式:

Cost(hθ(x),y)=ylog(hθ(x))(1y)log(1hθ(x)) Cost(h_\theta(x), y) = -y \cdot log(h_\theta(x)) - (1 - y)log(1 - h_\theta(x))
J(θ)=1m[i=1my(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))] J(\theta) = -\frac{1}{m}[\sum_{i=1}^m y^{(i)}log(h_\theta(x^{(i)})) + (1 - y^{(i)})log(1 - h_\theta(x^{(i)}))]

我们的目标是取得minJ(θ)\min J(\theta)θ\theta的值,并将其代入假设函数hθ(x)h_\theta(x)中,这样当我们拿到一个新的样本xx时,我们可以使用下面的公式得出预测结果:

hθ(x)=11+eθTx h_\theta(x) = \frac{1}{1 + e^{-\theta^Tx}}

要想取得minθJ(θ)\min_\theta J(\theta),我们继续采用之前学过的梯度下降方法:(jj代表样本中的特征序号,下同)

θj=θjαθjJ(θ) \theta_j = \theta_j - \alpha\frac{\partial}{\partial \theta_j} J(\theta)

其中,θj\theta_j必须 同步更新 ,即在一次迭代中计算出所有θj\theta_j的值,并将其作为下次迭代的初始值,而不是先将一个特征的θj\theta_j迭代至最优,再对下一个特征的θj\theta_j进行迭代。

经过求偏导后,得到的梯度下降公式为:

θj=θjαi=1m(hθ(x(i))y(i))xj(i) \theta_j = \theta_j - \alpha\sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)}

MatlabOctave中,我们可以不手动实现梯度下降算法,软件中内置了迭代函数fminunc可以帮我们自动进行迭代计算,而我们只需要提供下面两个式子的值:

  • J(θ)J(\theta)
  • θjJ(θ)\frac{\partial}{\partial \theta_j} J(\theta) j=0,1,...,nj = 0, 1, ..., n

fminunc函数的调用形式如下:

[theta, cost] = fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);
1

其中:

  • costFunction:由我们自己实现的可以计算J(θ)J(\theta)θjJ(θ)\frac{\partial}{\partial \theta_j} J(\theta)的值的函数
  • initial_theta:初始的θ\theta向量
  • options:用于规定fminunc函数的迭代方式,具体内容见help fminunc
  • theta:经过迭代后得到的结果θ\theta
  • cost:在得到结果θ\theta值时costFunction的计算值

至此我们已经可以在数据集上用逻辑回归来实现二分类问题了。

对于需要区分不止两个类别的问题,我们可以将问题 分解为多个二分类 来进行实现,即为每一个类别都实现一个假设函数hθ(x)h_\theta(x)。套用课程中的例子:

此时不同的形状代表不同的分类,我们规定:样本属于三角形分类时,y=1y=1;样本属于矩形分类时,y=2y=2;样本属于叉号分类时,y=3y=3。如此假设函数表示为:

hθ(i)x=P(y=ix;θ)(i=1,2,3) h_\theta^{(i)}x = P(y=i | x; \theta)\\ \\ (i = 1, 2, 3)

最终我们需要得出三个假设函数hθ(i)xh_\theta^{(i)}x,在为其中一个类别实现时,我们将属于另外两个类别的样本统一看作所选分类的补集,从而将问题转化为三个二分类问题。在预测新的样本时我们只要将样本分别代入三个假设函数中,并取计算结果中的最大值,此时所对应的hθ(i)(x)h_\theta^{(i)}(x)所对应的ii就是最终对此样本预测的所属分类。

在最开始的例子中,我们用一条直线就可以将不同类别的样本区分开来:

但是在其他问题中还存在这样的样本分布:

这时候的决策边界是一条不规则曲线,我们需要将决策边界修改为类似以下形式:

z=θ0+θ1x1+θ2x2+θ3x12+θ4x22 z = \theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_1^2 + \theta_4x_2^2

在这里面,特征数量增长为4个(x1,x2,x12,x22x_1, x_2, x_1^2, x_2^2)。随着特征数量的增多,决策边界有可能会变成这种样子:

这种情况显然不是我们想要的,所以这种情况被称作过拟合(Overfitting),这种情况的特点在于过于拟合训练数据集,但是对预测新的样本没有帮助甚至有反作用,因此我们要避免这种情况的发生。课程中介绍了一种方法可以有效解决这种情况,叫做正规化(Regularization)。正规化的原理在于在代价函数后添加一项,该项为待求θ\theta的倍数,目的在于提高代价函数在某处θ\theta的值,使得最终求得的θ\theta尽可能小,从而避免决策边界变得鬼畜( ´▽`)。使用正规化方法后的代价函数J(θ)J(\theta)形式为:

J(θ)=[1mi=1my(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]+λ2mj=1nθj2 J(\theta) = -[\frac{1}{m}\sum_{i=1}^m y^{(i)}log(h_\theta(x^{(i)})) + (1 - y^{(i)})log(1 - h_\theta(x^{(i)}))] + \frac{\lambda}{2m}\sum_{j=1}^n \theta_j^2

注意:正规化项的求和是从j=1j=1开始的,意味着θ0\theta_0并不参与正规化。

在这里,λ\lambda的选取也是有讲究的,既不能过大也不能过小。如果过大,意味着每次迭代J(θ)J(\theta)的值也会很大,最终会导致θ\theta的结果非常小,使得决策边界会过于平坦,不能有效区分类别样本,即欠拟合(Underfitting);如果过小,则不能对代价函数大小产生足够的影响,使得正规化效果不显著。

最终使用正规化方法后的梯度下降算法形式为:

θ0=θ0α1mi=1m(hθ(x(i))y(i))x0(i) \theta_0 = \theta_0 - \alpha\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_0^{(i)}
θj=θjα[1mi=1m(hθ(x(i))y(i))xj(i)+λmθj]=θj(1αλm)α1mi=1m(hθ(x(i))y(i))xj(i) \begin{aligned} \theta_j &= \theta_j - \alpha[\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} + \frac{\lambda}{m} \theta_j] \\ &= \theta_j(1 - \alpha\frac{\lambda}{m}) - \alpha\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} \end{aligned}
(j=1,2,3,...,n) (j = 1, 2, 3, ..., n)

对以上使用了正规化方法的公式进行求解,可以有效解决逻辑回归中的过拟合问题。

以上です。

Last Updated: 5/6/2021, 9:08:41 AM