蒋振飞的博客 - 机器学习02:逻辑回归   
正在加载蒋振飞的博客...
V3.0
蒋振飞的博客

机器学习02:逻辑回归

发布时间: 2018年09月29日 发布人: 蒋振飞 热度: 405 ℃ 评论数: 0

一、逻辑回归(Logistic Regression)

1.分类问题

    在分类问题中,其结果都判断是否属于某一个类(例如正确或错误),这是一个离散值。如:判断一封电子邮件是否是垃圾邮件;判断一次金融交易是否是欺诈;区别一个肿瘤是恶性的还是良性的。
    将因变量(dependent variable)可能属于的两个类分别称为负向类(negative class)正向类(positive class),则因变量 y 的取值就可以是 0 或 1,其中 0 表示负向类,1 表示正向类。

    f86eacc2a74159c068e82ea267a752f7.png e7f9a746894c4c7dfd10cfcd9c84b5f9.png

    如果要用线性回归算法解决一个分类问题,对于分类, y 只能取值为 0 或者1,但假设函数的输出值很可能远大于 1,或者远小于0,即使所有训练样本的标签 y 都等于 0 或 1。标签应该取值0 或者1,但是如果算法得到的值远大于1或者远小于0的话,就会感觉很奇怪。所以才会引入一种逻辑回归算法,这个算法的性质是:它的输出值永远在0到 1 之间。

2.假说表示

    回顾上一学习中提到的乳腺癌分类问题,可以用线性回归的方法求出适合数据的一条直线

29c12ee079c079c6408ee032870b2683.jpg

    根据线性回归模型只能预测连续的值,然而对于分类问题,需要输出0或1,时,预测 时,预测  。
    这样的一个线性模型似乎能很好地完成分类任务,但如果又观测到一个非常大尺寸的恶性肿瘤,将其作为实例加入到训练集中,又会获得一条新的直线。

d027a0612664ea460247c8637b25e306.jpg

    这时,再使用0.5作为阀值来预测肿瘤是良性还是恶性便不合适了。可以看出,线性回归模型,因为其预测的值可以超越[0,1]的范围,并不适合解决这样的问题。
    引入一个新的模型,逻辑回归,该模型的输出变量范围始终在0和1之间。 逻辑回归模型的假设是:  其中:  代表特征向量  代表逻辑函数(logistic function)是一个常用的逻辑函数为S形函数(Sigmoid function,公式为: 
    python代码实现:

import numpy as np
    
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

    该函数图像为:

1073efb17b0d053b4f9218d4393246cc.jpg

3.判定边界

    开始进入下决策边界(decision boundary)的概念,这个概念能更好地帮助理解逻辑回归的假设函数在计算什么。

6590923ac94130a979a8ca1d911b68a3.png

    在逻辑回归中,预测:当时,预测 。当时,预测  。根据上面绘制出的 S 形函数图像,应该知道当 z = 0 时 g(z) = 0.5,z > 0 时 g(z) > 0.5,z < 0 时 g(z) < 0.5, 又  ,即:  时,预测  , 时,预测 y = 0。
    假设现在有一个模型:

58d098bbb415f2c3797a63bd870c3b8f.png

    并且参数 是向量[-3 1 1]。 则当,即时,模型将预测 。 这时就可以绘制直线,这条线便是模型的分界线,将预测为1的区域和预测为 0 的区域分隔开。

4.代价函数

    拟合逻辑回归模型的参数。具体来说,定义用来拟合参数的优化目标或者叫代价函数,也就是监督学习问题中的逻辑回归模型的拟合问题。
    对于线性回归模型,代价函数是所有模型误差的平方和。理论上来说,逻辑回归模型也可以沿用这个定义,但是问题在于,如果入到这样定义了的代价函数中时,代价函数将是一个非凸函数(non-convexfunction)。这意味着代价函数有许多局部最小值,也就会影响梯度下降算法寻找全局最小值。
    线性回归的代价函数为: 。 逻辑回归的代价函数为:,其中

54249cb51f0086fa6a805291bf2639f1.png

与 之间的关系如下图所示:

ffa56adcc217800d71afdc3e0df88378.jpg

    当实际的  且也为 1 时误差为 0,当  但不为1时误差随着变小而变大;当实际的  且也为 0 时代价为 0,当 但不为 0时误差随着 的变大而变大。 
    Python代码实现:

import numpy as np
    
def cost(theta, X, y):
    
    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)))
    return np.sum(first - second) / (len(X))

    在得到这样一个代价函数以后,就可以用梯度下降算法来求得能使代价函数最小的参数了。算法是:Repeat {  (simultaneously update all ) }求导后得到Repeat {  (simultaneously update all ) }。

5.简化的成本函数和梯度下降

    逻辑回归的代价函数:

eb69baa91c2fc6e7dd8ebdf6c79a6a6f.png

    合并后得到逻辑回归的代价函数: 

