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函数:
函数图像如下:
下面,让我们推导一波公式:
是函数(单调递增,导数>0),函数隐藏了常数项底数,我们设其为a=2,简化一下上面的函数
t 的取值范围为(0,1)
当y = 1时, 函数单调递减,且t趋于1时, 趋于 0。示意图左下:
现在,如果你把这个更新规则和我们之前用在线性回归上的进行比较的话,你会惊讶地发现,这个式子正是我们用来做线性回归梯度下降的。那么,线性回归和逻辑回归是同一个算法吗?要回答这个问题,我们要观察逻辑回归看
看发生了哪些变化。实际上,假设的定义发生了变化。
对于线性回归假设函数:
而逻辑回归中假设函数:
因此,即使更新参数的规则看起来基本相同,但由于假设的定义发生了变化,所以逻辑函数的梯度下降,跟线性回归的梯度下降实际上是两个完全不同的东西。
最后还有一点,我们之前在谈线性回归时讲到的特征缩放,我们看到了特征缩放是如何提高梯度下降的收敛速度的,这个特征缩放的方法,也适用于逻辑回归。如果你的特征范围差距很大的话,那么应用特征缩放的方法,同样也可以让逻辑回归中,梯度下降收敛更快。
就是这样,现在你知道如何实现逻辑回归,这是一种非常强大,甚至可能世界上使用最广泛的一种分类算法。
7.高级优化
现在我们换个角度来看什么是梯度下降,我们有个代价函数,而我们想要使其最小化,那么我们需要做的是编写代码,当输入参数时,它们会计算出两样东西:以及j等于 0、 1 直到n时的偏导数项。
解决或改善?
1.丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如 PCA)
2.正则化。 保留所有的特征,但是减少参数的大小(magnitude)。
10.正则化
假设回归问题中,过拟合的模型如下:
从第9.点中图像上,我们可以看出,正是那些高次项导致了过拟合的产生,所以降低高次项的系数我们就能降低过拟合程度。但是,我们不能直接修改模型中的参数大小,而通过修改代价函数中参数大小来实现“曲线救国”
正常回归问题的损失函数如下:对损失函数做梯度下降算法,如下:
[图片上传失败...(image-d793a0-1583758276758)]可见,每次迭代中,为了使迭代后的参数变更小,我们需要使尽可能大,而学习率固定,所以我们只能想办法让倒数项尽可能大。所以我们可以对损失/代价函做一波修改:
3.正则化逻辑回归
此处比较简单,我就直接贴图了:
19.png 20.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
网友评论