第4步 Logistic回归


前言

这是机器学习100步入门ML的第4步,我们终于来到了运用最多的的分类问题,从今天开始,逐一介绍常见的分类模型。当然,理解难度和代码复杂度相较之前会陡然加大,大家慢慢食用,反复食用,做到举一反三,融会贯通。
本文将探讨逻辑回归的概念、逻辑回归训练时的数据要求、逻辑回归的基本运行原理。文章的最后我们会做一个简单应用:使用逻辑回归预测用户是否会购买SUV。


一、什么是逻辑回归?

逻辑回归是一种用于解决分类问题的机器学习方法。它是一种基于概率思想的预测分析技术。分类算法逻辑回归用于预测分类因变量的似然性。逻辑回归中的因变量是二进制变量(分类变量),数据编码为 1(是、正常、存活等)或 0(否、异常、死亡等)。当然也可以是多分类变量,例如0、1、2;不过先拿二分类作为例子。
逻辑回归的目标是发现特征与特定结果的可能性之间的联系。例如,根据病人的临床症状、体征预测病人的预后,特定结果有两个值:预后好和预后差、或者存活和死亡。
有同学估计懵了,逻辑回归是分类还是回归。首先从输出上看,逻辑回归不太像回归,因为它的输出被限定在 0 和 1 之间。但是呢,逻辑回归本质上可以说就是线性回归,不同之处在于逻辑回归使用一个叫做“Sigmoid 函数”或“Logit函数”,因此它被称为“逻辑回归”。
逻辑回归可以表示为:
在这里插入图片描述
其中左侧就是 Logit函数,以下是上述函数的反函数:
在这里插入图片描述这就是 Sigmoid 函数,它是一个 S 形的曲线,因此输出一个介于 0 和 1 之间的概率值。
在这里插入图片描述

二、逻辑回归的数据要求

该模型适用于大多数据集,但还是需要考虑以下几点:
1.二元逻辑回归中的因变量必须是二元的;
2. 模型中的多重共线性应该很小或没有;
3. 样本量越大越好;

三、逻辑回归如何工作

在这里插入图片描述
在这里插入图片描述
大家尽量理解分类模型的底层逻辑,看不得懂也没关系,在动手实操中慢慢体会!

四、预测用户是否会购买SUV

先看数据集:包含了用户ID、性别、年龄以及预估薪资。一家汽车公司刚刚推出了他们新型的豪华SUV,我们尝试预测哪些用户会购买这种全新SUV。并且在最后一列用来表示用户是否购买:
在这里插入图片描述
接下来我们将建立一种逻辑回归模型来预测用户是否购买这种SUV,该模型基于两个变量,分别是年龄和预计薪资。因此我们的特征矩阵将是这两列。我们尝试寻找用户年龄与预估薪资之间的某种相关性,以及他是否购买SUV的决定。

1、数据预处理

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
Y = dataset.iloc[:,4].values
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.25, random_state = 0)
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

2、逻辑回归模型

将逻辑回归应用于训练集:

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier.fit(X_train, y_train)

保姆级操作演示

1、老套路,先看逻辑回归的代码参数:LogisticRegression(),这里用的是默认参数,我们看看具体有什么:
class sklearn.linear_model.LogisticRegression(penalty=‘l2’, *, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver=‘lbfgs’, max_iter=100, multi_class=‘auto’, verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)
惊不惊喜,意不意外,参数够多了吧!挑一些重要的说,不说的表示默认项就行了:

(1)penalty:惩罚项(也叫正则项),str类型,可选参数为l1和l2,默认为l2,用于指定惩罚项中使用的规范。penalty参数主要的作用有:解决过拟合,但是一般情况使用l2就够了,如果l2不行了在使用l1。
l1:规范假设的是模型的参数满足拉普拉斯分布,l1范式表现为参数向量中的每个参数的绝对值之和,如果选择l1那么solver参数只能选择liblinear和saga,因为L1正则化的损失函数不是连续可导的。而其他算法优化算法时都需要损失函数的一阶或者二阶连续导数。
l2:L2假设的模型参数满足高斯分布,l2范数表现为参数向量中的每个参数的平方和的开方值,如果选择l2那么solver参数都可以用。
所谓的范式就是加上对参数的约束,使得模型更不会过拟合(overfit),但是如果要说是不是加了约束就会好,这个没有人能回答,只能说,加约束的情况下,理论上应该可以获得泛化能力更强的结果。

