逻辑回归实战

Posted megachen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逻辑回归实战相关的知识,希望对你有一定的参考价值。

逻辑回归案例

小细节

  • 逻辑回归(logistic regression)虽然被称之为逻辑回归,但是它本质上其实是一种分类算法(classification algorithm),逻辑回归名字的由来是有历史原因的。
  • sigmoid函数在逻辑回归中站着重要的位置,sigmoid function也被称为logistic function,称之为逻辑函数就做到了见名知意了,说明({{1}over{1 + e^{-x}}})与逻辑回归密切相关。
  • 在线性回归中得知,假设函数(h(x) = heta_0 + heta_1x),逻辑回归处理的是分类的问题,那么我们的算法要么输出的是概率(返回在0到1之间),要么是输出的就是0或者1等等,在线性回归中建立的假设函数(h(x) = heta_0 + heta_1x)显然不会在0到1之间或者输出的值为0或者1,这个时候就需要sigmoid函数了;sigmoid函数可以将实数范围内的值转换为0-1之间的值,而这个值恰巧就是概率所在的范围,进一步的,得到了概率的值,只要我们设定了阈值(threshold)就可以将其转换为0或者1等等。
  • 逻辑回归是在线性回归的基础上发展而来的,它是依赖于线性回归的,为什么?因为在逻辑回归中,定义的假设函数时(h_{ heta}(x) = g( heta^{T}x)),其中( heta^{T}x)就是在线性回归中假设函数的矩阵形式,在逻辑回归中通过g函数将其封装到sigmoid函数中,(g(x) = {{1} over {1 + e^{-x}}}),只有这样,才能将( heta^{T}x)这个输出在R上的值映射到0-1之间,所有逻辑回归中的假设函数为(h_{ heta}(x) = g( heta^{T}x) = {{1} over {1 + e^{- heta^{T}x}}})
  • 逻辑回归假设函数的概率表现形式: (h(x) = g( heta^{T}x) = P(y = 1|x; heta)),在提醒一下,这里的( heta)是一个列向量,在MATLAB/Octave中出现公式的地方,十有八九都是使用矩阵方程表达的,输入和输出也大部分是列向量或者矩阵。
  • 关于阈值(threshold),在上面几点中已经提到的,这里提一下如何将一个0-1的概率值转换为一个0或者1等等的分类结果,首先根据通过sigmoid函数,我们的线性回归的结果会被锁定到0-1之间,这个时候如果假设函数(h_{ heta}(x) = g( heta^{T}x) = {{1} over {1 + e^{- heta^{T}x}}})的结果为0.7,表示 (y = 1)的概率为0.7,对立的,(y = 0)的概率为0.3,如果规定threshold为0.5,则表示如果假设函数(h())的输出大于等于0.5则(y = 1),如果小于0.5则(y = 0),换一个角度来说,sigmoid中封装的线性回归函数在大于等于0的时候,(y = 1),在小于0的时候,(y = 0)

sigmoid function(logistic function)

  • 定义
    • ({{1} over {1 + e^{-x}}})
  • 图像
    技术分享图片

根据学生的两次考试成绩来判断是否能够被大学录取

案例概要

  • 第一列为第一次考试成绩列向量
  • 第二列为第二次考试成绩列向量
  • 第三列为是否被录取(0 or 1)

