逻辑回归 | Logistic Regression

498 阅读5分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

Logistic Regression

跟线性回归不同,在这里要预测的y是离散值。 用到的 Logistic Regression 算法是当今最流行最广泛使用的学习算法之一。

还记得监督学习和无监督学习的分类吗 Classification Emai:Spam/ Not Spam? Online Transactions:Fraudulent(Yes/No)? Tumor:Malignant/ Benign

邮件:是否是垃圾邮件 网上交易:是否存在欺诈 肿瘤分类:良心恶性

记得的话就会知道上述都属于离散型监督学习。上述三个问题的共同之处:

y∈{0,1}

0:Negative Class"

1:"Positive Class"

当然并不是所有的离散型问题都非黑即白只有两个结果,也有可能是y∈{0,1,3,...,n}可数有限多个。

举个例子

从简单的二类离散开始:

从肿瘤的大小预测其是良性还是恶性:

image.png

如果我们还是用线性回归的方法拟合是无法生效的。比如像这样:

image.png

现在我们对于这条拟合直线假定h(x)>0.5h(x)>0.5为恶性,反之为良性。你可能说这不是拟合的挺好的吗。

但是如果这样呢:

image.png

就会有很多恶心的肿瘤被判断为良性。

所以说线性回归并不适合离散型问题。

逻辑回归

那对于离散回归怎么办呢。首先我们要确保:

0hθ(x)10 \leq h_{\theta}(x) \leq 1

这样就不会出现线性回归那样的问题。线性回归中不管你怎么拟合。只要超出一定范围总会出现h(x)>1h(x)>1的情况。

那要如何改良呢?

这就借助到Sigmoid function又称Logistic function:

g(z)=11+ezg(z) = \frac{1}{1+e^{-z}}

image.png

再将线性回归的公式应用到Logistic函数中后得到:

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

现在已经知道如何将hθ(x)h_θ(x)的值固定在0~1之间,那对于输出结果怎么描述呢?

Estimated probability that y = 1 on input x。

描述输入x对于y = 1时结论的可能性。

比如y = 1代表恶性肿瘤,用户x输入得到的结果为0.7。

你不能说“恭喜你,你得恶性肿瘤了”,而是要说“你得恶性肿瘤的概率是70%”。

正规结果用概率的方式表示就是:

hθ(x)=P(y=1x;θ)h_θ(x) = P(y=1|x;θ)

上面的式子我们还可以推出hθ(x)=P(y=1x;θ)+hθ(x)=P(y=0x;θ)=1h_θ(x) = P(y=1|x;θ)+h_θ(x) = P(y=0|x;θ) = 1

决策边界

刚才上边说到描述结果,要说x的输入对于y=1时候的可能性。但是严格意义上来说并不是所有的都要说是对于y=1时候的可能性。

Suppose :

  • predict y=1 if hθ(x)0.5h_{\theta}(x) \geq 0.5
  • predict y=0 if hθ(x)<0.5h_{\theta}(x) < 0.5

一般来说,hθ(x)h_{\theta}(x)大于等于0.5就说相对于y=1的结论,小于0.5说相对于0的结论。

注意区分一下逻辑,比如x输入之后y=0.2,你不能说你有20%的几率是恶性肿瘤,而是说你有80%几率是良性肿瘤。

上边的说法还可以等价为

Suppose :

  • predict y=1 if θTx0\theta^Tx \geq 0
  • predict y=0 if θTx<0\theta^Tx < 0

因为上边的g(z)=11+ezg(z) = \frac{1}{1+e^{-z}}的图像,z>0时候为正,z<0为负。而hθ(x)=g(θTx)h_{\theta}(x) =g(\theta^Tx),所以可以进行如上转换。

决策边界就是θTx=0\theta^Tx = 0的时候

画个图像更直观的了解一下:

image.png