(2)C:正则化强度的倒数,必须是一个大于0的浮点数,不填写默认1.0,即默认正则项与损失函数的比值是1:1。C越小,损失函数会越小,模型对损失函数的惩罚越重,正则化的效力越强,参数会逐渐被压缩得越来越小。

(3)solver:优化算法选择参数,有五个可选参数,newton-cg、 lbfgs、liblinear、sag和saga。默认为liblinear(在0.22版本之后默认的liblinear修改成了lbfgs)。solver参数决定了对逻辑回归损失函数的优化方法:
liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。小数据集效果比较好。
lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅用一部分的样本来计算梯度,适合于样本数据多,数据集比较大的时候(建议超过10w的数据可以用,也最好用sag),样本少的话就不要用。
saga:快速梯度下降法,线性收敛的随机优化算法的的变种,适合于样本数据多,数据集比较大的时候。0.19版本后才有的,L1也能用。
sag”和“saga”快速收敛仅在具有大致相同比例的要素上得到保证, 可以使用sklearn.preprocessing中的缩放器预处理数据。
从上面的描述,大家可能觉得,既然newton-cg, lbfgs和sag这么多限制,如果不是大样本,我们选择liblinear不就行了嘛!错,因为liblinear也有自己的弱点!我们知道,逻辑回归有二元逻辑回归和多元逻辑回归。对于多元逻辑回归常见的有one-vs-rest(OvR)和many-vs-many(MvM)两种。而MvM一般比OvR分类相对准确一些。郁闷的是liblinear只支持OvR,不支持MvM,这样如果我们需要相对精确的多元逻辑回归时,就不能选择liblinear了。也意味着如果我们需要相对精确的多元逻辑回归不能使用L1正则化了。

(4)max_iter:算法收敛最大迭代次数,int类型,默认为100。仅在正则化优化算法为newton-cg, sag和lbfgs才有用,算法收敛的最大迭代次数。下山的步数。

(5)dual:对偶或原始方法,bool类型,默认为False。对偶方法只用在求解线性多核(liblinear)的L2惩罚项上。当样本数量>样本特征的时候,dual通常设置为False。

(6)tol:停止求解的标准,float类型,默认为1e-4。就是求解到多少的时候,停止,认为已经求出最优解。

(7)class_weight:用于标示分类模型中各种类型的权重,可以是一个字典或者’balanced’字符串,默认为不输入,也就是不考虑权重,即为None。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者自己输入各个类型的权重。举个例子,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9,1:0.1},这样类型0的权重为90%,而类型1的权重为10%。如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。当class_weight为balanced时,类权重计算方法如下:n_samples / (n_classes * np.bincount(y))。n_samples为样本数,n_classes为类别数量,np.bincount(y)会输出每个类的样本数,例如y=[1,0,0,1,1],则np.bincount(y)=[2,3]。
那么class_weight有什么作用呢?
在分类模型中,我们经常会遇到两类问题:
第一种是误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重。
第二种是样本是高度失衡的,比如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。这时,我们可以选择balanced,让类库自动提高非法用户样本的权重。提高了某种分类的权重,相比不考虑权重,会有更多的样本分类划分到高权重的类别,从而可以解决上面两类问题。

(8)multi_class:分类方式选择参数,str类型,可选参数为ovr和multinomial,默认为ovr。ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)。如果是二元逻辑回归,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上。
OvR和MvM有什么不同?
OvR的思想很简单,无论你是多少元逻辑回归,我们都可以看做二元逻辑回归。具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类模型获得以此类推。
而MvM则相对复杂,这里举MvM的特例one-vs-one(OvO)作讲解。如果模型有T类,我们每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。我们一共需要T(T-1)/2次分类。
可以看出OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。如果选择了ovr,则4种损失函数的优化方法liblinear,newton-cg,lbfgs和sag都可以选择。但是如果选择了multinomial,则只能选择newton-cg,lbfgs和sag了。

