逻辑回归及python实现

概述

  logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同,都具有 w‘x+b,其中w和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将w‘x+b作为因变量,即y =w‘x+b,而logistic回归则通过函数L将w‘x+b对应一个隐状态p,p =L(w‘x+b),然后根据p 与1-p的大小决定因变量的值。如果L是logistic函数,就是logistic回归,如果L是多项式函数就是多项式回归。
  logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。
  Logistic回归模型的适用条件

  • 1 因变量为二分类的分类变量或某事件的发生率,并且是数值型变量。但是需要注意,重复计数现象指标不适用于Logistic回归。
  • 2 残差和因变量都要服从二项分布。二项分布对应的是分类变量,所以不是正态分布,进而不是用最小二乘法,而是最大似然法来解决方程估计和检验问题。
  • 3 自变量和Logistic概率是线性关系
  • 4 各观测对象间相互独立。

原理:如果直接将线性回归的模型扣到Logistic回归中,会造成方程二边取值区间不同和普遍的非直线关系。因为Logistic中因变量为二分类变量,某个概率作为方程的因变量估计值取值范围为0-1,但是,方程右边取值范围是无穷大或者无穷小。所以,才引入Logistic回归。

Logistic回归实质:发生概率除以没有发生概率再取对数。就是这个不太繁琐的变换改变了取值区间的矛盾和因变量自变量间的曲线关系。究其原因,是发生和未发生的概率成为了比值 ,这个比值就是一个缓冲,将取值范围扩大,再进行对数变换,整个因变量改变。不仅如此,这种变换往往使得因变量和自变量之间呈线性关系,这是根据大量实践而总结。所以,Logistic回归从根本上解决因变量要不是连续变量怎么办的问题。还有,Logistic应用广泛的原因是许多现实问题跟它的模型吻合。例如一件事情是否发生跟其他数值型自变量的关系。

原理

线性回归

线性回归是一种使用特征属性的线性组合来预测响应的方法。它的目标是找到一个线性函数,以尽可能准确地描述特征或自变量(x)与响应值(y)之间的关系,使得预测值与真实值之间的误差最小化。
在这里插入图片描述
在数学上,线性回归要找的这个线性函数叫回归方程,其定义如下:
在这里插入图片描述
PS:损失函数的系数 1/2 是为了便于计算,使对平方项求导后的常数系数为 1。
在这里插入图片描述
现代机器学习中常用的参数更新方法是梯度下降法。

梯度下降法

在这里插入图片描述

  • 批梯度下降(BGD):批梯度下降会获得全局最优解,缺点是在更新每个参数的时候需要遍历所有的数据,计算量会很大,并且会有很多的冗余计算,导致的结果是当数据量大的时候,每个参数的更新都会很慢。
  • 随机梯度下降(SGD):随机梯度下降是以高方差频繁更新,优点是使得sgd会跳到新的和潜在更好的局部最优解,缺点是使得收敛到局部最优解的过程更加的复杂。
  • 小批量梯度下降(MGBD):小批量梯度下降结合了sgd和batch gd的优点,每次更新的时候使用n个样本。减少了参数更新的次数,可以达到更加稳定收敛结果,一般在深度学习当中我们采用这种方法。

回归的评价指标

在这里插入图片描述
在这里插入图片描述
从图中不难看出,三者的关系是:SST = SSR + SSE。如果 SSR 的值等于 SST,这意味着我们的回归模型是完美的。

逻辑回归

逻辑回归和线性回归不同的地方在于:线性回归适用于解决回归问题,而逻辑回归适用于解决分类问题。本节我们就讲讲造成这种差异的原因。

Sigmoid函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:逻辑回归的总体思路就是,先用逻辑函数把线性回归的结果 (-∞,∞) 映射到 (0,1),再通过决策边界建立与分类的概率联系。

在这里插入图片描述

代价函数

在这里插入图片描述

  • 代价函数之所以要加负号,是因为机器学习的目标是最小化损失函数,而极大似然估计法的目标是最大化似然函数。那么加个负号,正好使二者等价。
  • 对数损失函数与上面的极大似然估计的对数似然函数本质上是等价的。所以逻辑回归直接采用对数损失函数来求参数,实际上与采用极大似然估计来求参数是一致的。

梯度下降法求解

在这里插入图片描述

逻辑回归的分类

逻辑回归对特征变量(x)和分类响应变量(y)之间的关系进行建模,在给定一组预测变量的情况下,它能给出落入特定类别响应水平的概率。也就是说,你给它一组数据(特征),它告诉你这组数据属于某一类别的概率。根据分类响应变量(y)的性质,我们可以将逻辑回归分为三类:

  • 二元逻辑回归(Binary Logistic Regression)
    当分类结果只有两种可能的时候,我们就称为二元逻辑回归。例如,考试通过或未通过,回答是或否,血压高或低。
  • 名义逻辑回归(Nominal Logistic Regression)
    当存在三个或更多类别且类别之间没有自然排序时,我们就称为名义逻辑回归。例如,企业的部门有策划、销售、人力资源等,颜色有黑色、红色、蓝色、橙色等。
  • 序数逻辑回归(Ordinal Logistic Regression)
    当存在三个或更多类别且类别之间有自然排序时,我们就称为序数逻辑回归。例如,评价有好、中、差,身材有偏胖、中等、偏瘦。注意,类别的排名不一定意味着它们之间的间隔相等。

Softmax Regression

在这里插入图片描述
原为链接:https://www.cnblogs.com/marvin-wen/p/15966151.html

优劣势

优点

