机器学习系列7 基于Python的Scikit-learn库构建逻辑回归模型

Posted GISer Liu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习系列7 基于Python的Scikit-learn库构建逻辑回归模型相关的知识,希望对你有一定的参考价值。

课前测验

本文所用数据免费下载

在本文中,你将学习:

0 用于数据可视化的新库

1 逻辑回归原理及技术

目录

一、内容介绍

二、理论知识

1.分类与回归的区别

2.逻辑回归与其他回归的区别

3.逻辑回归的数学原理

①逻辑回归基本原理

②sigmod函数

③分类阈值选择

④其他逻辑回归分类

4.精度评定

①混淆矩阵

②常用精度系数

③ROC曲线与AUC系数

三、项目实战

1.提出问题

2.数据查看及整理

3.数据可视化

①网格散点图

⑥分簇散点图

③小提琴图

4.模型构建及特征选择

①数据拆分

②构建模型

5.精度评定

①构建混淆矩阵

②计算常用性能指标

③ROC曲线与AUC系数

四、全文总结


一、内容介绍

        在前面的文章中,我们介绍了不同线性回归模型的数学原理,可视化了数据间的相关性,并构建了6个不同的模型,将相关系数提升到了0.96。在本文中,我将介绍逻辑回归模型,它常常被用于二分类问题。诸如判断邮件是否为垃圾邮件,这种疾病是否具有传染性?该客户是否会选择此产品?        

 

 

二、理论知识

1.分类与回归的区别

        我们可以按照提出问题的种类,将任务分为回归任务和分类任务。那这两者的区别是什么呢?

        按照较官方些的说法,输入变量与输出变量均为连续变量的预测问题是回归问题,输出变量为有限个离散变量的预测问题成为分类问题。

        通俗一点讲,我们要预测的结果是一个数,比如要通过一个人的饮食预测一个人的体重,体重的值可以有无限多个,有的人50kg,有的人53kg,在50和53之间也有无限多个数。这种预测结果是某一个确定数,而具体是哪个数有无限多种可能的问题,我们会训练出一个模型,传入参数后得到这个确定的数,这类问题我们称为回归问题。预测的这个变量(体重)因为有无限多种可能,在数轴上是连续的,所以我们称这种变量为连续变量。

        我们要预测一个人的性别,预测他是否患有糖尿病,预测明天是否下雨,这种结果只有2个值或者多个值的问题,我们可以把每个值都当做一类,预测对象到底属于哪一类.这样的问题称为分类问题.如果一个分类问题的结果只有两个,比如"是"和"否"两个结果,我们把结果为"是"的样例数据称为"正例",将结果为"不是"的样例数据称为"负例",对应的,这种结果的变量称为离散型变量。

2.逻辑回归与其他回归的区别

        从名字来理解逻辑回归。在逻辑回归中,逻辑一词只是logistics 的音译字,并不是因为这个算法是突出逻辑的特性。

        至于回归,我们前一段提到回归任务是结果为连续型变量的任务,逻辑回归是用来做分类任务的,为什么叫回归呢?那我们是不是可以假设:逻辑回归就是用回归的办法来做分类呢

        假设刚刚的思路是正确的,逻辑回归就是在用回归的办法做分类任务,那有什么办法可以做到呢,此时我们就先考虑最简单的二分类:结果是正例或者负例的任务。

        按照多元线性回归的思路,我们可以先对这个任务进行线性回归,学习出这个事情结果的规律;比如根据南瓜的大小、销售日期、产地等条件预测南瓜颜色为"橙色"或者"非橙色",可以先通过回归任务来预测南瓜颜色的预测值大小,取一个平均值作为阈值

        假如平均值为Y,颜色大小超过Y为橙色,小于等于Y的,为非橙色。这样通过线性回归加设定阈值的办法,就可以完成一个简单的二分类任务。如下图1所示:

图1 逻辑回归

3.逻辑回归的数学原理

        在前文中我们已经知道其他线性回归的数学原理,通过拟合直线方程,或者曲线方程来预测回归值,但逻辑回归本身是为了分类,它的数学原理与前者稍有不同,我将详细讲解。

①逻辑回归基本原理

        选择两个与问题相关性较高的特征,进行逻辑回归。寻找数据的相关性方法我在上一篇文章中有提到。

