Logistic Regression In Python 简明教程

Logistic Regression in Python - Quick Guide

Logistic Regression in Python - Introduction

逻辑回归是一种用于对对象进行分类的统计方法。本章将借助一些示例介绍逻辑回归。

Classification

要理解逻辑回归,您应该知道分类的含义。让我们考虑以下示例以更好地理解这一点 −

  1. 医生将肿瘤分类为恶性或良性。

  2. 银行交易可能是欺诈性的或真实的。

多年来,人类一直在执行此类任务——尽管它们容易出错。问题是我们能否训练机器以更高的准确性为我们执行这些任务?

机器执行分类的一个示例是您机器上的电子邮件 Client 程序,它将每封传入邮件归类为“垃圾邮件”或“非垃圾邮件”,并且它的准确性相当高。逻辑回归的统计技术已成功应用于电子邮件客户端。在这种情况下,我们已经训练我们的机器来解决分类问题。

逻辑回归只是用于解决此类二元分类问题的机器学习的一个部分。还有其他几种机器学习技术已经开发出来并用于解决其他类型的问题。

如果您已经注意到,在以上所有示例中,预测的结果只有两个值——是或否。我们称之为类别——所以我们说我们的分类器将对象分类为两个类别。从技术角度讲,我们可以说结果或目标变量本质上是二分的。

在其他分类问题中,输出可能被分类成多于两个的类别。例如,给定一篮子水果,要求你将不同种类的水果分拣出来。现在,篮子可能装着橘子、苹果、芒果,等等。所以当你分拣水果时,你要将它们分拣成两类以上。这是多变量分类问题。

Logistic Regression in Python - Case Study

假设一家银行拜托您开发一个机器学习应用程序,帮助他们识别出很有可能在该银行开定期存款(一些银行也称定期存款)的潜在客户。该银行会定期通过电话或网络表单进行调查,收集潜在客户的信息。该调查的性质是通用的,面向非常广泛的受众,他们中许多人可能对在该银行办理业务并不感兴趣。在剩余的人中,只有少部分人可能对开定期存款感兴趣。其他人可能对银行提供的其他服务感兴趣。因此,该调查不一定专门用于识别开定期存款的客户。您的任务是从银行即将与您分享的庞大调查数据中识别出所有开定期存款可能性较高的客户。

幸运的是,对于那些渴望开发机器学习模型的人来说,这类数据是公开的。这些数据是由加州大学欧文分校的一些学生在得到资助的情况下准备的。该数据库是 UCI Machine Learning Repository 的一部分,世界各地的学生、教育者和研究人员都在广泛使用。可以从 here 下载数据。

在接下来的章节中,让我们使用相同的数据执行应用程序开发。

Setting Up a Project

在本章中,我们将详细了解在 Python 中设置一个用于执行逻辑回归的项目的过程中涉及的步骤。

Installing Jupyter

我们将使用 Jupyter——机器学习中最广泛使用的平台之一。如果你还没有在你的机器上安装 Jupyter,请从 here 下载。你可以按照它们网站上的说明来安装这个平台。正如该网站所建议的,你可能更愿意使用 Anaconda Distribution ,它与 Python 以及许多常用的用于科学计算和数据科学的 Python 软件包一起提供。这将避免了单独安装这些软件包的需要。

在成功安装 Jupyter 之后,创建一个新项目,你现在屏幕上的样子应该像下面这样,准备接受你的代码。

jupyter

现在,通过点击标题名称并编辑,将项目的名称从 Untitled1 to “Logistic Regression” 更改。

首先,我们将导入我们在代码中需要的几个 Python 软件包。

Importing Python Packages

为此,在代码编辑器中键入或粘贴以下代码 −

In [1]: # import statements
   import pandas as pd
   import numpy as np
   import matplotlib.pyplot as plt

   from sklearn import preprocessing
   from sklearn.linear_model import LogisticRegression
   from sklearn.model_selection import train_test_split

此时,你的 Notebook 应该像下面这样 −

notebook

