📜  Python的逻辑回归-快速指南

📅  最后修改于: 2020-12-13 14:08:03             🧑  作者: Mango


Logistic回归是对象分类的一种统计方法。本章将通过一些示例介绍逻辑回归。

分类

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

  • 医生将肿瘤分类为恶性或良性。
  • 银行交易可能是欺诈性的或真实的。

多年来,人类一直在执行此类任务-尽管它们容易出错。问题是我们可以训练机器为我们更好地完成这些任务吗?

这样的机器进行分类的示例是您机器上的电子邮件客户端,该电子邮件客户端将所有传入邮件分类为“垃圾邮件”或“非垃圾邮件”,并且做到了相当大的准确性。 Logistic回归统计技术已成功应用于电子邮件客户端。在这种情况下,我们已经训练了机器以解决分类问题。

Logistic回归只是用于解决这种二进制分类问题的机器学习的一部分。还有其他几种机器学习技术已经开发出来,并且正在实践中用于解决其他类型的问题。

如果您已经注意到,在上述所有示例中,谓词的结果只有两个值-是或否。我们将它们称为类-可以说我们说分类器将对象分为两个类。用技术术语来说,我们可以说结果或目标变量本质上是二分法的。

还有其他分类问题,其中输出可能被分类为两个以上的类。例如,给定装满水果的篮子,要求您分离不同种类的水果。现在,购物篮中可能装有橘子,苹果,芒果等。因此,当您分离出水果时,会将它们分成两个以上的类。这是一个多元分类问题。

Python的逻辑回归-案例研究

考虑到一家银行会与您联系,开发一种机器学习应用程序,这将帮助他们确定可能与他们一起开立定期存款(某些银行也称为定期存款)的潜在客户。银行定期通过电话或网络表格进行调查,以收集有关潜在客户的信息。该调查本质上是一般性的,针对的受众非常广泛,其中许多人可能不愿与该银行本身打交道。在其余的帐户中,只有少数几个有兴趣开设定期存款。其他人可能会对银行提供的其他服务感兴趣。因此,不一定需要进行调查来识别开通TD的客户。您的任务是从银行将与您共享的庞大调查数据中识别出所有可能开通TD的客户。

幸运的是,有这样一种数据可供有志开发机器学习模型的人使用。该数据是由加州大学欧文分校的一些学生在外部资助下准备的。该数据库可作为UCI机器学习存储库的一部分获得,并被全世界的学生,教育者和研究人员广泛使用。数据可以从这里下载。

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

建立一个项目

在本章中,我们将详细了解设置项目以在Python执行逻辑回归的过程。

安装Jupyter

我们将使用Jupyter-机器学习最广泛使用的平台之一。如果您的计算机上未安装Jupyter,请从此处下载。对于安装,您可以按照其网站上的说明安装平台。正如该站点所建议的那样,您可能更喜欢使用Python附带的Anaconda Distribution和用于科学计算和数据科学的许多常用Python软件包。这将减少单独安装这些软件包的需要。

成功安装Jupyter后,开始一个新项目,此阶段的屏幕如下所示,可以接受您的代码。

朱皮特

现在,通过单击标题名称并对其进行编辑,将项目名称从Untitled1更改为“ Logistic Regression”

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

导入Python包

为此,请在代码编辑器中键入或剪切以下代码-

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

您的笔记本在此阶段应如下所示:

笔记本

通过单击“运行”按钮运行代码。如果未生成任何错误,则说明您已经成功安装了Jupyter,现在可以进行其余的开发了。

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

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

Python的逻辑回归-获取数据

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

下载数据集

如果尚未下载前面提到的UCI数据集,请立即从此处下载。单击数据文件夹。您将看到以下屏幕-

机器学习数据库

通过单击给定的链接下载bank.zip文件。压缩文件包含以下文件-

银行

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

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

加载数据中

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

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

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

IN [3]: df.head()

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

加载的数据

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

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

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

幸运的是,bank.csv不包含任何带有NaN的行,因此在我们的情况下,此步骤并不是必需的。但是,通常很难在庞大的数据库中发现这样的行。因此,运行上面的语句来清理数据总是更安全的。

注意-您可以使用以下语句在任何时间点轻松检查数据大小-

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

如上面第二行所示,行和列的数量将被打印在输出中。

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

Python的逻辑回归-重组数据

每当任何组织进行调查时,他们都会尝试从客户那里收集尽可能多的信息,以为该信息在以后的某个时间点将以一种或另一种方式对组织有用。为了解决当前的问题,我们必须选择与我们的问题直接相关的信息。

显示所有字段

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

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”。您可以阅读bank-name.txt文件中作为数据的一部分下载的每一列的描述和用途。

消除不必要的领域

检查列名,您将知道某些字段对当前问题没有任何意义。例如,诸如month,day_of_week ,campaign等之类的字段对我们没有用。我们将从数据库中删除这些字段。要删除列,我们使用drop命令,如下所示:

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

现在,只有我们认为对我们的数据分析和预测很重要的领域。在这一步骤中,数据科学家的重要性得到了体现。数据科学家必须选择适当的列以进行模型构建。

例如,虽然乍一看工作的类型可能不会说服所有人都将其包含在数据库中,但这将是一个非常有用的领域。并非所有类型的客户都将打开TD。收入较低的人可能不会打开TD,而收入较高的人通常会把多余的钱存放在TD中。因此,在这种情况下,工作类型变得非常重要。同样,仔细选择您认为与分析相关的列。

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

Python的逻辑回归-准备数据