图2 二分类

        上图中,橙色的线是拟合出来的回归线,橙色样本区域是“橙色”南瓜,蓝色样本区域是“非橙色”南瓜。绿色直线是我们用于分类的阈值,阈值左边的区域为是“橙色”南瓜,右侧区域是区域是“非橙色”南瓜。只有少数样本被分类错误。

        预测南瓜颜色本质还是一个回归问题,得到的结果也是一个连续变量。通过设定阈值,就成功将回归问题转化为了分类问题。但是,这样做还存在一个问题:

我们上面的假设依赖于所有的南瓜颜色都不会特别离谱,如果有多个异常值(错分)在我们的例子中,阈值就很难设定。

        继续取平均大小为阈值,则会出现下图3的情况:

图3 错分过多

        其中大量样本被错误分类,这样的分类精度对问题的解决已经失去了意义。

        从上边的例子可以看出:使用线性的函数来拟合回归线后取阈值的办法是行不通的。原因在于:

拟合的函数太直,离群值(也叫异常值)对结果的影响过大,但是我们的整体思路是没有错的,错的是用了太“直”的拟合函数,如果我们用来拟合的函数是非线性的,不那么直,将异常值的影响降到最低是不是就好一些呢?就像前文中回归一样思考!

所以我们下面来做两件事:

0 找到一个不那么直的拟合函数

1 选定一个阈值

②sigmod函数

        逻辑回归常用的拟合函数是Sigmoid函数,Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。 在信息科学中,由于其单增以及反函数单增等性质,Sigmoid函数常被用作神经网络的激活函数,其将变量映射到[0,1]之间。其公式如下:

        当x趋近于负无穷时,y趋近于0;当x趋近于正无穷时,y趋近于1;当x=0时,y=1/2。

        该函数具有很强的鲁棒性(鲁棒是Robust的音译,指健壮和强壮),它将函数的输入映射到了输出的(0,1)之间使其具有概率意义。简而言之:将一个样本输入到我们学习到的函数中,输出0.7,意思就是这个样本有70%的概率是正例,1-70%就是30%的概率为负例

        查看其图像,我们可以发现,增加总输入,可以使Sigmoid函数越来越趋近于阈值函数,或者叫阶梯函数。将总输入变为原来的5倍,则Sigmoid函数变为如下的形式:

图4 Sigmoid函数图像

        因此,我们选择Sigmoid函数作为逻辑回归函数以后,再根据错分率调整Sigmoid函数的参数来选择阈值,就能大幅度降低错分的影响。

③分类阈值选择

        采用Sigmoid函数作为回归函数的情况下,当我选阈值为0.5,那么小于0.5的一定是负例,哪怕他是0.49。此时我们判断一个样本为负例一定是准确的吗?

        不一定,因为它还是有49%的概率为正的。但是即便正例的概率为0.1,我们随机选择1万个样本来做预测,还是会有接近100个预测它是负例。

        所以无论怎么选,误差都是存在的。我们选定阈值的时候就是在选择可以接受误差的程度。

        我们现在知道了Sigmoid函数预测结果为一个0到1之间的小数,选定阈值的第一反应,大多都是选0.5,其实实际工作中并不一定是0.5,阈值的设定往往是根据实际情况来判断的。并不会有一个万能的答案。

④其他逻辑回归分类

        还有其他类型的逻辑回归,包括多项式和序数:

0 多项式,涉及多个类别 - “橙色,白色和条纹”

1 序数,它涉及有序的类别,如果我们想要按逻辑顺序对结果进行排序,就像我们的南瓜按有限数量的大小(mini,sm,med,lg,xl,xxl)排序一样,会很有用

 

4.精度评定

①混淆矩阵

        混淆矩阵是针对机器学习分类问题的性能度量,其中输出可以是两个或更多类。该表包含4种不同的预测值和实际值组合。

“混淆矩阵”(或“误差矩阵”)是一个矩阵表,用于表示模型的分类结果的分布,从而衡量预测的准确性。

图5 混淆矩阵

        其中的参数意义如下:

真正(True Positive , TP)被模型预测为正的正样本;

假负(False Negative , FN)被模型预测为负的正样本;

假正(False Positive , FP)被模型预测为正的负样本;

