机器学习之逻辑回归

分类问题回归问题,是机器学习两大主要应用。

分类问题覆盖面很广泛:比如二元分类,根据考试成绩推断是否被录取、根据消费记录判断信用卡是否可以申请,以及预测某天是否将发生地震等;有多元分类,如消费群体的划分、个人信用的评级等;还有图像识别语音识别等,在本质上也是很多个类别的分类问题。

本章讲的专用于分类的机器学习算法,叫逻辑回归(logistic regression),简称Logreg

1 逻辑回归与分类问题

逻辑回归算法的本质其实仍然是回归。

这个算法也是通过调整权重w和偏置b来找到线性函数来计算数据样本属于某一类的概率。比如二元分类,一个样本有60% 的概率属于A类,有20%的概率属于B类,算法就会判断样本属于A类。

首先利用线性回归模型的结果,找到了概率为0.5时所对应的特征点(分数=60分),然后把线性的连续值,转换为0/1的分类值,也就是true/false逻辑值,去更好地拟合分类数据。

1.1 极端问题与S型函数

用上面的线性回归模型会有一个问题,当样本在极端位置时会对结果产生影响,比如学生考试是否及格使用线性函数,标签0、1表示是否及格。

我们现在知道,正常来说60分为及格线,所以60分这个点对应的概率应该为0.5。

但如果有学生考试得到0分的话,为了减小平均误差,回归线现在要往0分那边稍作移动。因此,概率0.5这个阈值点所对应的x分数也发生了移动,目前变成了50分。这样,如果有一个同学考了51分,本来是没有及格,却被这个模型判断为及格(通过考试的概率 高于0.5)。这个结果与我们的直觉不符。

逻辑回归(logistic regression) 函数,是一个“S型函数”。为这个函数对于靠近值域最大最小附近的极端样本是很不敏感的,类似样本的分类概率将无限逼近0或1,样本个数再多也无所谓。但是在0.5这个分类概率临界点附近的样本将对函数的形状产生较大的影响。也就是说,样本越靠近分类阈值,函数对它们就越敏感。

恰好,有一个符合需要的函数,这个函数叫Sigmoid函数。其公式为:

$${g(z) = {1 \over 1+e^{-z}}}$$

为什么这里自变量的符号用的是z而不是x?因为它是一个中间变量,代表的是线性回归的结果。而这里g( z)输出的结果是一个0~1的 数字,也代表着分类概率。

Sigmoid函数的代码实现很简单:

1
y_hat = 1/(1+ np.exp(-z)) # 输入中间变量z, 返回y'

通过Sigmoid函数就能够比阶跃函数更好地把线性函数求出的数值,
转换为一个0~1的分类概率值。

逻辑回归所做的事情,就是把线性回归输出的任意值,通过数学上的转换,输出为0~1的结果,以体现二元分类的概率。

上述过程中的关键在于选择Sigmoid函数进行从线性回归到逻辑回归的转换。Sigmoid函数的优点如下:

  • Sigmoid函数是连续函数,具有单调递增性(类似于递增的线性函数)。
  • Sigmoid函数具有可微性,可以进行微分,也可以进行求导。
  • 输出范围为[0,1],结果可以表示为概率的形式,为分类输出做准备。
  • 抑制分类的两边,对中间区域的细微变化敏感,这对分类结果拟合效果好。

1.2 逻辑回归的损失函数

逻辑回归的损失函数不能使用MSE(均方误差函数),这是因为因为经过了一个逻辑函数的转换之后,MSE对于wb而言,不再是一个凸函数,这容易使梯度下降在一个局部的低点“卡住”。

因此,在设计逻辑回归的损失函数,针对真值为1或0对应于不同的函数,是一个以自然常数为底数的对象,将此两函数合为一则变成了逻辑回归的损失函数:

1
loss = - (y_train * np.log(y_hat) + (1 - y_train) * np.log(1 - y_hat))

1.3 逻辑回归的梯度下降

2 二元分类问题

github address

3 多元分类问题

复习一下刚才解决二元分类问题的基本思路:通过逻辑回归算法确定一个种类或者一种情况出现的概率。除了我们刚才举的例子客户是否患病之外,类似的应用还可以用来判断一种商品是否值得进货,结果大于等于0.5就进货(类别1),小于0.5就不进货(类别0),诸如此类, 等等。

然而,在实际生活中,分类并不总是二元的。多元分类就是多个类别,而且每一个类别和其他类别都是互斥的情况。也就是说,最终所预测的标签只能属于多个类别中的某一个。

而用逻辑回归预测多元问题,需要采用逐个排除的办法:

即有多个类别的情况下,如果确定一个数据样本属于某一个类(1),那么就把其他所有类看成另一类(0)。

也就是有多少类别,就要训练多少二元分类器。

每次选择一个类别作为正例,标签为1,其他所有类别都视为负例,标签为0,以此类推至所有的类别。训练好多个二元分类器之后,做预测时,将所有的二元分类器都运行一遍,然后对每一个输入样本,选择最高可能性的输出概率,即为该样本多元分类的类别。