通过点击 Run 按钮来运行代码。如果没有生成任何错误,说明你已成功安装 Jupyter,现在准备好进行其余的开发工作。

前三个 import 语句在我们的项目中导入了 pandas、numpy 和 matplotlib.pyplot 软件包。接下来的三个语句从 sklearn 导入了指定的模块。

我们的下一个任务是下载项目所需的数据。我们将在下一章学习它。

Logistic Regression in Python - Getting Data

本章详细讨论了在 Python 中获取数据来执行逻辑回归所涉及的步骤。

Downloading Dataset

如果您还没有下载之前提到的 UCI 数据集,请立即从 here 下载。单击数据文件夹。您将看到以下屏幕:

machine learning databases

单击给定的链接下载 bank.zip 文件。该 zip 文件包含以下文件:

bank

我们将使用 bank.csv 文件进行模型开发。bank-names.txt 文件包含您稍后将需要了解的数据库说明。bank-full.csv 包含更大的数据集,您可以使用该数据集进行更高级的开发。

这里我们已经在可下载源代码文件中包含了 bank.csv 文件。该文件包含以逗号分隔的字段。我们还在文件中做了一些修改。建议您使用项目源 zip 文件中包含的文件来学习。

Loading Data

要从刚复制的 csv 文件加载数据,请键入以下语句并运行代码。

In [2]: df = pd.read_csv('bank.csv', header=0)

您还可以通过运行以下代码语句检查加载的数据:

IN [3]: df.head()

运行命令后,您将看到以下输出:

loaded data

它基本上打印了已加载数据的最初五行。检查存在的 21 列。我们将只使用其中的几列来进行模型开发。

接下来,我们需要清理数据。数据可能包含一些带有 NaN 的行。使用以下命令可以消除此类行 −

IN [4]: df = df.dropna()

幸运的是,bank.csv 不包含任何带有 NaN 的行,所以我们在案例中确实不需要这一步。但是,通常很难在海量数据库中发现此类行。所以始终最好运行上述语句来清理数据。

Note − 你可以随时使用以下语句轻松查看数据大小 −

IN [5]: print (df.shape)
(41188, 21)

行数和列数将以第二行以上所示的格式打印在输出中。

接下来要做的是检查每列是否适合我们尝试构建的模型。

Logistic Regression in Python - Restructuring Data

每当某个组织进行调查时,他们尝试从顾客那里收集尽可能多的信息,其设想是这些信息可以以这种或另一种方式对组织在未来某个时刻有用。要解决当前问题,我们必须找出与我们的问题直接相关的信息。

Displaying All Fields

现在,让我们看看该如何选择对我们有用的数据字段。在代码编辑器中运行以下语句。

In [6]: print(list(df.columns))

您将看到以下输出 −

['age', 'job', 'marital', 'education', 'default', 'housing', 'loan',
'contact', 'month', 'day_of_week', 'duration', 'campaign', 'pdays',
'previous', 'poutcome', 'emp_var_rate', 'cons_price_idx', 'cons_conf_idx',
'euribor3m', 'nr_employed', 'y']

输出显示数据库中所有列的名称。最后一列“y”是布尔值,表示该顾客在银行是否存有定期存款。该字段的值可能是“y”或“n”。您可以在下载的数据中作为银行名称.txt文件的一部分下载每个列的描述和用途。

Eliminating Unwanted Fields

在检查列名称时,您将知道某些字段与当前问题无关。例如,诸如 month, day_of_week 、campaign 等字段对我们毫无用处。我们将从数据库中去掉这些字段。要删除列,可以使用下降命令,如下所示:

In [8]: #drop columns which are not needed.
   df.drop(df.columns[[0, 3, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19]],
   axis = 1, inplace = True)

该命令表示删除列编号 0、3、7、8 等。要确保正确选择索引,请使用以下语句:

In [7]: df.columns[9]
Out[7]: 'day_of_week'

这会打印给定索引的列名称。

在删除不需要的列之后,使用 head 语句检查数据。屏幕输出如下所示:

In [9]: df.head()
Out[9]:
      job   marital  default  housing  loan  poutcome    y