真负(True Negative , TN)被模型预测为负的负样本。

        相关延伸参数计算公式为:

P = TP + FP

N = FN + TN

T = TP + FN

F = FP + TN

②常用精度系数

1 准确率(Accuracy)

        公式:

        Acc = ( TP + TN ) / ( P +N )

        参数意义见上段,准确率的确可以在一些场合,从某种意义上得到一个分类器是否有效,但它并不总是能有效的评价一个分类器的工作。对于正负样本不均衡的情况下,accuracy作为评判标注不合适。

2 精确率(Precision)

        公式:

Pec = TP / (TP + FP)

        指的是所有被判定为正类(TP+FP)中,真实的正类(TP)占的比例。

3 召回率(Recall)

        公式:

Rec = TP / (TP + FN)

        指的是所有真实为正类(TP+FN)中,被判定为正类(TP)占的比例。

4 F1分数(F1-score)

        公式:

F1 = (2 * Pec * Rec) / (Pec + Rec)

        F1是Precision和Recall加权调和平均,它综合考虑了Pec和Rec的结果,当F1较高时则能说明试验方法比较有效。

其他指标:

0 支持度(Support):表示某个项集出现的频率,也就是包含该项集的交易数与总交易数的比例。

1 Macro Avg:计算每个标签的未加权平均指标,而不考虑标签不平衡。

2 Weighted Avg:计算每个特征标签的平均指标,通过按其支持(每个标签的真实样本数)对标签不平衡进行加权来考虑标签不平衡。

③ROC曲线与AUC系数

        ROC的全名叫做Receiver Operating Characteristic,中文名字叫“受试者工作特征曲线”,其主要分析工具是一个画在二维平面上的ROC 曲线。

图6 ROC曲线

        如图,平面的横坐标是false positive rate(FPR),纵坐标是true positive rate(TPR)。对某个分类器而言,我们可以根据其在测试样本上的表现得到一个TPRFPR点对。这样,此分类器就可以映射成ROC平面上的一个点。调整这个分类器分类时候使用的阈值,我们就可以得到一个经过(0, 0),(1, 1)的曲线,这就是此分类器的ROC曲线。

        一般情况下,这个曲线都应该处于(0, 0)和(1, 1)连线的上方。因为(0, 0)和(1, 1)连线形成的ROC曲线实际上代表的是一个随机分类器。

        虽然用ROC 曲线来表示分类器的性能很直观好用。可是,人们总是希望能有一个数值来标志分类器的好坏。于是Area Under roc Curve(AUC)就出现了。顾名思义,AUC的值就是处于ROC 曲线下方面积的大小。通常,AUC的值介于0.5到1.0之间,较大的AUC代表了较好的性能。AUC(Area Under roc Curve)是一种用来度量分类模型好坏的一个标准。

        在Scikit-learn库中我们可以通过调用roc_curve()函数和roc_auc_score()函数来实现ROC曲线的绘制与AUC系数的计算。

三、项目实战

1.提出问题

        在了解了南瓜数据结构之后,我们现在对它足够熟悉,我们意识到我们可以使用一个二元类别:color

        在给定某些变量的情况下,让我们尝试构建一个逻辑回归模型来预测给定的南瓜可能是什么颜色(橙色)。🎃或白色👻).

为什么我们要在关于回归的文章中讨论二元分类?因为逻辑回归实际上是一种分类方法,尽管它是基于线性的。

        方便起见,我们将以1和0表示:“橙色”或“非橙色”。虽然我们的数据集中还有一个“白色”类别,但它的样本数量很少,所以我们不会使用它。一旦我们从数据集中删除空值,它就会消失。

2.数据查看及整理

0 还记得前文多个相关变量一起工作的多元线性回归吗?逻辑回归恰恰相反 - 变量不必对齐。这适用于相关性较弱的数据。

1 同理,逻辑回归适合大数据量的分类;我们的小数据集不适合此任务,请记住这一点。

        输入以下代码,加载原始数据。

import pandas as pd#调用pandas库并命名为pd 
new_pumpkins =pd.read.csv("new_pumpkins.csv")#利用pandas库打开csv数据
print(new_pumpkins.head())#查看数据的前5行 
new_pumpkins.info() #查看数据组织结构

        首先,稍微清理一下数据,删除 null 值并仅选择部分列。添加以下代码:

from sklearn.preprocessing import LabelEncoder#调用LabelEncoder函数用于数据转换 
new_columns = ['Color','Origin','Item Size','Variety','City Name','Package']#将需要的列放入安全区 
new_pumpkins = pumpkins.drop([c for c in pumpkins.columns if c not in new_columns], axis=1)#删去不需要的列 
new_pumpkins.dropna(inplace=True)#清理异常值 
new_pumpkins = new_pumpkins.apply(LabelEncoder().fit_transform)#对离散值进行连续化转换,用于回归分析

     机器学习中会有连续特征和离散特征,拿到获取的原始特征,必须对每一特征分别进行归一化,比如,特征A的取值范围是[-1000,1000],,特征B的取值范围是[-1,1]。如果使用逻辑回归,W1*X1+W2*X2,因为X1的取值太大了,所以X2基本起不了作用。所以,必须进行特征的归一化,每个特征都单独进行归一化。LabelEncoder()函数用于将数据转换成连续的数值型变量。即对不连续的数字或者文本进行编号。

        我们可以输入以下代码查看处理好的新数据:

new_pumpkins.info()

图7 new_pumpkins数据组织结构

图8 new_pumpkins

        查看数据及其结构,我们可以看到数据共有991个样本,按照颜色分类标签为0和1。

3.数据可视化

        到目前为止,我们已经准备好了本次逻辑回归模型构建需要的数据,我将使用不同的可视化库Seaborn可视化本次数据,以探索不同变量与Color的相关性。尽管这种类型的回归完全是关于“类别预测”的,但当因变量(颜色)和其他自变量(数据集的其余部分,如城市名称和大小)之间存在明显的线性关系时,它仍然效果最好。

Seaborn可视化库是基于我们之前使用的Matplotlib库构建的,它提供了一些简洁的方法来可视化数据。

①网格散点图

        通过调用Seaborn库的PairGrid()函数将我们的南瓜数据new_pumpkins可视化来创建一个网格。通过并排网格观察数据,我们可以看到 Color 数据与其他列的关系。输入以下代码:

import seaborn as sns#调用seaborn库并将其简称为sns 
g = sns.PairGrid(new_pumpkins)#调用Seaborn库的PairGrid()函数来创建网格对象g 
g.map(sns.scatterplot)#调用可视化网格对象g的map函数来以网格的形式输出散点图网格

        输出结果为:

图9 网格散点图

⑥分簇散点图

        由于颜色是一个二元类别(橙色或非橙色),因此它被称为“分类数据”,需要“更专业的可视化方法”。还有其他方法可以将此类别与其他变量的关系可视化。

        尝试使用“swarm”图来并排可视化南瓜尺寸与颜色散点图的分布。输入以下代码:

sns.swarmplot(x="Color", y="Item Size", data=new_pumpkins)

        输出结果为:

图10 分簇散点图

        根据分簇散点图,我们可以看到“橙色”南瓜在Item Size特征1,5,6分布较多,在0,2,3,4分布较少。

③小提琴图

        “小提琴”图在数据分布分析中非常有用,它可以轻松可视化两个类别中数据的分布方式。小提琴图在较小的数据集中效果不佳,数据越多分布显示越平滑。

        输入以下代码绘制南瓜尺寸与颜色分布的小提琴图:

sns.catplot(x="Color", y="Item Size", kind="violin", data=new_pumpkins)

        输出结果为:

图11 小提琴图

        与分簇散点图相比,小提琴图对数据分布的可视化效果更好。

        你也可以尝试使用其他变量创建小提琴图和其他 Seaborn 图。

        我们已经了解了颜色的二元类别和与其他特征之间的关系,现在我们可以通过训练逻辑回归模型以预测给定南瓜的颜色。

4.模型构建及特征选择

        在Scikit-learn中,构建一个模型来解决二元分类问题非常简单。

①数据拆分

        选择模型所需的特征变量,并按照8:2比例拆分训练集和测试集。调用 train_test_split()函数对数据集进行划分:

from sklearn.model_selection import train_test_split#调用数据划分函数 
Selected_features = ['Origin','Item Size','Variety','City Name','Package']#选择模型构建需要的特征变量 
X = new_pumpkins[Selected_features]#将模型构建的特征变量作为输入变量 
Y = new_pumpkins['Color']#将颜色变量作为预测标签 
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)#以8:2的比例划分数据集

