逻辑回归

  • 之前我们已经接触过相关的回归模型了,我们知道回归模型是用来处理和预测连续型数据的算法。然而逻辑回归是一种命名为“回归”的线性分类器,其本质是由线性回归变化而来的,一种广泛使用余分裂问题中的广义回归算法。

  • 首先连续型的标签值可以使用线性回归得出,从而完成各种预测连续型变量的任务(比如预测产品销量,预测股价等)。

  • 回归模型也可以实现分类效果

    • 使用sigmod函数将线性回归的值转换到(0,1)之间,这个值就是分到设定类的概率。
      Sigmod函数
  • 我们可以通过引入sigmod函数,将线性方程z变换为g(z)的值分布在(0,1)之间,且当g(z)接近0时样本的标签为类别0,当g(z)接近1时样本的标签为类别1,也就是说从0.5分隔开,可以将样本分为两类。这样就得到了一个分类模型

    • g(z)的计算方法(e是自然对数的底数),其图像如下:
      在这里插入图片描述
      在这里插入图片描述
  • sigmod函数可以将任意值映射到(0,1)区间,时期可用于将任意值函数转换为更适合二分类的函数。因此也被当做归一化的一种方法,但取不到0和1。

  • 逻辑回归和线性回归之间的关联

    • 线性回归中z=θTx,代入g(z)就得到了二元逻辑回归模型的一般形式:
      在这里插入图片描述
    • y(x)就是我们逻辑回归得到的预测值。y(x)与1-y(x)相加是1。我们令y(x)除以1-y(x)可以得到形似几率的y(x)/1-y(x),在此基础上取对数,可以很容易就得到其结果就是线性回归的计算公式θTx
    • y(x)逻辑回归的形似几率取对数的本质其实就是我们的线性回归z,我们实际上是在对线性回归模型的预测结果取对数的几率来让其的结果无限逼近0和1。因此,其对应的模型被称为“对数几率回归”(logistic Regression),也就是我们的逻辑回归,这个名为“回归”却是用来做分类工作的分类器。
      • 逻辑回归的形似几率取对数就是线性回归
      • 线性回归解的对数几率就是逻辑回归
    • 因此逻辑回归是由线性回归变化而来的
  • 线性回归的核心任务是通过求解θ并构建z这个预测函数,逻辑回归也需要这个预测函数来进行分类,因此这个函数z应该尽量拟合数据。
    在这里插入图片描述
    在这里插入图片描述
    逻辑回归的优点

  • 首先必须要声明的一点就是逻辑回归是一个收工业商业热爱,使用广泛的模型

    • 1、逻辑回归对线性关系(特征与标签之间的线性关系极强的数据)的拟合效果好到丧心病狂,比如金融领域中的信用卡欺诈,评分卡制作,电商中的营销预测等等相关的数据,都是逻辑回归的强项。相对,逻辑回归在非线性数据中的效果有时候比瞎猜还不如,如果你事先知道你的数据之间的联系是非线性的,千万一定不要使用逻辑回归!!!
      • 其实最简单判别一个模型是否为线性的,只需要判别决策边界是否是直线,也就是是否能用一条直线来划分。
    • 2、逻辑回归计算快:对于线性数据,逻辑回归的拟合和计算都非常快,计算效率优于SVM和随机森林,亲测表示在大型数据上尤其能看出区别。
    • 3、逻辑回归返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字。我们因此可以把逻辑回归返回的结果当成连续型数据来利用。比如在评分卡制作时,我们不仅需要判断客户是否会违约,还需要给出确定的”信用分“,而这个信用分的计算就需要使用类概率计算出的对数几率(概率) 。
  • 总结:由此,我们已经了解了逻辑回归的本质,它是一个返回对数几率的在线性数据上表现优异的分类器。

    • 主要被应用在金融领域。注意,虽然我们熟悉的逻辑回归通常被用于处理二分类问题,但逻辑回归也可以做多分类。
      逻辑回归的损失函数
  • 因为逻辑回归也采用了寻找特征和目标之间的某种关系,则每个特征也是有权重的就是w,那么也会存在真实值和预测值之间的误差(损失函数),那么逻辑回归的损失函数和线性回归的损失函数是否一样呢?

    • 由于逻辑回归是用于分类的,因此该损失函数和线性回归的损失函数是不一样的!逻辑回归采用的损失函数是:对数似然损失函数
    • 注意:没有求解参数需求的模型是没有损失函数的,比如KNN,决策树。
    • 损失函数被写作如下:
      • 为什么使用-log函数为损失函数,损失函数的本质就是,如果我们预测对了,则没有损失,反之则损失需要变的很大,而-log函数在【0,1】之间正好符合这一点。
        • log(h)表示分类到正例1的损失
        • log(1-h)表示分类到反例0的损失
          在这里插入图片描述
  • 损失函数表征预测值与真实值之间的差异程度,如果预测值与真实值越接近则损失函数应该越小,由此使用-log,当预测值与真实值接近,也就是接近1的时候,y值即损失函数值越小。
    梯度下降

  • 梯度下降主要是用于求解损失函数最小值的。

  • 具体的做法就是将一个小球随机的放在损失函数的曲面上小球会随着曲面滚落,直到到达最低点,也就是损失函数的最低点。

  • 为了严格监控这个小球的行为,我们让小球每次滚动的距离有限,不让他一次性滚到最低点,并且最多只允许它滚动100步,还要记下它每次滚动的方向,直到它滚到曲面上的最低点。

  • 一般情况下,小球会从某个位置滑落,在低凹的位置来回震荡,最终停下来。我们可以观察到几个现象:

    • 首先,小球并不是一开始就直着向最低点去的,它先一口气冲到了低凹位置的边缘,后来又折返回来。小球经过多次滚动,滚动的方向都是不同的。
    • 另外,小球在进入低凹位置后,并没有找到某一个点,而是来回震荡了数次才停下。这有两种可能:
      • 1)小球已经滚到图像的最低点,所以停下了;
      • 2)由于设定的步数限制,小球还没有找到最低点,但在100步之后停下了。也就是说小球不一定滚到了图像的最低处。
    • 但无论如何,小球停下的位置就是我们现有状况下可以获得的唯一点了。如果我们足够幸运,这个点就是图像的最低点。这样一来就能够得到使损失函数最小的参数了。如此,梯度下降的过程就已经完成。
  • 在这个过程中,小球其实就是一组组的坐标点(𝛉1,𝛉2,J);小球每次滚动的方向就是那一个坐标点的梯度向量的方 向,因为每滚动一步,小球所在的位置都发生变化,坐标点和坐标点对应的梯度向量都发生了变化,所以每次滚动 的方向也都不一样;人为设置的100次滚动限制,就是sklearn中逻辑回归的参数max_iter,代表着能走的最大步数.

    • 所以梯度下降,其实就是在众多[𝛉1,𝛉2]可能的值中遍历,一次次求解坐标点的梯度向量,不断让损失函数的取值J逐渐逼近最小值,再返回这个最小值对应的参数取值[𝛉1,𝛉2]的过程。
      正则化
  • 注意:由于我们追求损失函数最小,让模型在训练集上表现的最优,这可能会导致过拟合问题,在训练集上表现优秀,在测试集上表现的很糟糕。所以我们需要控制过拟合的技术来帮助我们调整模型。

    • 对逻辑回归中过拟合的控制,通过正则化来实现。
  • 正则化是用来防止模型过拟合的过程,常用的有L1正则化和L2正则化两种选项,分别通过在损失函数后加上参数向量𝛉的L1范式和L2范式的倍数来实现。这个增加的范式,被称为“正则项”,也被称为"惩罚项"。

  • L1范式

    • L1范式表现为参数向量𝛉中的每个参数的绝对值之和
      在这里插入图片描述
  • L2范式

    • L2范数表现为参数向量𝛉中的每个参数的平方和的开方值
      在这里插入图片描述
  • 其中J(𝛉)是我们之前提过的损失函数,C是用来控制正则化程度的超参数,n是方程中特征的总数,也是方程中参数的总数,j代表每个𝛉参数(w系数)。在这里,j要大于等于1,是因为我们的参数向量中,第一个参数是𝛉0,是我们的截距它通常是不参与正则化的。

  • 总结:

    • 我们知道损失函数的损失值越小,越有可能发生过拟合。通过正则化的L1和L2范式可以加入惩罚项C来矫正模型的拟合度。因为C越小则损失函数会越大表示正则化的效力越强,参数θ会被逐渐压缩的越来越小。
    • 注意:L1正则化会将参数w压缩为0,L2正则化只会让参数尽量小,不会取到0。
  • L1和L2范式的区别

    • L1会使对模型贡献不大的特征参数更快的变成零,所以L1本质上是一个特征选择的过程。L1正则化越强,参数向量中就有越多的参数为0,所选出来的特征就越少。因此当特征量很大,数据维度很高的时候,我们偏向使用L1正则化。
    • L2会使每一个特征对模型都有一些小的贡献,但携带信息少,对模型贡献不大的特征参数会非常接近0。
    • 通常来讲,如果我们的主要是为了防止过拟合,那么选择L2正则化就够了,但是如果L2正则化之后还是过拟合,就可以考虑L1正则化。
  • 建立两个逻辑回归,L1正则化和L2正则化的差别就一目了然了:
    在这里插入图片描述
    逻辑回归API

  • from sklearn.linear_model import LogisticRegression

  • 超参数介绍:

    • penalty:

      • 可以输入l1或者l2来指定使用哪一种正则化方式。不填写默认"l2"。 注意,若选择"l1"正则化,参数solver仅能够使用求解方式”liblinear"和"saga“,若使用“l2”正则 化,参数solver中所有的求解方式都可以使用。
    • C:

      • 惩罚项。必须是一个大于0的浮点数,不填写默认1.0,即默认正则项与损失函数的比值是1:1。C越小,损失函数会越大,模型对损失函数的惩罚越重,正则化的效力越强,参数会逐渐被压缩得越来越小。
    • max_iter:

      • 梯度下降中能走的最大步数,默认值为100.步数的不同取值可以帮助我们获取不同的损失函数的损失值。目前没有好的办法可以计算出最优的max_iter的值,一般是通过绘制学习曲线对其进行取值。
    • solver:

      • 我们之前提到的梯度下降法,只是求解逻辑回归参数𝛉的一种方法。sklearn为我们提供了多种选择,让我们可以使用不同的求解器来计算逻辑回归。求解器的选择,由参数"solver"控制,共有五种选择。
        • liblinear:是二分类专用(梯度下降),也是现在的默认求解器。
        • lbfgs,newton-cg,sag,saga:是多分类专用,几乎不用。
          在这里插入图片描述
    • multi_class:

      • 输入"ovr", “multinomial”, “auto"来告知模型,我们要处理的分类问题的类型。默认是"ovr”。
        • ‘ovr’:表示分类问题是二分类,或让模型使用"一对多"的形式来处理多分类问题。
        • ‘multinomial’:表示处理多分类问题,这种输入在参数solver是’liblinear’时不可用。
        • “auto”:表示会根据数据的分类情况和其他参数来确定模型要处理的分类问题的类型。比如说,如果数据是二分 类,或者solver的取值为"liblinear",“auto"会默认选择"ovr”。反之,则会选择"multinomial"。
    • class_weight:

      • 表示样本不平衡处理的参数。样本不平衡指的是在一组数据中,某一类标签天生占有很大的比例,或误分类的代价很高,即我们想要捕捉出某种特定的分类的时候的状况。什么情况下误分类的代价很高?
        • 例如,我们现在要对潜在犯罪者和普通人进行分类,如果没有能够识别出潜在犯罪者,那么这些人就可能去危害社会,造成犯罪,识别失败的代价会非常高,但如果,我们将普通人错误地识别成了潜在犯罪者,代价却相对较小。所以我们宁愿将普通人分类为潜在犯罪者后再人工甄别,但是却不愿将潜在犯罪者 分类为普通人,有种"宁愿错杀不能放过"的感觉。
        • 再比如说,在银行要判断“一个新客户是否会违约”,通常不违约的人vs违约的人会是99:1的比例,真正违约的人其实是非常少的。这种分类状况下,即便模型什么也不做,全把所有人都当成不会违约的人,正确率也能有99%, 这使得模型评估指标变得毫无意义,根本无法达到我们的“要识别出会违约的人”的建模目的。
    • None:

      • 因此我们要使用参数class_weight对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类, 向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重,即自动1: 1。
    • balanced:

      • 当误分类的代价很高的时候,我们使用”balanced“模式,可以解决样本不均衡问题。
  • 乳腺癌数据集下,学习曲线,找出最优的超参数取值。
    在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