本文应用场景
本文将使用一批患者的心脏检查样本数据(附件中的 StatlogHeart.csv 文件),让程序学习这些样本数据,来得到一个较好的心脏病预测模型。下面的表 1 中摘取了一小部分这些患者心脏检查样本数据:
表 1. 部分患者心脏检查样本数据
在表 1 中,每行是一个样本,除最后一列外,前面的列都是患者的相关检查数据,最后一列是医生检查结果,1 代表无心脏病,2 代表患有心脏病,我们要让机器学习这些样本后得到一个模型,这个模型可以输入样本表格之外的数据,预测出患者是否会患有心脏病及其概率大小。有很多实现这样的二分类预测的模型算法,如逻辑回归、支持向量机和神经网络等,本文通过比较基本的逻辑回归算法来实现,后续文章中会介绍通过神经网络等算法来解决稍微复杂的问题。
逻辑回归简介
首先我们简单介绍下逻辑回归(Logistic Regression),逻辑回归是机器学习中一个非常常见的模型,在实际生产环境中也会经常被使用,常用于数据挖掘、疾病自动诊断和经济预测等领域。例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。逻辑回归最常用于分类,主要用于两分类问题(即输出只有两种,分别代表两个类别),并且能够指明每个分类事件发生的概率。通过表 1 的数据,我们的目标是建立一个逻辑回归模型,如下图 1 所示:
图 1. 逻辑回归
当输入患者的心脏检查数据 x,能够预测其是否患有心脏病及其概率,假设其模型公式为 y = f(x),则对于逻辑回归,通过函数 f 运算后,y 应该是一个介于 0 和 1 之间的值,越趋于 1,则可能是有心脏病的,并且其对应的 y 值就是发生的概率,反之越趋于 0,则是没有心脏病的事件发生的概率大。
建立逻辑回归模型的步骤
我们按照以下三个基本步骤,来分析和建立逻辑回归模型:
构造假设函数(即 H 函数)
构造损失函数(即 J 函数)
通过某种方法使得损失函数最小,并求得此时的参数θ
构造假设函数
我们的目标是类似预测心脏病发生的概率这样的二分类模型,即要么发生(发生概率趋于 1),要么不发生(发生概率趋于 0)。Sigmoid 函数就能很好的实现这个目的,Sigmoid 函数形式为:
这个函数的图形如下图 2 所示,是一个 S 型曲线,随着自变量 z 的变化,因变量 g 的值在 0 到 1 之间。
图 2. Sigmoid 函数曲线
Sigmoid 函数将输入 z 转化为一个 0 到 1 之间的数,正好对应为概率的值,g(z)越趋近于 1,表示结果为 1 的概率越大,且概率值就等于 g(z),反之,当 g(z)越趋近于 0,表示结果为 0 的概率越大,且概率值等于 1- g(z)。有了 Sigmoid 函数,我们可以构造预测函数了,在上一篇文章《机器学习代码实战:使用线性回归检测水泥质量》中,我们介绍了有多个自变量的线性回归的公式可表示为:
而本文介绍的逻辑回归,同样有多个自变量 x,即患者的各项检查数据,以及一个偏移量 b,但由于要实现二分类,不能像线性回归那样直接将 x 与参数θ的点积作为结果,而是将点积作为自变量带入到 Sigmoid 函数中计算出 y 值,则计算出的结果为 0 到 1 之间的数,即概率的值。将偏移量 b 合并到参数θ中用 表示,并且多加一个对应的自变量 (
恒等于 1),则自变量 x 与参数θ用向量分别表示为:
那么,逻辑回归的假设函数为:
这个假设函数就是我们的模型函数了,我们希望有一组参数θ,带入到这个模型后,使得输入的样本 x 经过计算后,得到的结果尽可能的趋近于实际结果 y 的值(1 或者 0),为了使这个模型预测的概率尽量准确,接下来要构造损失函数来计算模型预测的准确性。
构造损失函数
线性回归中我们使用了最小二乘法来构造损失函数,在逻辑回归中道理类似,我们期望通过假设函数计算后的结果与实际结果值(1 或者 0)尽可能的接近,则该假设函数的参数就是我们想要的一组参数。而与实际结果值越接近,就代表值为 1 或者 0 的概率应该尽量最大,所以将问题转化为概率来讨论,上面的假设函数 h 的值即表示结果取 1 的概率,对于结果为 1 和 0 的概率分别为:
将这两个公式合二为一:
这里将两个公式合二为一非常巧妙,使得原本要求 2 个概率的问题转变为只需求 1 个概率,这样能简化后续的计算。如前所述,我们要求一组参数θ使得概率 P 最大,而似然函数就用来求参数θ的,所以对上述公式取似然函数就得到一个初始的损失函数:
为了在简便后续求导的过程,再对上述公式取对数似然函数,这不会影响计算结果:
则最终的损失函数为:
这里的 J(θ)就是最终的损失函数,与线性回归的区别是,这里是要求θ,使得 J(θ)即概率最大。对于曲线的极值,通过求偏导数为 0 解出θ。通过这个函数对所有样本进行计算,得到一个概率 J(θ),这个概率也称为损失。如前文所说,我们要让这个概率值尽量最大能得到模型公式最好的一组参数,也就是求 max J(θ)。
梯度下降求θ
在前篇文章《机器学习代码实战:使用线性回归检测水泥质量》中已经介绍了梯度下降(Gradient Descent),在逻辑回归中,我们同样可以使用梯度下降来求解最优的一组θ。具体方法,就是对上面公式 J(θ)中的参数求偏导数,得到这个参数对应维度最陡峭的方向,在乘以一个步长 a,就求出每次参数移动的大小:
完成上述公式的求导,最终得到每次迭代的参数更新公式:
其中,设 m 为样本条数,n 为每条样本的特征数,并且 0≤i≤m, 0≤j≤n。
公式中的 a 称为步长或者学习率,要注意几点:
每次迭代只对参数有比较小的更新,要经过多次迭代才能得到最终理想的参数。
如果步长太大,可能会在最低点附近徘徊,所以训练模型的时候要注意调整步长。
这个方法让你走到的不一定是整个曲面的最低点,可能只是局部最小,所以往往要考虑起点。