②构建模型

        现在,我们可以通过调用训练数据来训练模型,并打印出精度评价报告:

from sklearn.model_selection import train_test_split 
from sklearn.metrics import accuracy_score, classification_report 
from sklearn.linear_model import LogisticRegression 
model = LogisticRegression()#实例化逻辑回归模型 
model.fit(X_train, y_train)#训练模型 
predictions = model.predict(X_test)#在测试集上预测 
print(classification_report(y_test, predictions))#输出模型的精度指标表

        查看模型的精度评价表。考虑到只有大约1000行数据,这精度还不错:

图12 精度评价表

5.精度评定

①构建混淆矩阵

        虽然我们可以打印精度评价报告,但通过构建混淆矩阵,我们可以更轻松地理解模型。

        调用confusion_matrix()函数来构建混淆矩阵。输入以下代码 :

from sklearn.metrics import confusion_matrix 
confusion_matrix(y_test, predictions)

        输出结果为:

array([[162, 4], 
        [ 33, 0]], dtype=int64)

②计算常用性能指标

        根据混淆矩阵结果计算常用的机器学习性能指标。

0 Precision = TP/ (TP + FP) = 162 / (162 + 33) = 0.8307692307692308

1 Recall = TP / (TP + FN) = 162 / (162 + 4) = 0.9759036144578314

2 Accuracy = (TP + TN)/(TP + TN + FP + FN)= 162/(162 + 4 + 33)= 0.814070351758794

        很显然,计算结果与图12的精度评价表结果一致。正如我们所猜,有多数的真阳性和真阴性以及少数的假阳性和假阴性,这意味着模型的性能还不错。

③ROC曲线与AUC系数

        这个模型的性能还不错,它的精度在80%的范围内,所以理想情况下,我们可以用它来预测南瓜的颜色。

        我们再对模型绘制ROC曲线并计算AUC系数,判断模型性能。输入以下代码:

from sklearn.metrics import roc_curve, roc_auc_score#调用ROC,AUC函数 
Y_scores = model.predict_proba(X_test)#返回测试集上预测值属于某标签的概率 
#计算参数,绘制ROC曲线 
fpr, tpr, thresholds = roc_curve(Y_test, Y_scores[:,1]) sns.lineplot([0, 1], [0, 1]) 
sns.lineplot(fpr, tpr) 
#计算AUC值 
auc = roc_auc_score(Y_test,Y_scores[:,1]) 
print("AUC:",auc)

        查看结果:

图13 模型ROC曲线

AUC: 0.6976998904709748

        根据绘制的ROC曲线以及计算出来的AUC值,我们可以得知模型的性能尚可,能完成我们提出的分类问题。

        在以后的分类课程中,我将带你学习如何迭代模型以提高模型的性能。

        恭喜!你已学完了回归课程!🏆

四、全文总结

        在本文中,我们讲解了逻辑回归的数学原理,尝试使用Seaborn库可视化数据寻找数据间的相关性,并基于Scikit-learn库构建逻辑回归模型预测南瓜颜色,在下一篇文章中,我将介绍如何部署机器学习模型至Web端。

🚀挑战

        关于逻辑回归,你我还有很多新鲜事物需要探索!但最好的学习方法是实验。请读者查找适合此类分析的数据集,并使用它构建模型。提示:尝试Kaggle以获取有趣的数据集。

课后测验


 如果觉得我的文章对您有帮助,三连+关注便是对我创作的最大鼓励!

 “本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_45590504/category_11752103.html?spm=1001.2014.3001.5482百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。”

 

以上是关于机器学习系列7 基于Python的Scikit-learn库构建逻辑回归模型的主要内容,如果未能解决你的问题,请参考以下文章

用Python开始机器学习(7:逻辑回归分类) --好!!

《机器学习实战》基于朴素贝叶斯分类算法构建文本分类器的Python实现

Python/OpenCV - 基于机器学习的 OCR(图像到文本)

[当人工智能遇上安全] 7.基于机器学习的安全数据集总结

Python系列课程——人工智能篇简单入门

Machine Learn决策树案例:基于python的商品购买能力预测系统