上图假设我们已经找到预测函数hθ(x)=θ0+θ1x1+θ2x2h_{\theta}(x) = \theta_0 + \theta_1x_1 + \theta_2x_2,其中θ=[311]θ =\begin{bmatrix} -3 \\ 1 \\ 1 \end{bmatrix},带入就是hθ(x)=3+x1+x2h_{\theta}(x) = -3 + x_1 + x_2

你现在不用管预测函数是怎么出来的,文章下边会讲的

其中θTx=3+x1+x2=0\theta^Tx = -3 + x_1 + x_2 =0就是x1+x2=3x_1 + x_2 = 3这条直线。这条直线就是决策边界。而这条线上边的红叉叉区域就是x1+x2>3 x_1 + x_2 > 3的区域,被称为y=1区域。反之下边蓝圈圈就是y=0区域。

image.png

The decision boundary is a property of the hypothesis.

决边界是假设函数的一个属性,跟数据无关。也就是说虽然我们需要数据集来确定θ的取值,但是一旦确定以后,我们的决策边界就确定了,剩下的就和数据集无关了,图像上也不一定非要把数据集可视化。

现在来个更复杂的例子:

image.png

对于这个图像我们的预测函数是hθ(x)=g(θ0+θ1x1+θ2x2+θ3x12+θ4x22)h_{\theta}(x)=g(\theta_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}\left.+\theta_{3} x_{1}^{2}+\theta_{4} x_{2}^{2}\right) ,其中θ=[10011]θ = \begin{bmatrix} -1 \\ 0 \\ 0 \\ 1 \\ 1 \end{bmatrix}

y = 1 的时候就是x12+x221x_{1}^{2}+x_{2}^{2} \geq 1

y = 0 的时候就是x12+x22<1x_{1}^{2}+x_{2}^{2} < 1

这个例子中决策边界就是x12+x22=1x_{1}^{2}+x_{2}^{2} = 1

如何拟合Logistic Regression

Training set:

{(x(1),y(1)),(x(2),y(2)),,(x(m),y(m))}\left\{\left(x^{(1)}, y^{(1)}\right),\left(x^{(2)}, y^{(2)}\right), \cdots,\left(x^{(m)}, y^{(m)}\right)\right\}

m examples x[x0x1xn]x0=1,y{0,1}\quad x \in\left[\begin{array}{c}x_{0} \\ x_{1} \\ \ldots \\ x_{n}\end{array}\right] \quad x_{0}=1, y \in\{0,1\}

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

How to choose parameters θ\theta ?

先说我们的训练集,是m个点。跟之前一样把x列成一个矩阵,并且加上一个x0=1x_0 = 1θTx=θ0X0+θ1x1+...+θnxn\theta^Tx=\theta_0X_0+ \theta_1x_1+...+\theta_nx_n

那如何选择θ?

要计算θ首先要找到代价函数。

代价函数

还记得线性回归的代价函数吗?

J(θ)=12mi=1m(hθ(x(i))y(i))2J\left(\theta\right)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}

换一种写法,用 Cost(hθ(x),y)=12(hθ(x)y)2Cost(h_{\theta}(x), y)=\frac{1}{2}(h_{\theta}(x)-y)^{2}

Cost(hθ(x),y)Cost(h_{\theta}(x), y)代表预测函数和实际值的差,代价函数J则表示对所有训练样本和预测函数的代价求和之后取平均值。

所以线性回顾代价函数还可以写为:

J(θ)=1mi=1mCost(hθ(x),y)J\left(\theta\right)=\frac{1}{m} \sum_{i=1}^{m}Cost(h_{\theta}(x), y)

在离散值里如果你继续使用这个代价函数,那画出图像以后结果是个非凸函数。长下边这样,也就是说你没办法顺利的找到最优解。

image.png

所以我们需要找一个凸函数来作为逻辑回归的代价函数:

Logistic regression cost function