1)形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大
2)模型效果不错。在工程上是可以接受的(作为baseline),如果特征工程做的好,效果不会太差,并且特征工程可以大家并行开发,大大加快开发的速度。
3)训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。
4)资源占用小,尤其是内存。因为只需要存储各个维度的特征。
5)方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。

缺点

1)准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布。
2)很难处理数据不平衡的问题。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好。
3)处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题 。
4)逻辑回归本身无法筛选特征。有时候,我们会用gbdt来筛选特征,然后再上逻辑回归。

实现

评分卡的目标模型是,依据客户数据,预测客户是否坏客户
整个建模过程共5步:

1.变量分析与分箱:筛选与标签SeriousDlqin2yrs有相关性的变量,并把变量进行分箱,作为建模的输入特征。
2.建模
(1)数据预处理:转woe,归一化
(2)用逐步回归选出尽量少的特征(同时保持建模效果)
(3)训练逻辑回归模型
3.模型评估:检验AUC是否达标,并检查系数是否都为正。
4.将逻辑回归模型预测结果转为评分
5.确定生产上的判定为坏客户的分数阈值

scikit-learn

在scikit-learn中,与逻辑回归有关的主要是这3个类。LogisticRegression, LogisticRegressionCV 和logistic_regression_path。其中LogisticRegression和LogisticRegressionCV的主要区别是LogisticRegressionCV使用了交叉验证来选择正则化系数C。而LogisticRegression需要自己每次指定一个正则化系数。除了交叉验证,以及选择正则化系数C以外, LogisticRegression和LogisticRegressionCV的使用方法基本相同。
  logistic_regression_path类则比较特殊,它拟合数据后,不能直接来做预测,只能为拟合数据选择合适逻辑回归的系数和正则化系数。主要是用在模型选择的时候。一般情况用不到这个类
   此外,scikit-learn里面有个容易让人误解的类RandomizedLogisticRegression,虽然名字里有逻辑回归的词,但是主要是用L1正则化的逻辑回归来做特征选择的,属于维度规约的算法类,不属于我们常说的分类算法的范畴。
    后面的讲解主要围绕LogisticRegression和LogisticRegressionCV中的重要参数的选择来来展开,这些参数的意义在这两个类中都是一样的。
    函数调用形式:

LogisticRegression(penalty='l2',dual=False,tol=1e4,C=1.0,fit_intercept=True,
                   intercept_scaling=1,class_weight=None,random_state=None,solver='liblinear',
                   max_iter=100,multi_class='ovr',verbose=0,warm_start=False, n_jobs=1)

参数

参数 参数名称 解释
penalty 正则化类型 1)字符串型,’l1’ or ‘l2’,默认:’l2’;正则化类型。
2)LogisticRegression和LogisticRegressionCV默认就带了正则化项。penalty参数可选择的值为"l1"和"l2".分别对应L1的正则化和L2的正则化,默认是L2的正则化。
3)penalty参数的选择会影响我们损失函数优化算法的选择。即参数solver的选择,如果是L2正则化,那么4种可选的算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以选择。但是如果penalty是L1正则化的话,就只能选择‘liblinear’了。这是因为L1正则化的损失函数不是连续可导的,而{‘newton-cg’, ‘lbfgs’,‘sag’}这三种优化算法时都需要损失函数的一阶或者二阶连续导数。而‘liblinear’并没有这个依赖。
dual 布尔型,默认:False。当样本数>特征数时,令dual=False;用于liblinear解决器中L2正则化。
tol 误差范围 浮点型,默认:1e-4;迭代终止判断的误差范围。
C 正则化强度 浮点型,默认:1.0;其值等于正则化强度的倒数,为正的浮点数。数值越小表示正则化越强。
fit_intercept 截距 布尔型,默认:True;指定是否应该向决策函数添加常量(即偏差或截距)。
intercept_scaling intercept_scaling 浮点型,默认为1;仅仅当solver是”liblinear”时有用。
solver 逻辑回归损失函数的优化方法 solver参数决定了我们对逻辑回归损失函数的优化方法,有4种算法可以选择,分别是:
a. liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
b.lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
c. newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
d. sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候,SAG是一种线性收敛算法,这个速度远比SGD快。

从上面的描述可以看出,newton-cg, lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear通吃L1正则化和L2正则化。

同时,sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择。但是sag不能用于L1正则化,所以当你有大量的样本,又需要L1正则化的话就要自己做取舍了。要么通过对样本采样来降低样本量,要么回到L2正则化。
max_iter 最大迭代次数 整型,默认是100;
multi_class 分类方式 multi_class参数决定了我们分类方式的选择,有 ovr和multinomial两个值可以选择,默认是 ovr。如果是二元逻辑回归,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上。
verbose 整型,默认是0;对于liblinear和lbfgs solver,verbose可以设为任意正数。
class_weight 分类模型中各种类型的权重 class_weight参数用于标示分类模型中各种类型的权重,可以不输入,即不考虑权重,或者说所有类型的权重一样。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者我们自己输入各个类型的权重,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。

如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。

sklearn的官方文档中,当class_weight为balanced时,类权重计算方法如下:n_samples / (n_classes * np.bincount(y))_samples为样本数,n_classes为类别数量,np.bincount(y)会输出每个类的样本数,例如y=[1,0,0,1,1],则np.bincount(y)=[2,3]
sample_weight 样本权重 由于样本不平衡,导致样本不是总体样本的无偏估计,从而可能导致我们的模型预测能力下降。遇到这种情况,我们可以通过调节样本权重来尝试解决这个问题。调节样本权重的方法有两种:
第一种是在class_weight使用balanced。
第二种是在调用fit函数时,通过sample_weigh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值