0     blue-collar    married  unknown yes no nonexistent 0
1     technician     married  no    no    no nonexistent 0
2     management     single   no    yes   no success     1
3     services       married  no    no    no nonexistent 0
4     retired        married  no    yes   no success     1

现在,我们只剩下我们觉得对我们的数据分析和预测很重要的字段了。 Data Scientist 的重要性在这一步骤中很明显。数据科学家必须选择合适的列来构建模型。

例如,虽然乍看之下 job 的类型并不能让所有人都相信有必要将其包含在数据库中,但它将是一个非常有用的字段。并非所有类型的顾客都会开定期存款。低收入人群可能不会开定期存款,而高收入人群通常会将多余的钱存入定期存款。因此,在这个场景中,职业类型变得非常重要。同样,仔细选择您认为对您的分析有用的列。

在下一章中,我们将准备数据以构建模型。

Logistic Regression in Python - Preparing Data

为了创建分类器,我们必须以分类器构建模块所要求的格式准备数据。我们通过执行 One Hot Encoding 准备数据。

Encoding Data

我们将在下文中讨论我们所说的数据编码。首先,让我们运行代码。在代码窗口中运行以下命令。

In [10]: # creating one hot encoding of the categorical columns.
data = pd.get_dummies(df, columns =['job', 'marital', 'default', 'housing', 'loan', 'poutcome'])

正如注释中所说的,上述语句将创建数据的 One-Hot 编码。让我们看看创建了什么?通过打印数据库中的头部记录来检查创建的数据称为 “data”

In [11]: data.head()

您将看到以下输出 −

created data

为了理解上述数据,我们将通过运行 data.columns 命令列出列名称,如下所示 −

In [12]: data.columns
Out[12]: Index(['y', 'job_admin.', 'job_blue-collar', 'job_entrepreneur',
'job_housemaid', 'job_management', 'job_retired', 'job_self-employed',
'job_services', 'job_student', 'job_technician', 'job_unemployed',
'job_unknown', 'marital_divorced', 'marital_married', 'marital_single',
'marital_unknown', 'default_no', 'default_unknown', 'default_yes',
'housing_no', 'housing_unknown', 'housing_yes', 'loan_no',
'loan_unknown', 'loan_yes', 'poutcome_failure', 'poutcome_nonexistent',
'poutcome_success'], dtype='object')

现在,我们将解释 get_dummies 命令如何执行 One-Hot 编码。新生成数据库中的第一列是“y”字段,它表示此客户是否已订阅 TD。现在,让我们看看已编码的列。第一个编码列是 “job” 。在数据库中,你会发现“job”列具有许多可能的值,例如“admin”、“blue-collar”、“entrepreneur”等。对于每一个可能的值,我们在数据库中创建了一个新列,其列名称附加为前缀。

因此,我们有名为“job_admin”、“job_blue-collar”等列。对于我们原始数据库中的每个编码字段,你将在创建的数据库中找到一个列列表,其中包含该列在原始数据库中所采用的所有可能的值。仔细检查列列表,了解数据如何映射到新数据库。

Understanding Data Mapping

为了理解生成的数据,让我们使用 data 命令打印出所有数据。运行该命令后的部分输出如下所示。

In [13]: data
understanding data mapping

上屏显示前十二行。如果你继续向下滚动,你会看到所有行的映射都已完成。

为了快速方便地参考,下面显示了数据库中更靠下的部分屏幕输出。

quick reference

为了理解已映射的数据,让我们检查第一行。

mapped data

它表示此客户未订阅 TD,如“y”字段中的值所示。它还表示此客户是一个“blue-collar”客户。水平滚动下来,它将告诉你他有一套“住房”,并且没有贷款“loan”。

在 One-Hot 编码之后,我们需要一些更多的数据处理,然后再开始构建模型。

Dropping the “unknown”

如果我们检查映射数据库中的列,你会发现一些以“unknown”结尾的列。例如,使用屏幕截图中所示的以下命令检查索引 12 处的列 −

In [14]: data.columns[12]
Out[14]: 'job_unknown'