Cost(hθ(x),y)={log(hθ(x)) if y=1log(1hθ(x)) if y=0\operatorname{Cost}\left(h_{\theta}(x), y\right)=\left\{\begin{aligned} -\log \left(h_{\theta}(x)\right) & \text { if } y=1 \\ -\log \left(1-h_{\theta}(x)\right) & \text { if } y=0 \end{aligned}\right.

如果y=1图像如下:

image.png

我们知道h(x)的取值范围在0~1之间,结合log图像的特点,我们就可理解上述图像是怎么出现的了。

这个函数有一些很有趣的优秀性质:

Cost=0:ify=1,hθ(x)=1Cost = 0:\quad if \quad y=1,h_θ(x)=1

当代价函数等于0的时候,也就是我们的假设函数hθ(x)=1h_θ(x)=1,即我们预测是恶性肿瘤,并且实际数据y=1y=1,即病人确实是恶性肿瘤。也就是说代价函数0,我们预测正确。

Butashθ(x)0,CostBut \quad as \quad h_θ(x)→0,Cost→∞

但是如果我们的假设函数趋于0的时候,代价函数却趋于正无穷。

Captures intuition that if hθ(x)=0h_θ(x)=0 (predict P(y=1x;θ)=0P(y=1|x;θ)=0), but y=1, we'll penalize learning algorithm by a very large cost.

如果假设函数等于0相当于说对于y=1即病人的恶性肿瘤这件事,我们预测的概率是0。

如果放到现实生活中就相当于我们对病人说:你完全不可能是恶性肿瘤!现实中如果肿瘤确实是恶性,那医生的话就是重大医疗事故。医生要付出很大代价。但是在这个函数中只能趋于0,不会等于0。

再看看y=0的情况:

image.png

Cost=0:ify=0,hθ(x)=0Cost = 0:\quad if \quad y=0,h_θ(x)=0

代价函数0,y=0代表病人是良性肿瘤,我们预测函数hθ(x)=0h_θ(x)=0说明我们预测的肿瘤是良性,预测完全正确,所以代价函数0.

Butashθ(x)0,CostBut \quad as \quad h_θ(x)→0,Cost→∞

Captures intuition that if hθ(x)=1h_θ(x)=1 (predict P(y=0x;θ)=1P(y=0|x;θ)=1

y=0代表病人良性肿瘤,但是我们预测函数等于1的话,说明我们预测的是恶性肿瘤,告诉病人:你不可能是良性肿瘤。在生活中万一人家是良性肿瘤,医生这句话又会造成不必要恐慌……

所以这个函数的有趣又优良之处在于不能把话说的太满。

上边已经说到代价函数了:

Logistic regression cost function

J(θ)=1mi=1mCost(hθ(x(i)),y(i))J(\theta)=\frac{1}{m} \sum_{i=1}^{m} \operatorname{Cost}\left(h_{\theta}\left(x^{(i)}\right), y^{(i)}\right)

Cost(hθ(x),y)={log(hθ(x)) if y=1log(1hθ(x)) if y=0\operatorname{Cost}\left(h_{\theta}(x), y\right)=\left\{\begin{aligned}-\log \left(h_{\theta}(x)\right) & \text { if } y=1 \\-\log \left(1-h_{\theta}(x)\right) & \text { if } y=0 \end{aligned}\right.

Note: y=0y=0 or 1 always

现在我们将其简化:

cost(hθ(x),y)=ylog(hθ(x))(1y)log(1hθ(x))cost(h_{θ}(x), y)=-y \log (h_{θ}(x))-(1-y) \log (1-h_{\theta}(x))

为什么简化之后就是这个式子?

直接带数进上边式子就可以了。

  • y = 1:cost(hθ(x),1)=1log(hθ(x))(11)log(1hθ(x))=log(hθ(x))cost(h_{θ}(x), 1)=-1 \log (h_{θ}(x))-(1-1) \log (1-h_{\theta}(x)) = - \log (h_{θ}(x))
  • y = 0:cost(hθ(x),0)=0log(hθ(x))(10)log(1hθ(x))=log(1hθ(x))cost(h_{θ}(x), 0)=0 \log (h_{θ}(x))-(1-0) \log (1-h_{\theta}(x)) = -\log (1-h_{\theta}(x))

所以就是直接将上边两个式子合并成一个式子,不需要再来判断y的取值情况分类进行了。

现在我们就可以写出逻辑回归的代价函数:

Logistic regression cost function

J(θ)=1mi=1mCost(hθ(x(i)),y(i))=1m[i=1my(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]\begin{aligned} J(\theta) &=\frac{1}{m} \sum_{i=1}^{m} \operatorname{Cost}\left(h_{\theta}\left(x^{(i)}\right), y^{(i)}\right) \\ &=-\frac{1}{m}\left[\sum_{i=1}^{m} y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right] \end{aligned}

根据这个代价函数,我们要找到minθJ(θ)\min_{\theta} J(\theta),即让代价函数取得最小值的参数θ。

那就又要进行梯度下降了。

梯度下降

Gradient Descent

J(θ)=1m[i=1my(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^{m} y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right]

Want minθJ(θ):\min _{\theta} J(\theta): Repeat {

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

} (simultaneously update all θj\theta_{j} )

对上述的J(θ)J(\theta)求偏导之后带入梯度下降公式,最后得到如下形式:

Gradient Descent

J(θ)=1m[i=1my(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^{m} y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right]

Want minθJ(θ):\min _{\theta} J(\theta): Repeat {

θj:=θjαi=1m(hθ(x(i))y(i))xj(i)\theta_{j}:=\theta_{j}-\alpha \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}
}\}

(simultaneously update all θj\theta_{j} )

emmmmm现在你有没有发现一个问题,逻辑回归的梯度下降公式和线性回归梯度下降公式看起来一模一样。

为什么加粗了看起来,因为毕竟他们的预测函数不同。

hθ(x)=θTxhθ(x)=11+eθTx\begin{aligned} &h_{\theta}(x)=\theta^{T} x \\ &h_{\theta}(x)=\frac{1}{1+e^{-\theta^{T} x}} \end{aligned}

所以说虽然看起来一样,但实际还是天差地别。

高级优化

讲线性回归的时候我们说找最佳的θ除了使用梯度下降,还可以使用正规方程。对于逻辑回归也是如此,我们除了使用梯度下降,还可以使用别的算法。(下边列举的这三种都需要代价函数和代价函数的偏导。区别是跟梯度下降迭代部分不一样)

  • Conjugate gradient
  • BFGS
  • L-BFGS

Advantages:

  • No need to manually pick α
  • Often faster than gradient descent Disadvantages:
  • More complex

这三个算法相对于梯度下降,有点事不需要选择学习速率α并且比梯度下降更快。缺点是算法更为复杂。

当然更为复杂这个根本不是缺点,因为你不需要知道原理,直接用别人已经写好的就行了。吴恩达老师原话“我用了十多年了,然而我前几年才搞清楚他们的一些细节。”

想起来一个好笑的梗:贵的东西只有一个缺点那就是贵,但这不是东西的缺点,是我的缺点。

octave和MATLAB有这种库,直接用就行了。至于你使用C,C++,python之类的,那你可能要多试几个库才能找到实现比较好的。

如何应用到逻辑回归中?

theta =[θ0θ1θn]=\left[\begin{array}{c}\theta_{0} \\ \theta_{1} \\ \vdots \\ \theta_{n}\end{array}\right]

function [jVal, gradient] == costFunction (theta)

jVal=[\mathrm{jVal}=[ code to compute J(θ)];J(\theta)] ;

gradient (1)=[(1)=\left[\right. code to compute θ0J(θ)]\left.\frac{\partial}{\partial \theta_{0}} J(\theta)\right]

gradient (2)=[(2)=\left[\right. code to compute θ1J(θ)]\left.\frac{\partial}{\partial \theta_{1}} J(\theta)\right]

...

gradient (n+1)=[(n+1)=\left[\right. code to compute θnJ(θ)]\left.\frac{\partial}{\partial \theta_{n}} J(\theta) \quad\right]

举个例子:

 Example: θ=[θ1θ2]J(θ)=(θ15)2+(θ25)2θ1J(θ)=2(θ15)θ2J(θ)=2(θ25)\begin{aligned} &\text { Example: }\\ &\theta=\left[\begin{array}{l} \theta_{1} \\ \theta_{2} \end{array}\right]\\ &J(\theta)=\left(\theta_{1}-5\right)^{2}+\left(\theta_{2}-5\right)^{2}\\ &\frac{\partial}{\partial \theta_{1}} J(\theta)=2\left(\theta_{1}-5\right)\\ &\frac{\partial}{\partial \theta_{2}} J(\theta)=2\left(\theta_{2}-5\right) \end{aligned}

现在有一个含两个参数的实例,肉眼可见当代价函数最小(等于0)的时候两个θ都等于5。好嘛,现在是为了学算法,我们假装不知道结果。

function [j,gradient] = costFunction(theta)
  %代价函数J
  j = (theta(1)-5)^2 + (theta(2)-5)^2;
  
  gradient = zeros(2,1);
  
  %偏导
  gradient(1) = 2*(theta(1)-5);
  gradient(2) = 2*(theta(2)-5);
  
 endfunction

costFunction函数有两个返回值。一个是代价函数J,一个是对J求偏导,用于存储结果的向量。

%octave中输入:
options = optimset ('GradObj','on','MaxIter','100');
initheta = zeros(2,1);
[Theta,J,Flag] = fminunc (@costFunction,initheta,options)
  • optimset:进行设置,其中四个参数:
    • GradObj:设置梯度目标参数
    • 确认上一步设置开启
    • 最大迭代次数
    • 设置最大迭代次数值
  • fminunc:octave的无约束最小化函数,需要传入三个参数
    • 你自己写的函数,前边一定要加@
    • 你预设的θ,必须是一个二维及以上的向量,如果是一个实数,该函数会失效。
    • 对该函数的设置

image.png

最后运行结果长这样,Theta存储最终的代价函数最小化时θ的取值。J表示代价函数最优解,Flag = true表示已经收敛。

多类分类 Multiclass classification

什么是多类分类?

比如你又一个邮件要对他自动分类为:工作、朋友、家庭、其他。

image.png

对这种分类怎么处理?

Using an idea called one-versus-all classification, we can then take this and make it work for muti-class classification, as well.

利用一对多的分类思想,我们同样可以把二类分类的思想应用在多类别分类上。

Here's how one-versus-alll classiffication works. And, this is also sometimes called one-versus-rest.

现在介绍一下敌对多分类方法(一对余):

Let's say, we have a training set

image.png

用三角表示1,方块表示2,叉表示3

现在将其改为三个独立的二元分类:

image.png

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

在这里表i=1的时候就是三角形做正类的时候。上述i个分类器对其中每一种情况都进行了训练。

在一对多分类中

One-vs-all Train a logistic regression classifier hθ(i)(x)h_{\theta}^{(i)}(x) for each class ii to predict the probability that y=iy=i

On a new input xx, to make a prediction, pick the class ii that maximizes

maxihθ(i)(x)\max _{i} h_{\theta}^{(i)}(x)

我们获得一个逻辑回归分类器,hθ(i)(x)h_{\theta}^{(i)}(x)预测i类别在y=i时候的概率。最后做出预测,我们给出一个新的输入值x,想获得预测结果,我们要做的就是在每个分类器中运行输入x,最后选择预测函数最大的类别,就是我们要预测的结果y。