DeepAI

【吴恩达机器学习】第三周—逻辑回归、过拟合、正则化

2020-03-09  本文已影响0人  Sunflow007
31.jpg

1.分类问题(Regression)

在分类问题中,你要预测的变量 𝑦 是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法。顺便说一下,逻辑回归算法是分类算法,我们将它作为分类算法使用。有时候可能因为
这个算法的名字中出现了“回归”使你感到困惑,但逻辑回归算法实际上是一种分类算法,它适用于标签 𝑦 取值离散的情况,如:1 0 0 1。

为什么不用线性回归来解决分类问题 ?
简单来说,因为分类问题的y取值为固定的几个类别,譬如肿瘤分类为0 表示良性、1表示恶性,如果同样用线性回归y = k * x + b来表示,x为肿瘤尺寸,则得出的y范围可能远 > 1,但结果总会落到0和1上,会显得很奇怪。

2.逻辑回归(Logistic Regression)

前面说了,逻辑回归是适用于分类问题的常见算法,这个算法的性质是:它的输出值永远在 0 到 1 之间。

3.假设函数表达式Hypothesis Representation

回到之前的乳腺癌分类上,我希望输出的预测值是介于0~1之间,此时用逻辑回归算法怎么实现呢?
其实,逻辑回归中,可以用Sigmoid函数,来实现在R区间的输入,得到0~1之间的输出Sigmoid函数:
g(z) = \frac{1}{1+e^{-z}}函数图像如下:

image.png

下面,让我们推导一波公式:
h_\theta(x)Sigmod函数(单调递增,导数>0),log函数隐藏了常数项底数,我们设其为a=2,简化一下上面的Cost()函数
Cost(t , y) = \begin{cases} -log_a(t), & \text{if y = 1} \\[2ex] -log_a(1-t), & \text{if y = 0} \end{cases} 令t = h_\theta(x)

t 的取值范围为(0,1)
y = 1时,[Cost(t,1)]' = [-log_a(t)]' = -\frac{1}{tlna} < 0 函数单调递减,且t趋于1时,Cost() 趋于 0。示意图左下:

image

现在,如果你把这个更新规则和我们之前用在线性回归上的进行比较的话,你会惊讶地发现,这个式子正是我们用来做线性回归梯度下降的。那么,线性回归和逻辑回归是同一个算法吗?要回答这个问题,我们要观察逻辑回归看
看发生了哪些变化。实际上,假设的定义发生了变化。
对于线性回归假设函数:
h_\theta(x) = \theta^TX = \theta_0x_0 + \theta_1x_1 + \theta_2x_2+...+\theta_nx_n

而逻辑回归中假设函数:
h_\theta(x) = g(\theta^TX) = \frac{1}{1+e^{-\theta^TX}}因此,即使更新参数的规则看起来基本相同,但由于假设的定义发生了变化,所以逻辑函数的梯度下降,跟线性回归的梯度下降实际上是两个完全不同的东西。
最后还有一点,我们之前在谈线性回归时讲到的特征缩放,我们看到了特征缩放是如何提高梯度下降的收敛速度的,这个特征缩放的方法,也适用于逻辑回归。如果你的特征范围差距很大的话,那么应用特征缩放的方法,同样也可以让逻辑回归中,梯度下降收敛更快。
就是这样,现在你知道如何实现逻辑回归,这是一种非常强大,甚至可能世界上使用最广泛的一种分类算法。

7.高级优化

现在我们换个角度来看什么是梯度下降,我们有个代价函数J(\theta),而我们想要使其最小化,那么我们需要做的是编写代码,当输入参数J(\theta)时,它们会计算出两样东西:J(\theta)以及j等于 0、 1 直到n时的偏导数项。

image.png

解决或改善?

1.丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如 PCA)
2.正则化。 保留所有的特征,但是减少参数的大小(magnitude)。

10.正则化

假设回归问题中,过拟合的模型如下:
h_\theta(x) = \theta^TX = \theta_0 + \theta_1x_1 + \theta_2x_2^2 + \theta_3x_3^3 + \theta_4x_4^4从第9.点中图像上,我们可以看出,正是那些高次项导致了过拟合的产生,所以降低高次项的系数\theta我们就能降低过拟合程度。但是,我们不能直接修改模型中的参数大小,而通过修改代价函数中参数大小来实现“曲线救国”
正常回归问题的损失函数如下:J(\theta)= \frac{1}{2m}\Sigma^m_{i=1}=(h_\theta(x^{(i)} - y^{(i)}))^2对损失函数做梯度下降算法,如下:
[图片上传失败...(image-d793a0-1583758276758)]可见,每次迭代中,为了使迭代后的参数\theta变更小,我们需要使-\alpha\frac{∂}{∂\theta_i}J(\theta)尽可能大,而学习率固定,所以我们只能想办法让倒数项尽可能大。所以我们可以对损失/代价函J(\theta)做一波修改:

image.png

3.正则化逻辑回归

此处比较简单,我就直接贴图了:

19.png19.png 20.png20.png
需要说明的是:虽然加了正则化后、逻辑回归和线性回归的梯度下降公式看上去一样,但实际意义由于假设函数的不同,而完全不同。
Python代码:
import numpy as np
def costReg(theta, X, y, learningRate):
theta = np.matrix(theta)
X = np.matrix(X)
y = np.matrix(y)
first = np.multiply(-y, np.log(sigmoid(X*theta.T)))
second = np.multiply((1 - y), np.log(1 - sigmoid(X*theta.T)))
reg = (learningRate / (2 * len(X))* np.sum(np.power(theta[:,1:the
ta.shape[1]],2))
return np.sum(first - second) / (len(X)) + reg
上一篇下一篇

猜你喜欢

热点阅读