这表示指定客户的工作未知。显然,在我们的分析和模型构建中没有必要包含这样的列。因此,应删除所有带有“unknown”值的列。这是使用以下命令完成的 −

In [15]: data.drop(data.columns[[12, 16, 18, 21, 24]], axis=1, inplace=True)

确保你指定正确的列号。如有疑问,你随时可以通过指定列命令中如上所述的索引来检查列名。

删除不需要的列后,你可以检查最终的列列表,如下所示:

In [16]: data.columns
Out[16]: Index(['y', 'job_admin.', 'job_blue-collar', 'job_entrepreneur',
'job_housemaid', 'job_management', 'job_retired', 'job_self-employed',
'job_services', 'job_student', 'job_technician', 'job_unemployed',
'marital_divorced', 'marital_married', 'marital_single', 'default_no',
'default_yes', 'housing_no', 'housing_yes', 'loan_no', 'loan_yes',
'poutcome_failure', 'poutcome_nonexistent', 'poutcome_success'],
dtype='object')

此时,我们的数据已准备好进行模型构建。

Logistic Regression in Python - Splitting Data

我们有大约四万一千条记录。如果我们将所有数据用于模型构建,我们将没有数据用于测试。因此,通常我们将整个数据集分成两部分,比如说 70/30 的百分比。我们将 70% 的数据用于模型构建,其余用于测试我们创建模型预测中的精确度。你可以根据你的要求使用不同的分割比例。

Creating Features Array

在我们分割数据之前,我们将数据分成两个数组 X 和 Y。X 数组包含我们要分析的所有特征(数据列),而 Y 数组是一个布尔值的一维数组,它就是预测的输出结果。为了理解这一点,让我们运行一些代码。

首先,执行以下 Python 语句来创建 X 数组:

In [17]: X = data.iloc[:,1:]

要检查 X 的内容,请使用 head 打印几个初始记录。以下屏幕显示 X 数组的内容。

In [18]: X.head ()
initial records

该数组有几行和 23 列。

接下来,我们将创建包含“ y ”值的输出数组。

Creating Output Array

要创建一个用于预测值列的数组,请使用以下 Python 语句 −

In [19]: Y = data.iloc[:,0]

通过调用 head 来检查其内容。以下屏幕输出显示结果 −

In [20]: Y.head()
Out[20]: 0   0
1    0
2    1
3    0
4    1
Name: y, dtype: int64

现在,使用以下命令分割数据 −

In [21]: X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0)

这将创建名为 X_train, Y_train, X_test, and Y_test 的四个数组。与之前一样,您可以使用 head 命令检查这些数组的内容。我们将使用 X_train 和 Y_train 数组训练我们的模型,使用 X_test 和 Y_test 数组测试和验证。

现在,我们准备构建分类器。我们将在下一章中了解它。

Logistic Regression in Python - Building Classifier

你不需要从头构建分类器。构建分类器很复杂,需要具备多个领域的知识,例如统计学、概率论、优化技术等等。市场上有几个预先构建的库,它们有经过充分测试的高效分类器实现。我们将使用 sklearn 中的一个这样的预先构建的模型。

The sklearn Classifier

从 sklearn 工具箱创建逻辑回归分类器非常简单,只需像这里所示的那样用一个程序语句完成 −

In [22]: classifier = LogisticRegression(solver='lbfgs',random_state=0)

创建分类器后,你将把你训练的数据输入到分类器中,这样它可以调整其内部参数,并准备好对你的未来数据进行预测。为了调整分类器,我们运行以下语句 −

In [23]: classifier.fit(X_train, Y_train)

分类器现在准备好了进行测试。以下代码是上面两个语句执行的输出 −

Out[23]: LogisticRegression(C = 1.0, class_weight = None, dual = False,
   fit_intercept=True, intercept_scaling=1, max_iter=100,
   multi_class='warn', n_jobs=None, penalty='l2', random_state=0,
   solver='lbfgs', tol=0.0001, verbose=0, warm_start=False))