2、哈哈哈,重新定义了“挑一些重要的”,没想到吧,一个“简单的”逻辑回归能有那么多讲究。不过呢,一般的二分类数据就用默认参数就好了,如果效果不佳,在慢慢研究上面的参数就好。


3、预测结果

预测测试集结果:

y_pred = classifier.predict(X_test)

4、模型评估

用混淆矩阵评估逻辑回归模型是否正确的学习和预测数据:

用混淆矩阵评估逻辑回归模型是否正确的学习和预测数据:
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)

输出是这样的东西:
在这里插入图片描述

保姆级操作演示

哈哈哈,又要甩出新的知识点了:混淆矩阵,以及带出的分类器的评价指标。
1、首先介绍混淆矩阵(Confusion Matrix):在机器学习领域,混淆矩阵,又称为可能性矩阵或错误矩阵。混淆矩阵是可视化工具,特别用于监督学习,在无监督学习一般叫做匹配矩阵。在图像精度评价中,主要用于比较分类结果和实际测得值,可以把分类结果的精度显示在一个混淆矩阵里面。
在这里插入图片描述

混淆矩阵要表达的含义:
(1)混淆矩阵的每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目;
(2)每一行代表了数据的真实归属类别,每一行的数据总数表示该类别的数据实例的数目;每一列中的数值表示真实数据被预测为该类的数目。
(3)True Positive(TP):真正类。样本的真实类别是正类,并且模型识别的结果也是正类。
(4)False Negative(FN):假负类。样本的真实类别是正类,但是模型将其识别为负类。
(5)False Positive(FP):假正类。样本的真实类别是负类,但是模型将其识别为正类。
(6)True Negative(TN):真负类。样本的真实类别是负类,并且模型将其识别为负类。
我们用简单的代码画出本例的混淆矩阵:
在这里插入图片描述

在解读一下:①每一行之和表示该类别的真实样本数量。第一行表示真实数据中为0(不会购买)的一共有65+8=73个,其中65是模型预测是0的,9是模型预测是1的;同理可理解第二行的意思。②每一列之和表示被预测为该类别的样本数量。第一行表示模型预测数据中为0(不会购买)的一共有65+3=68个,其中65是真实数据就是0的,3是真实数据是1的;同理可理解第二行的意思。总体来看,可以发现,模型预测效果越好,从左上到右下的对角线的两个数值占比越高(65和24)。注意,这个矩阵第一行是类别0,跟上述代码输出的不一样,它的第一行是类别1。
2、流统专业的同学此时有话要说,这不就是诊断性试验的“四个表”么,没错哈,“四个表”就是一种混淆矩阵,但是混淆矩阵不止“四格表”,也可以是九格表(3分类)、十六格表(4分类)等。
在这里插入图片描述

3、接下来介绍分类模型的评价指标。混淆矩阵都画出来了,那么就可以根据混淆矩阵计算一系列指标了:
①精确率(Accuracy):精确率,是最常用的分类性能指标。可以用来表示模型的精度,即模型识别正确的个数/样本的总个数。一般情况下,模型的精度越高,说明模型的效果越好。
计算公式:Accuracy = (TP+TN)/(TP+FN+FP+TN)
②正确率或者准确率(Precision):又称为查准率或者阳性预测值(Positive predictive value,PPV),表示在模型识别为正类的样本中,真正为正类的样本所占的比例。一般情况下,查准率越高,说明模型的效果越好。
计算公式:Precision = TP/(TP+FP)
注意区别:Accuracy,不管是哪个类别,只要预测正确,其数量都放在分子上,而分母是全部数据量,说明这个精确率是对全部数据的判断。
而正确率在分类中对应的是某个类别,分子是预测该类别正确的数量,分母是预测为该类别的全部的数量。或者说,Accuracy是对分类器整体上的精确率的评价,而Precision是分类器预测为某一个类别的精确的评价。
③召回率(Recall):又称为查全率或者灵敏度(Sensitivity)或者真阳性率(True Positive Rate,TPR),召回率表现出在实际正样本中,分类器能预测出多少。表示的是,模型正确识别出为正类的样本的数量占总的正类样本数量的比值。一般情况下,Recall越高,说明有更多的正类样本被模型预测正确,模型的效果越好。
计算公式:Recall = TP/(TP+FN)
④特异度(Specificity):又称真阴性率(true negative rate,TNR),特异性指标,表示的是模型识别为负类的样本的数量,占总的负类样本数量的比值。
计算公式:TNR = TN / (FP + TN)
⑤负正类率(False Positive Rate, FPR),计算公式为:FPR=FP/(TN+FP),计算的是模型错识别为正类的负类样本占所有负类样本的比例,一般越低越好。
计算公式:Specificity = 1 - FPR
⑥Fβ_Score:Fβ的物理意义就是将正确率和召回率的一种加权平均,在合并的过程中,召回率的权重是正确率的β倍。
F1分数认为召回率和正确率同等重要,F2分数认为召回率的重要程度是正确率的2倍,而F0.5分数认为召回率的重要程度是正确率的一半。比较常用的是F1分数(F1 Score),是统计学中用来衡量二分类模型精确度的一种指标。
F1_Score:数学定义为 F1分数(F1-Score),又称为平衡 F分数(Balanced Score),它被定义为正确率和召回率的调和平均数。在 β=1 的情况,F1-Score的值是从0到1的,1是最好,0是最差。
⑦阴性预测值(Negative predictive value,NPV):阴性预测值被预测准确的比例,或者说预测为阴性中,有多少是真阴性。
计算公式:NPV=TN / (FN + TN)