案例分析

  • 定义假设函数(h(x) = g( heta^{T}x) = {{1} over {1 + e^{- heta^{T}x}}})
  • 数据变量
    • m: the number of training examples,样本的数量。
    • n: the number of features,特征的数量,这里不包括第0个特征,所以为2。
    • x的上标:样本的行数。
    • x的下标:表示第几个特征。
  • 输入X,注意:这里的X已经添加上了默认的第0个特征,这个列向量中的值都为1
    [ egin{bmatrix} 1 & x^{1}_{1} & x^{1}_{2} 1 & x^{2}_{1} & x^{2}_{2} vdots & vdots & vdots 1 & x^{m}_{1} & x^{m}_{2} end{bmatrix} ]

  • 目标函数((J( heta))
    • 与线性回归中一样[J( heta) = {{1} over {2m}}sum_{i=1}^{m}(h_{ heta}(x^{(i)}) - y^{(i)})^{2} = {{1} over {2m}}sum_{i=1}^{m}({{1} over {1 + e^{- heta{x^{(i)}}}}} - y^{(i)})^{2}]这里的( heta)为列向量。
    • 思考,如何计算(minimize_{ heta}J( heta))
      • 在线性回归中我们使用梯度下降的方法可以很好的收敛,因为线性回归中的最小化方程是一个凸函数,没有局部最优点,只有一个全局最优点,但是在逻辑回归中,因为我们将线性回归函数封装到了sigmoid函数中,导致目标函数(J( heta))( heta)构成的函数图像是弯弯曲曲的,有多个局部最优点,导致了无法使用梯度下降的方法求出最优解。
      • 此时应该对目标函数进行等价替换(注意:等价替换值得是效果一样,但是数值可能不同
        • 首先[J( heta) = {{1} over {2m}}sum_{i=1}^{m}(h_{ heta}(x^{(i)}) - y^{(i)})^{2} = {{1} over {m}}sum_{i=1}^{m}(h_{ heta}(x^{(i)}) - y^{(i)})^{2}]
        • 接着定义Cost函数[Cost(h_{ heta}({x^{(i)}}), y^{(i)}) = (h_{ heta}(x^{(i)}) - y^{(i)})^{2}],为什么?因为我们接下来要将[(h_{ heta}(x^{(i)}) - y^{(i)})^{2}]等价替换成一个分段函数,在机器学习的数学公式表示中,如果遇到一个分段函数,则在原来函数中使用一个新的逻辑函数(为什么说是抽象函数?因为在这里这个新的函数还没有函数的实体)将其替换掉,再对这个新的变量进行定义。
        • 其次将Cost函数等价替换为
          [ Cost(h_{ heta}({x^{(i)}}), y^{(i)}) = egin{cases} -log(h_{ heta}({x^{(i)}})) & if & y = 1 -log(1 - h_{ heta}({x^{(i)}})) & if & y = 0 end{cases} ]
          上面的等价替换就是将返回概率值的假设函数(h_{ heta}(x^{(i)}))转为取log之后的结果。
        • 现在目标函数(J( heta))
          [ J( heta) = {{1}over{m}}sum_{i=1}^{m}Cost(h_{ heta}({x^{(i)}}), y^{(i)}) Cost(h_{ heta}({x^{(i)}}), y^{(i)}) = egin{cases} -log(h_{ heta}({x^{(i)}})) & if & y = 1 -log(1 - h_{ heta}({x^{(i)}})) & if & y = 0 end{cases} ]

        • 通过数学方法可以将上面的两个式子合并为一个
          [ J( heta) = -{{1}over{m}}[sum_{i=0}^{m}y^{(i)}log(h_{ heta}({x^{(i)}})) + (1 - y^{(i)})log(1 - h_{ heta}({x^{(i)}}))] ]

    • 梯度下降

      • 梯度(也就是偏导)
        • (grad = {{partial}over{partial{ heta}}}J( heta))
      • 梯度下降
        • ( heta_{j} := heta_{j}- alpha{{partial}over{ heta_{j}}}J( heta)),对所有的特征都进行梯度下降
        • 展开来就是和线性回归一样的式子[ heta_{j} := heta_{j}- alpha{sum_{i=1}^{m}(h_{ heta}}(x^{(i)}) - y^{(i)})x_{j}^{(i)}]
      • 不断地更新参数即可

如果y的值为0, 1, 2, 3,如果使用拟合出来的函数进行预测

  • 思路和对一个函数求偏导是一样,当我们讨论y=0的情况时,就将其他的1,2,3情况都归为一类,一次类推,我们可以得出y=0,1,2,3的概率,只要(max(h(x^{(i)})))即可






以上是关于逻辑回归实战的主要内容,如果未能解决你的问题,请参考以下文章

《机器学习实战》之逻辑回归--基于Python3--01

机器学习python实战----逻辑回归

pytorch学习实战逻辑回归

《机器学习实战》笔记——逻辑回归

阅读笔记联邦学习实战——用FATE从零实现横向逻辑回归

机器学习100天(十八):018 逻辑回归Python实战