如果理解不了的话,通过下面的示意图,你就知道了:

ai-logreg-multi

举例来说,如果对3个二元分类器分别做一次逻辑回归,机器的分类结果告诉我们,数据A是孔雀的可能性为0.5,是熊猫的可能性为0.1,是独角兽的可能性为0.4。那就会判断数据A是孔雀。

还有另外一种分类叫作“多标签分类”,指的是如果每种样本可以分配多个标签,就称为多标签分类。比如,一个图片标注任务,猫和狗同时出现在图片中,就需要同时标注“猫”“狗”。这是更为复杂的分类任务,但基本原理也是一样的。

3.1 正则化

鸢尾花的多元分类是一个经典的运行逻辑回归解决的多元分类问题。在此之前,我们需要先了解正则化 – 这个重要的机器学习概念。

我们先回顾下我们之前接触到的几个概念:

1. 规范化(normalization)

规范化一般是把数据限定在需要的范围,比如[0,1], 从而消除了数据量纲对建模的影响。

2. 标准化(standardization)

标准化一般是指将数据正态分布化, 使平均值为0,标准差为1。

它们都是针对数据做手脚,消除过大的数值 差异,以及离群数据所带来的偏见。经过规范化和标准化的数据,能加快训练速度,促进算法的收敛。

3. 正则化(regularization)

而正则化不是对数据的操作,机器学习中的正则化是在损失函数里面加惩罚项,增加建模的模糊性,从而把捕捉到的趋势从局部细微趋势,调整到整体大概趋势。虽然一定程度上地放宽了建模要求,但是能有效防止过拟合的问题,增加模型准确性。它影响的是模型的权重。

标准化规范化,以及归一化,是调整数据,特征缩放;而正则化,是调整模型,约束权重。

3.2 欠拟合、过拟合、泛化能力

正则化技术所要解决的过拟合问题,连同欠拟合(underfit)一起, 都是机器学习模型调优(找最佳模型)参数调试(找模型中的最佳参数)过程中的主要阻碍。

ai-logic-reg-fit

一开始模型“很烂”的时候,训练集和测试集的误差都很大,这是欠拟合。随着模型的优化,训练集和测试集的误差都有所下降,其中训练集的误差值要比测试集的低。这很好理解,因为函数是根据训练集拟合的,泛化到测试集之后表现会稍弱一点。但是,如果此处继续增加模型对训练集的拟合程度,会发现测试集的误差将逐渐升高。这个过程就被称作过拟合

所以,过拟合就是机器学习的模型过于依附于训练集的特征,因而模型泛化能力降低的体现。泛化能力,就是模型从训练集移植到其他数据集仍然能够成功预测的能力。

3.3 正则化参数解决过拟合问题

机器学习中的正则化通过引入模型参数λ(lambda)来实现。

模型参数λ(lambda)被加入到损失函数中体现:训练优化算法是一个由两项内容组成的函数:一个是损失项,用于衡量模型与数据的拟合度;另一个是正则化项,用于调解模型的复杂度。

比如我们之前学过的线性回归均方误差损失函数MSE可以更新为带正则化参数的MSE,逻辑回归均方误差损失函数也可相应更新。但不用担心,正则化参数已经被嵌入Python的库函数内部。从直观上不难看出,将正则化机制引入损失函数之后,当权重大的时候,损失被加大,λ值越大,惩罚越大(此法可以引导机器在进行拟合的时候不会随便增加权重)。

正则化,就像奥卡姆剃刀定律,认为科学家应该优先采用更简单的公式或理论。将该理论应用于机器学习,就意味着越简单的模型,有可能具有越强的泛化能力。

选择λ值的目标,是在简单化和训练集数据拟合之间达到适当的平衡:

  • 如果λ值过大,则模型会非常简单,将面临数据欠拟合的风险。 此时模型无法从训练数据中获得足够的信息来做出有用的预测。而且λ值越大,机器收敛越慢。
  • 如果λ值过小,则模型会比较复杂,将面临数据过拟合的风险。 此时模型由于获得了过多训练数据特点方面的信息而无法泛化到新数据。
  • 将λ设为0可彻底取消正则化。在这种情况下,训练的唯一目的是最小化损失,此时过拟合的风险较高。

正则化参数通常有L1正则化和L2正则化两种选择:

  • L1正则化,根据权重的绝对值的总和来惩罚权重。在依赖稀疏特征(后面会讲什么是稀疏特征)的模型中,L1正则化有助于使不相关或几乎不相关的特征的权重正好为0,从而将这些特征从模型中移除。
  • L2正则化,根据权重的平方和来惩罚权重。L2 正则化有助于使离群值(具有较大正值或较小负值)的权重接近于0,但又不会正好为 0。在线性模型中,L2 正则化比较常用,而且在任何情况下都能够起到增强泛化能力的目的。

应用L1正则化的回归又叫Lasso Regression(套索回归),应用L2正则化的回归又叫Ridge Regression(岭回归)