20181004.jpg

    有了代价函数以后,剩下的就是尽量让这个代价函数最小,然后找到最小值的参数
    最小化代价函数的方法,是使用梯度下降法(gradient descent)。如果要最小化这个关于的函数值,通常需要用到梯度下降法的模板。

171031235527.png

    要反复更新每个参数,用这个式子来更新,就是用它自己减去学习率  乘以后面的微分项。对这个式子求导后可得:  。
    其实不难发现这个式子和线性回归梯度下降是一样的,但并不等同于线性回归和逻辑回归是同一个算法,因为:
对于线性回归假设函数:

20181004.jpg

    而现在逻辑函数假设函数:

20181004.jpg

    因此,即使更新参数的规则看起来基本相同,但由于假设的定义发生了变化,所以逻辑函数的梯度下降,跟线性回归的梯度下降实际上是两个完全不同的东西。

6.多类别分类:一对多

    举例:假如说现在需要一个学习算法能自动地将邮件归类到不同的文件夹里,或者说可以自动地加上标签。那么,也许需要一些不同的文件夹,或者不同的标签来完成这件事,来区分开来自工作的邮件、来自朋友的邮件、来自家人的邮件或者是有关兴趣爱好的邮件,那么,就有了这样一个分类问题:其类别有四个,分别用 来代表。
    如果说此时一共有三个类别,如下图所示,一对多的具体方法时可以先从用三角形代表的类别1开始,实际上可以创建一个新的"伪"训练集,类型2和类型3定为负类,类型1设定为正类,创建一个新的训练集,如下图所示的那样,现在要拟合出一个合适的分类器。

b72863ce7f85cd491e5b940924ef5a5f.png

    这里的三角形是正样本,而圆形代表负样本。可以这样想,设置三角形的值为1,圆形的值为0,就得到一个正边界。为了能实现这样的转变,可以将多个类中的一个类标记为正向类(),然后将其他所有类都标记为负向类,这个模型记作。接着,类似地第选择另一个类标记为正向类(),再将其它类都标记为负向类,将这个模型记作 ,依此类推。 最后得到一系列的模型简记为: 其中:i = (1,2,3...k)。
    现在要做的就是训练这个逻辑回归分类器:, 其中  对应每一个可能的 ,最后,要做的就是在三个分类器里面输入 ,然后选择一个让  最大的,即

二、正则化(Regularization)

1.过拟合的问题

    如果训练集中有非常多的特征,假设此时通过学习得到的假设可能能够非常好地适应训练集(代价函数可能几乎为0),但是可能会不能推广到新的数据,这就是过拟合,可以看成是学习率 a 过高导致的。
    下图分别是三个回归例子:

72f84165fbf1753cd516e65d5e91c0d3.jpg

    第一个模型是一个线性模型,它并没有完全将训练集中的点完全覆盖,这是一种欠拟合现象,不能很好地适应训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适。
    除了回归,分类也存在相同的拟合问题。

be39b497588499d671942cc15026e4a2.jpg

    所以可以得出一个结论 的次数越高,拟合的越好,但相应的预测的能力就可能变差。那么就要在二者之间选择一个最好的线性拟合,但如果在训练中出现了过拟合问题,可以从以下两点出发。
    1) 
丢弃一些不能帮助正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA)。
    2) 正则化。 保留所有的特征,但是减少参数的大小(magnitude)。

2.代价函数

    正则化的基本方法:过拟合通常是由高次项导致产生的,所以如果能让这些高次项的系数接近于0的话,就能很好的拟合,所以需要在一定程度上减小这些参 的值。
    比如在高次项中,假设对
其中 设置一点惩罚,也就是减小相应的参数值。在尝试最小化代价时还需要将这个惩罚纳入考虑中,并最终导致选择较小一些的。 修改后的代价函数如下:

20181004.jpg

    通过这样的代价函数选择出的 对预测结果的影响就比之前要小许多。假如训练集中有非常多的特征,但是并不知道其中哪些特征需要惩罚,也可以对所有的特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度。这样的结果是得到了一个较为简单的能防止过拟合问题的假设:

20181004.jpg

    其中又称为正则化参数(Regularization Parameter)。还需要注意的是,如果正则化参数 过大,则会把所有的参数都最小化了,导致模型变成 ,造成欠拟合。

3.正则化的逻辑回归模型

    同样对于逻辑回归,代价函数正则化的表达式

20181004.jpg

    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:theta.shape[1]],2))
    return np.sum(first - second) / (len(X)) + reg

    使用jupyter notebook工具实现逻辑回归实践案例:构建商品评价的情感分类器

打赏 蒋振飞

取消

感谢您的支持,我会继续努力的!

扫码支持
一分也是爱     一块不嫌多

点击 支付宝 或 微信 打赏蒋振飞

打开支付宝扫一扫,即可进行扫码打赏哦

评论列表