Advertisement

【机器学习】逻辑回归(Logistic Regression)

阅读量:

从本质上来说:机器学习就是一个系统对外界的输入(训练样本)做出反应,并遵循趋利避害的衡量依据。

1. 什么是逻辑回归?


许多人都非常熟悉线性回归;然而了解逻辑回归的人可能相对较少。从整体上讲, 逻辑回归属于一种有监督学习的统计模型;它的主要用途是将样本数据进行分类。

在线性回归模型中,输出一般是连续的,例如

对于每个输入变量x都映射到一个输出结果y上。通常情况下,模型的定义域和值域都是从负无穷延伸至正无穷(-∞, +∞)。值得注意的是,在逻辑回归中虽然输入变量通常是连续变化的(continuous),但输出结果通常是有限且离散的(discrete),即只可能取有限个特定值。例如,在二元分类问题中其输出结果可能仅取两个离散值{0, 1}(如图所示),这两个数值可以表示样本所属的不同类别(如高/低、患病/健康、阴性/阳性等),这就是最常用的二元分类逻辑回归模型。因此,在整个实数范围内的所有可能输入样本x都会被映射到有限个离散类别标签y上。对于任意给定的一个输入样本x,通过应用逻辑回归分析方法就可以确定它应被归类到预设的具体类别标签y中。

逻辑回归与线性回归的关系

广义线性回归模型也被称为逻辑回归。它们的形式基本相似,并且都遵循ax + b的形式。在这里ab是待估计的参数。在多重线性回归中,则直接使用ax + b作为预测值。而logistic 回归则通过 Sigmoid 函数将输入映射到隐状态 p。这里使用的 S 是 Sigmoid 函数

将t换成ax+b,可以得到逻辑回归模型的参数形式:

图1:sigmoid函数的图像

借助函数S的力量

逻辑回归模型的代价函数

在逻辑回归模型中,通常采用交叉熵作为衡量预测与真实值之间差异的损失函数。如需了解详细的技术细节,请参阅附录中的链接代价函数。请注意,在本节中我们仅限于介绍交叉熵的具体公式。

m:训练样本的个数;

hθ(x):用参数θ和x预测出来的y值;

y:原训练样本中的y值,也就是标准答案

上角标(i):第i个样本

2. 数据准备


下面的数据来自《机器学习实战》中的示例:

复制代码
复制代码
复制代码

该数据集包含3个特征维度与10个样本实例;其中前两个字段分别为x₁和x₂变量,第三个字段对应输出结果y;这些数据可作为模型参数的学习与训练数据集。

见到训练样本就能容易地理解算法的输入,并且我们可以通过这些数据来进行逻辑回归分类器的培训;进而通过已建立好的模型对新的样本进行识别(即为检测样本)。

从逻辑回归的参数形式,式子(1)我们可以看到逻辑回归模型中有两个待定参数a(x的系数)和b(常数项),我们现在给出来的数据有两个特征x1, x2,因此整个模型就增加了一项:ax1 + cx2 + b。为了形式上的统一,我们使用带下标的a表示不同的参数(a0表示常数项b并作x0的参数<x0=1>,a1、a2分别表示x1和x2的参数),就可以得到:

统一之后就可以将这些内容以矩阵形式来表示(相比之前采用的线性展开方式,用矩阵形式来表示模型及其参数更为便捷,其运算效率也显著提高

将上面的式子带入到(1)式,我们就可以得到逻辑回归的另一种表示形式了:

当前时刻(t),我们能够观察到后续的行为步骤都是围绕着确定一个恰当的参数向量a展开的。具体而言,在面对一个新的输入样本X(即一个新的数据向量),我们的目标是通过一系列计算步骤输出一个分类结果y∈{0,1}。

注:数据具有二维属性,在这一组观察样本中存在两个自变量,并有两个特征 feature。

3. 训练分类器


在逻辑回归模型中,在监督学习方法下依赖于正确标注的数据集进行训练的过程中,我们通过求解损失函数(2)式的极小化问题来确定参数向量a(回归系数),使得预测输出h(a)能够尽可能接近真实分类结果y。这些数据集被划分为两个类别(二分类任务),每个样本包含观察值/测量值以及对应的分类结果。在训练阶段的具体操作中,在给定训练样本的情况下,我们需要利用模型结构和优化算法来找到合适的参数向量a(回归系数),使得基于前两列数据计算出的预测输出h(a)能够最有效地逼近真实分类结果y。

该过程用于计算回归系数a的值,并参考了《机器学习实战》中的代码实现,并对其进行了微调

其中需要计算参数梯度(即目标函数关于各个参数的偏导数),具体推导过程可参考此处

复制代码
复制代码
    0
复制代码

上面代码的输出如下:

一个集合由两个子数组构成:第一个子数组由所有训练样本的观测值组成,并且用X表示这些变量;第二个子数组则对应每个观测值的标准答案y。

复制代码
  • 本次预测出来的回归系数a,包括a0, a1, a2
复制代码

*基于回归系数α以及(2)式中的模型计算得出的h(α)。这些预测结果都是区间(0, 1)内的实数值。

复制代码
复制代码
复制代码

如何将预测到的结果与标准答案y进行比较呢?我们设定一个阈值取值为0.5,并根据这一设定对预测结果进行分类处理:当预测结果大于该阈值时,则将其归类为类别1;当预测结果小于或等于该阈值时,则将其归类为类别0。从而实现数据二分类的任务。通过验证可以观察到,在当前的数据集下(仅包含十个样本),我们的分类模型表现尚可:类别1中不仅包含了原来标记y=1的所有正确实例(共两个),同时还出现了少量误分情况(即原本标记应为y=0但被误判为属于类别1)。而另一类别则则包含了所有原始标记y=0的样本以及一个被误分类的y=1样本。

4. 结果展示


我们之前已经计算出一组回归系数,并确定了各类别数据之间的分隔线。通过分析X内部的数据联系(即x1与x2之间的关系),我们可以绘制出这个分隔线,并能直观地感受到分类的效果。

添加下面一段代码:

复制代码
复制代码
复制代码

为了去除上面test_logistic_regression()函数的最后一行注释代码,在执行该函数后即可观察到分类效果。

这里解释这一行代码的功能:在第19行中定义了sigmoid函数的输出范围为1/2。也就是说,在模型中设定分类边界为0.5来区分不同的预测结果。这样就能明确确定最终预测结果的分类依据。

假设-a TX=0,则可以进一步推导出变量关系式:x_2 = \frac{-a_0 x_0 - a_1 x_1}{a_2}。如前所述,在第19行中已经讨论过相关内容。具体而言,在这个语境中变量y实际上是x_2的代表,而x被定义为x_1的值。因此下图详细表明了x_1x_2之间的相互作用机制。

分类效果图如下:

这组红色标记的点原本应属于y=1的数据集中的样本之一,并且其中一个被错误分类。这相当于将所有数据以(x₁, x₂)二维坐标的形式展示出来,并根据回归参数绘制出的一条直线将这些点一分为二。如果有一个新的样本需要判断类别,则只需将其绘制在图上,并查看其位于这条直线哪一侧即可完成分类。

下面是使用90个训练样本得到的结果:

可以观察到明显的规律表明:y=1类别中的样本(以红色标记)在x₂维度上呈现较小值特征,在x₂相近情况下则表现出较大的x₁坐标值

此时计算出来的回归系数a为:

复制代码

5. 预测新样本


添加一个预测函数,如下:

将之前计算出的回归系数a直接用于后续操作中,并考虑到实际应用中可能会遇到的问题与挑战。实际上来自《机器学习实战》这本书的数据集被用作测试集,在进行模型评估时采用了留出法的方法论框架。具体而言,在该过程中将该数据集拆分为两份:其中前90行作为训练数据用于模型参数优化阶段;而后10行作为测试集用于模型性能评估阶段。

复制代码

调用上面的函数,可以得到以下结果,即h(a):

复制代码
复制代码
复制代码

下面是我们的测试数据(原来的训练样本后十行的数据,包括标准答案y):

复制代码
复制代码
复制代码

对比我们的预测结果h(a)与真实答案y,在设定临界点为0.5的情况下,使用前90个样本训练出的分类器成功识别了后续10个样本。

附件:

完整代码示例:https://github.com/OnlyBelter/Machine Learning Examples/tree/master/main分支/de novo regression

训练样本用于逻辑回归模型的学习过程中的数据集路径为https://github.com/OnlyBelter/MachineLearning_examples/blob/master/de_novo/data/Logistic_Regression-trainingSample.txt

学习样本:下载路径 https://github.com/OnlyBelter/MachineLearning_examples/blob/master/de_novo/data/Logistic_Regression-testingSample.txt

参考:

http://baike.baidu.com/item/logistic回归

https://en.wikipedia.org/wiki/Sigmoid_function

《Machine Learning Practical》, Peter Harington, 译者:李锐等, 人民邮电出版社, 2013年6月首次出版.

全部评论 (0)

还没有任何评论哟~