为了创建分类器,我们必须以分类器构建模块要求的格式准备数据。我们通过进行一次热编码来准备数据。

编码数据

我们将在短期内讨论编码数据的含义。首先,让我们运行代码。在代码窗口中运行以下命令。

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

如评论所述,以上语句将创建数据的一种热编码。让我们看看它创造了什么?通过在数据库中打印头记录来检查称为“数据”的创建数据。

In [11]: data.head()

您将看到以下输出-

创建的数据

为了理解上述数据,我们将通过运行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命令完成一种热编码。新生成的数据库中的第一列是“ y”字段,它指示此客户端是否已预订TD。现在,让我们看一下已编码的列。第一编码列是“ job” 。在数据库中,您会发现“职位”列具有许多可能的值,例如“管理员”,“蓝领”,“企业家”等等。对于每个可能的值,我们都会在数据库中创建一个新列,并在列名后面添加前缀。

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

了解数据映射

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

In [13]: data

了解数据映射

上面的屏幕显示了前十二行。如果向下滚动,您会看到所有行的映射均已完成。

在数据库下方显示了部分屏幕输出,以供您快速参考。

快速参考

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

映射数据

它表示此客户未按照“ y”字段中的值指示订阅TD。它还表明该客户是“蓝领”客户。水平向下滚动,它将告诉您他有一个“住房”,没有获得“贷款”。

经过这一热编码之后,我们需要更多的数据处理才能开始构建模型。

删除“未知”

如果我们检查映射数据库中的列,您会发现以“ unknown”结尾的几列。例如,使用屏幕快照中显示的以下命令检查索引12处的列-

In [14]: data.columns[12]
Out[14]: 'job_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')

至此,我们的数据已准备好用于模型构建。

Python的逻辑回归-拆分数据

我们有大约四万一千条记录。如果我们将全部数据用于模型构建,则不会剩下任何数据用于测试。因此,通常,我们将整个数据集分为两个部分,例如70/30百分比。我们将70%的数据用于模型构建,其余的用于测试预测所创建模型的准确性。您可以根据需要使用不同的拆分比率。

创建特征数组

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

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

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

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

In [18]: X.head ()

初步记录

该数组有几行23列。

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

创建输出数组

要为预测值列创建数组,请使用以下Python语句-

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

检查内容。以下屏幕输出显示结果-

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和Y_test 。和以前一样,您可以使用head命令检查这些数组的内容。我们将使用X_train和Y_train数组来训练我们的模型,并使用X_test和Y_test数组来进行测试和验证。

现在,我们准备构建分类器。我们将在下一章对此进行研究。

Python的逻辑回归-建立分类器

不需要您必须从头开始构建分类器。建筑物分类器很复杂,并且需要一些领域的知识,例如统计,概率论,优化技术等等。市场上有几种预构建的库,这些库对这些分类器进行了全面测试并且非常有效。我们将使用sklearn中的一种这样的预构建模型。

sklearn分类器

从sklearn工具箱创建Logistic回归分类器很简单,并且在单个程序语句中完成,如下所示-

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))

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

Python的逻辑回归-测试

在投入生产使用之前,我们需要测试上面创建的分类器。如果测试表明模型不符合期望的精度,我们将不得不返回上述过程,选择另一组特征(数据字段),再次构建模型并进行测试。这将是一个迭代步骤,直到分类器满足您的所需精度要求为止。因此,让我们测试分类器。

预测测试数据

为了测试分类器,我们使用在较早阶段生成的测试数据。我们在创建的对象上调用预报方法,并传递测试数据的X数组,如以下命令所示-

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

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

In [25]: predicted_y

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

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

输出表明前三个客户不是定期存款的潜在候选人。您可以检查整个阵列以找出潜在客户。为此,请使用以下Python代码段-

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

运行上面的代码的输出如下所示-

定期存款

输出显示所有可能预订TD的行的索引。现在,您可以将此输出提供给银行的营销团队,该团队将为选定行中的每个客户选择详细联系信息,然后继续他们的工作。

在将此模型投入生产之前,我们需要验证预测的准确性。

验证准确性

要测试模型的准确性,请在分类器上使用评分方法,如下所示-

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

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

Accuracy: 0.90

它表明我们模型的精度为90%,在大多数应用中被认为是非常好的。因此,不需要进一步的调整。现在,我们的客户已准备好进行下一个广告系列,获取潜在客户列表,并追逐他们以可能的高成功率打开TD。

Python的逻辑回归-局限性

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

但是,如果这些功能在我们的预测中很重要,我们将不得不将它们包括在内,但是逻辑回归将无法为我们提供良好的准确性。 Logistic回归也容易过拟合。它不能应用于非线性问题。在与目标不相关且彼此相关的自变量下,其性能会很差。因此,您将必须仔细评估逻辑回归对您要解决的问题的适用性。

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

Python的逻辑回归-摘要

Logistic回归是二进制分类的一种统计技术。在本教程中,您学习了如何训练机器以使用逻辑回归。创建机器学习模型时,最重要的要求是数据的可用性。没有足够的相关数据,您将无法简单地学习机器。

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

在本教程中,您学习了如何使用sklearn库中提供的逻辑回归分类器。为了训练分类器,我们使用大约70%的数据来训练模型。我们将其余数据用于测试。我们测试模型的准确性。如果这不在可接受的范围内,我们将返回选择新的功能集。

再一次,遵循准备数据,训练模型和测试的整个过程,直到您对它的准确性感到满意为止。在进行任何机器学习项目之前,您必须学习并接触到目前为止已经开发并且已经在行业中成功应用的多种技术。