1. 首页
  2. 技术文章

Python中如何实现Logistic回归

Logistic回归是用于两类问题的线性分类算法。

Python中如何实现Logistic回归

即使违反了该方法对数据的期望,它也易于实现,易于理解,并且在各种问题上都取得了很好的效果。

在本教程中,您将发现如何使用Python从头开始进行具有随机梯度下降的逻辑回归。

完成本教程后,您将知道:

  • 如何使用逻辑回归模型进行预测。
  • 如何使用随机梯度下降法估算系数。
  • 如何将逻辑回归应用于实际的预测问题。

描述

本节将简要介绍我们将在本教程中使用的逻辑回归技术,随机梯度下降和Pima Indians糖尿病数据集。

逻辑回归

Logistic回归是为方法核心使用的函数Logistic函数而命名的。

Logistic回归使用方程式作为表示形式,与线性回归非常相似。输入值(X)使用权重或系数值线性组合以预测输出值(y)。

与线性回归的主要区别在于,要建模的输出值是二进制值(0或1),而不是数字值。

可以简化为:

其中e是自然对数的底数(欧拉数),yhat是预测的输出,b0是偏差或截距项,b1是单个输入值(x1)的系数。

yhat预测是介于0和1之间的实数值,需要将其四舍五入为整数值并映射到预测的类值。

输入数据中的每一列都有一个相关的b系数(恒定的实数值),必须从您的训练数据中学习。您将存储在内存或文件中的模型的实际表示形式是方程式中的系数(β值或b)。

必须从您的训练数据中估算逻辑回归算法的系数。

随机梯度下降

梯度下降是通过遵循成本函数的梯度来最小化函数的过程。

这涉及到了解成本和微分的形式,以便从给定的点知道梯度,并且可以沿该方向移动,例如下坡到最小值。

在机器学习中,我们可以使用一种称为“随机梯度下降”的技术来评估和更新每次迭代的系数,以最大程度地减少模型在训练数据上的误差。

该优化算法的工作方式是一次将每个训练实例显示给模型。该模型对训练实例进行预测,计算误差并更新模型,以减少下一个预测的误差。

此过程可用于查找模型中的一组系数,这些系数会导致模型在训练数据上的最小误差。每次迭代,使用以下公式更新机器学习语言中的系数(b):

其中b是要优化的系数或权重,learning_rate是您必须配置的学习率(例如0.01),(y – yhat)是模型对归因于权重的训练数据的预测误差,yhat是所做的预测乘以系数,x为输入值。

皮马印第安人糖尿病数据集

皮马印第安人数据集包括在提供基本医疗详细信息的情况下预测5年内皮马印第安人的糖尿病发作。

  • 数据集文件。
  • 数据集详细信息。

这是一个二元分类问题,其中预测为0(无糖尿病)或1(糖尿病)。

它包含768行和9列。文件中的所有值都是数字,特别是浮点值。以下是问题的前几行的一小部分示例。

预测多数类(零规则算法),该问题的基准性能为65.098%分类准确度。

下载数据集,并使用文件名pima-indians-diabetes.csv保存到当前工作目录。

教程

本教程分为三部分。

  1. 做出预测。
  2. 估计系数。
  3. 糖尿病的预测。

这将为您实施和将Logistic回归以及随机梯度下降应用于您自己的预测建模问题提供基础。

1.做出预测

第一步是开发可以进行预测的功能。

在随机梯度下降中评估候选系数值时以及在模型最终确定后都将需要此方法,我们希望开始对测试数据或新数据进行预测。

下面是一个名为predict()的函数,该函数在给定一组系数的情况下预测一行的输出值。

输入中的第一个系数始终是截距,也称为偏差或b0,因为它是独立的并且不负责特定的输入值。

我们可以设计一个小的数据集来测试我们的prepare()函数。

以下是使用不同颜色的数据集图,以显示每个点的不同类别。

小型人为分类数据集

小型人为分类数据集

我们还可以使用先前准备的系数对此数据集进行预测。

将所有这些放在一起,我们可以在下面测试我们的predict()函数。

有两个输入值(X1和X2)和三个系数值(b0,b1和b2)。我们为此问题建模的预测方程为:

或者,使用我们手动选择的特定系数值作为:

运行此函数,我们得到的预测与预期的输出(y)值相当接近,并且在四舍五入时对类进行了正确的预测。

现在,我们准备执行随机梯度下降以优化系数值。

2.估计系数

我们可以使用随机梯度下降来估计训练数据的系数值。

随机梯度下降需要两个参数:

  • 学习率:用于限制每次更新系数时对其进行校正的数量。
  • 时期:更新系数时遍历训练数据的次数。

这些以及训练数据将成为函数的参数。

我们需要在函数中执行3个循环:

  1. 循环遍历每个纪元。
  2. 在训练数据中的每一行上循环一个历元。
  3. 循环遍历每个系数,并将其更新为一个时期中的一行。

如您所见,我们在每个时期更新训练数据中每一行的每个系数。

系数根据模型产生的误差进行更新。将误差计算为预期输出值与使用候选系数进行的预测之间的差。

每个输入属性都有一个权重系数,这些系数将以一致的方式进行更新,例如:

列表开头的特殊系数(也称为截距)以类似的方式更新,除了没有输入外,因为它不与特定的输入值相关联:

现在,我们可以将所有这些放在一起。下面是一个名为coefficients_sgd()的函数,该函数使用随机梯度下降来计算训练数据集的系数值。

您可以看到,此外,我们还跟踪每个时期的平方误差(正值)的总和,以便可以在每个外部循环中打印出一条不错的消息。

我们可以从上方在相同的小型人为数据集上测试此功能。

我们使用较大的0.3的学习率,并将模型训练100个时期,或将系数暴露在整个训练数据集中100次。

运行示例将在每个时期打印一条消息,其中包含该时期的平方和和最终系数集。

您可以看到即使在最后一个时期,错误如何继续减少。我们可能会训练更长的时间(更多的时间段),或者增加每次更新系数的数量(更高的学习率)。

进行实验,看看你想出什么。

现在,让我们将此算法应用于真实数据集。

3.糖尿病预测

在本节中,我们将在糖尿病数据集上使用随机梯度下降训练逻辑回归模型。

该示例假定数据集的CSV副本位于当前工作目录中,文件名为pima-indians-diabetes.csv

首先加载数据集,将字符串值转换为数字,并将每一列标准化为0到1范围内的值。这可以通过帮助程序函数load_csv()str_column_to_float()来加载和准备数据集,并准备好dataset_minmax( )normalize_dataset()对其进行规范化。

我们将使用k倍交叉验证来评估学习模型在看不见的数据上的性能。这意味着我们将构建和评估k个模型,并将性能评估为平均模型性能。分类准确性将用于评估每个模型。这些行为在cross_validation_split()precision_metric ()valuate_algorithm ()帮助函数中提供。

我们将使用上面创建的predict()coefficients_sgd()函数和新的 logistic_regression()函数来训练模型。

以下是完整的示例。

使用k值5进行交叉验证,从而使每次折叠768/5 = 153.6或刚好超过150条记录可以在每次迭代时进行评估。通过少量实验选择了0.1和100个训练时期的学习率。

您可以尝试自己的配置,看看是否可以超过我的分数。

运行此示例将打印5个交叉验证折叠中每一个的得分,然后打印平均分类准确性。

我们可以看到,如果我们仅使用零规则算法预测多数类别,则准确性约为77%,高于基线值65%。

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ1841324605,本站将立刻清除。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

服务热线:130-0886-1890

QR code