现在,我们准备测试创建的分类器。我们将在下一章中处理这个问题。

Logistic Regression in Python - Testing

我们需要在将上述创建的分类器投入生产使用之前对其进行测试。如果测试显示模型未达到所需精度,我们必须回到上述流程中,选择另一组特征(数据字段),重新构建模型并对其进行测试。这将是一个迭代步骤,直到分类器满足所需的精度要求。因此,让我们测试我们的分类器。

Predicting Test Data

为了测试分类器,我们使用前面阶段中生成测试数据。我们对创建对象调用 predict 方法,并将测试数据 X 数组传递给下列命令:

In [24]: predicted_y = classifier.predict(X_test)

这将为整个训练数据集生成一个一维数组,提供 X 数组中每一行预测。你可使用以下命令检查此数组:

In [25]: predicted_y

以下是执行以上两个命令的输出:

Out[25]: array([0, 0, 0, ..., 0, 0, 0])

输出表明第一个和最后三个客户并不是 Term Deposit 的潜在候选人。你可以检查整个数组以找出潜在客户。为此,请使用以下 Python 代码段:

In [26]: for x in range(len(predicted_y)):
   if (predicted_y[x] == 1):
      print(x, end="\t")

运行以上代码的输出显示如下:

term deposit

输出显示所有行的索引,这些行是订阅定期存款的潜在候选人。你现在可以将此输出交给银行的营销团队,由该团队获取所选行中每个客户的联系方式并继续其工作。

在我们把这个模型投入生产之前,我们需要验证预测精度。

Verifying Accuracy

要测试模型的精度,请在分类器上使用以下所示的得分方法:

In [27]: print('Accuracy: {:.2f}'.format(classifier.score(X_test, Y_test)))

运行此命令的屏幕输出如下所示:

Accuracy: 0.90

它显示我们模型的精度为 90%,在大多数应用程序中这被认为非常好。因此,不需要进一步调整。现在,我们的客户已准备好运行下一个活动,获得潜在客户列表,并追逐他们开设定期存款,成功率可能很高。

Logistic Regression in Python - Limitations

正如你从上面的示例中看到的,将逻辑回归应用于机器学习并不是一项困难的任务。但是,它有其自身的局限性。逻辑回归无法处理大量的分类特征。在迄今为止我们讨论的示例中,我们将特征数量减少到了很大程度。

但是,如果这些特征对我们的预测很重要,我们会被迫包含它们,但这样的话逻辑回归将无法给予我们良好的精度。逻辑回归也容易过拟合。它不适用于非线性问题。对于与目标无关且相互关联的自变量,它的表现会很差。因此,你必须仔细评估逻辑回归对你试图解决的问题的适用性。

机器学习的许多领域都指定了其他技术。举几个例子,我们有诸如 k 最近邻 (kNN)、线性回归、支持向量机 (SVM)、决策树、朴素贝叶斯等等算法。在最终确定某个特定模型之前,你必须评估这些各种技术对我们试图解决的问题的适用性。

Logistic Regression in Python - Summary

逻辑回归是一种二元分类的统计技术。在本教程中,你学习了如何训练机器使用逻辑回归。创建机器学习模型时,最重要的要求是数据可用性。如果没有足够且相关的数据,就不能让机器学习。

一旦有了数据,你的下一个主要任务是清理数据,消除不需要的行、字段,并选择适合模型开发的字段。完成后,你需要将数据映射到分类器训练所需的格式。因此,数据准备是任何机器学习应用程序的主要任务。一旦准备好了数据,就可以选择特定类型的分类器。

在本教程中,你学习了如何使用 sklearn 库中提供的逻辑回归分类器。为了训练分类器,我们使用约 70% 的数据来训练模型。我们使用剩余的数据进行测试。我们测试模型的准确性。如果这不在可接受的范围内,我们会重新选择新的特征集。

再次按照准备数据、训练模型和测试它等整个过程进行操作,直到你对它的准确性满意为止。在开始任何机器学习项目之前,你必须学习和接触到目前为止已开发并已在行业中成功应用的各种技术。