4、既然说到了灵敏度和特异度,怎能不说AUC和ROC曲线呢。
①接受者操作特性曲线(receiver operating characteristic curve,简称ROC曲线),又称为感受性曲线(sensitivity curve),是非常重要和常见的统计分析方法。开头说了逻辑回归的原理,首先输出预测样本为正例的概率,比如70%,然后跟阈值作比较(一般是50%),大于阈值则判断为正例。大家有没有想过,这个阈值是可以变动的,不一定就是50%,那么是多少合适呢?可不可以把所有的阈值都试试,然后都看看分类效果,其实这就是ROC曲线的基本原理。
比如说哈,指定一个阈值为90%,那么只有第一个样本(90%)会被归类为正例,而其他所有样本都会被归为负例,因此,对于90%这个阈值,我们可以计算出FPR为0,TPR为0.1(因为总共10个正样本,预测正确的个数为1),那么曲线上必有一个点为(0, 0.1)。依次选择不同的阈值(或称为“截断点”),画出全部的关键点以后,再连接关键点即可最终得到ROC曲线:
在这里插入图片描述②怎么利用ROC曲线选择最佳模型呢?首先了解一下ROC曲线图上很重要的四个点:
第一个点( 0 , 1 ):(0,1)(0,1),即FPR=0, TPR=1,这意味着FN(False Negative)=0,并且FP(False Positive)=0。意味着这是一个完美的分类器,它将所有的样本都正确分类。
第二个点( 1 , 0 ):(1,0)(1,0),即FPR=1,TPR=0,意味着这是一个糟糕的分类器,因为它成功避开了所有的正确答案。
第三个点( 0 , 0 ):(0,0)(0,0),即FPR=TPR=0,即FP(False Positive)=TP(True Positive)=0,可以发现该分类器预测所有的样本都为负样本(Negative)。
第四个点( 1 , 1 ):(1,1)(1,1),即FPR=TPR=1,分类器实际上预测所有的样本都为正样本。
从上面给出的四个点可以发现,ROC曲线图中,越靠近(0,1)的点对应的模型分类性能越好,所以,可以确定的是ROC曲线图中的点对应的模型,它们的不同之处仅仅是在分类时选用的阈值(Threshold)不同,每个点所选用的阈值都对应某个样本被预测为正类的概率值
③不同模型之间选择最优模型的方式:
这就要引入AUC值,AUC(Area Under Curve)被定义为ROC曲线下与坐标轴围成的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。AUC越接近1.0,检测方法真实性越高;等于0.5时,则真实性最低,无应用价值。

总结

今天内容到此为止了,说了很多理论的知识,不过这些都是分类模型通用的东西,所以统一在逻辑回归部分讲了。至于如何用代码实现,后面在介绍,先把这些概念好好消化吧。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jet4505

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值