sklearn入门——逻辑回归

什么是逻辑回归

逻辑回归也叫对数几率回归,在西瓜书中有介绍,吃瓜的时候也学过,可惜呀,脑子不好使,全忘了。重新学一下吧。。。。
在理解对数几率回归之前需要先理解线性回归。线性回归的任务,就是构造一个预测函数 来映射输入的特征矩阵x和标签值y的线性关系,具体以公式体现如下:
z = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n z = \theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n z=θ0+θ1x1+θ2x2+...+θnxn
写成矩阵形式为:
在这里插入图片描述
构造预测函数的核心就是找的矩阵 θ T \theta^T θT,最小二乘法就是用来求解线性回归的数学方法。

通过线性回归得到的预测结果是连续的实数,而分类任务的结果通常是间断的具体的表示,因此线性回归能否用来进行分类任务呢?答案是肯定的,这要借助一个函数将线性的结果映射到分类的结果,对于常见的二分类任务,可以映射到0和1,则这个函数可以是阶跃函数,也可以是Sigmoid函数,常用的是Sigmoid函数,Sigmoid函数的形势如下:
在这里插入图片描述
可以发现,当线性回归结果越大时,越接近于1,越小则越接近于0。
z = θ T x z=\theta^Tx z=θTx代入就得到了简单的二分类逻辑回归:
g ( z ) = y ( x ) 1 1 + e − θ T x g(z)=y(x)\frac{1}{1+e^{-\theta^Tx}} g(z)=y(x)1+eθTx1
y ( x ) y(x) y(x)通常就是分类任务的标签。对于这个 y ( x ) y(x) y(x),可以发现:
在这里插入图片描述
因此,逻辑回归的任务就是求解 θ T \theta^T θT来使结果拟合样本的标签。

sklearn中的逻辑回归
逻辑回归的类说明
linear_model.LogisticRegression逻辑回归分类器(又叫logit回归,最大熵分类器)
linear_model.LogisticRegressionCV带交叉验证的逻辑回归分类器
linear_model.logistic_regression_path计算Logistic回归模型以获得正则化参数的列表
linear_model.SGDClassifier利用梯度下降求解的线性分类器(SVM,逻辑回归等等)
linear_model.SGDRegressor利用梯度下降最小化正则化后的损失函数的线性回归模型
metrics.log_loss对数损失,又称逻辑损失或交叉熵损失
metrics.confusion_matrix混淆矩阵,模型评估指标之一
metrics.roc_auc_scoreROC曲线,模型评估指标之一
metrics.accuracy_score精确性,模型评估指标之一
损失函数

损失函数是用来衡量参数 θ \theta θ的优劣,判断训练得到的模型在拟合样本时的信息损失,损失函数的具体推导在吃瓜教程里写了,这里就写一下最终结果吧:
在这里插入图片描述

重要参数penalty和C
正则化

正则化是为了防止过拟合的过程,常用的有L1正则化和L2正则化两种选项,就是在损失函数上加上参数向量的L1和L2范式倍数来实现。这个增加的范式,被称为“正则项”,也被称为"惩罚项"。损失函数改变,基于损失函数的最优化来求解的参数取值必然改变,我们以此来调节模型拟合的程度。其中L1范式表现为参数向量中的每个参数的绝对值之和,L2范数表现为参数向量中的每个参数的平方和的开方值。
在这里插入图片描述

在sklearn中通过参数C和penalty来控制C和正则项
参数说明
penalty可以输入"l1"或"l2"来指定使用哪一种正则化方式,不填写默认"l2"。注意,若选择"l1"正则化,参数solver仅能够使用求解方式”liblinear"和"saga“,若使用“l2”正则化,参数solver中所有的求解方式都可以使用。
C正则化强度的倒数,必须是一个大于0的浮点数,不填写默认1.0,即默认正则项与损失函数的比值是1:1。C越小,损失函数会越小,模型对损失函数的惩罚越重,正则化的效力越强,参数会逐渐被压缩得越来越小。

两种正则化的效果并不相同,在正则化强度增大(即C减小)时,参数都会减小,但L1正则化会将参数压缩到0,而L2正则化是将参数尽量小,但不会为0。
在L1正则化逐渐加强的过程中,携带信息量小的、对模型贡献不大的特征的参数,会比携带信息量大的、对模型贡献大的特征的参数更快地变成0,所以L1正则化本质是一个特征选择的过程,掌管了参数的“稀疏性”。L1正则化越强,参数中就越多为0,参数矩阵就越稀疏,选出来的特征就少,以此来防止过拟合。因此,如果数据量很大,特征很多,会倾向于使用L1正则化。

相对的,L2正则化在加强的过程中,会尽量让每个特征对模型都有一些小的贡献,但携带信息少,对模型贡献不大的特征的参数会非常接近于0。通常来说,如果我们的主要目的只是为了防止过拟合,选择L2正则化就足够了。但是如果选择L2正则化后还是过拟合,模型在未知数据集上的效果表现很差,就可以考虑L1正则化。

逻辑回归中的特征工程

前边学习过PCA和SVD,但是这两种方法进行的是降维的,然而降维后的数据特征很难解释具体的意义,这在逻辑回归的实际应用中存在缺陷,因此通常不适用PCA进行降维处理。所以可以考虑特征选择的方法,而其中嵌入法就是高效的选择方法,这里就写一下嵌入法。

由于L1正则化会使得部分特征对应的参数为0,因此L1正则化可以用来做特征选择,结合嵌入法的模块SelectFromModel,我们可以很容易就筛选出让模型十分高效的特征。此外,可以设置SelectFromModel的参数threshold,即阈值,删除特征系数小于阈值的数。这里特征的参数和随机森林中的feature_importance等类似,可以作为阈值来使用,反应了特征的重要性等方面的特性。

如果调整threshold不好用,也可以调整logisticregression中的C(正则化强度)来进行选择特征。

此外,可以用属性coef_获取训练后的特征的系数。

from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_breast_cancer
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
data = load_breast_cancer()
X = data.data
y = data.target
data.data.shape
lrl1 = LR(penalty="l1",solver="liblinear",C=0.5,max_iter=1000)
lrl2 = LR(penalty="l2",solver="liblinear",C=0.5,max_iter=1000)
#逻辑回归的重要属性coef_,查看每个特征所对应的参数
lrl1 = lrl1.fit(X,y)
lrl1.coef_
(lrl1.coef_ != 0).sum(axis=1)
lrl2 = lrl2.fit(X)
lrl2.coef_
梯度下降以及参数max_iter

逻辑回归的数学目的是求解能够让模型最优化,拟合程度最好的参数 的值,即求解能够让损失函数 最小化的值。对于二元逻辑回归来说,有多种方法可以用来求解参数 ,最常见的有梯度下降法(Gradient Descent),坐标下降法(Coordinate Descent),牛顿法(Newton-Raphson method)等。

梯度下降法

梯度就是函数对所有自变量求偏导组成的向量,向量的大小记为d,在几何上,梯度的方向表示了函数增加最快的方向。
对于逻辑回归而言,求解的是损失函数的最小值,因此需要将损失函数对参数求偏导构成向量,每次让参数减去向量大小的 α \alpha α倍,即:
在这里插入图片描述
这里的 α \alpha α叫做步长,步长越大,模型迭代的越快,步长越小模型迭代的次数越多。
在sklearn的LogisticRegression中max_iter控制着模型迭代的次数。

二元回归与多元回归:重要参数solver & multi_class

对于多分类的任务,逻辑回归也可以完成。其中主要的方法有两种:一种是将一类表示为1,其余的多类表示为0,这种方法被称为"一对多"(One-vs-rest),简称OvR,在sklearn中表示为“ovr"。另一种是将多个类表示为1,其余的多个类表示为0,这种方法称为“多对多”(Many-vs-Many),在sklearn中表示为““Multinominal”,由参数multi_class决定两种方法使用哪一种
输入"ovr”, “multinomial”, “auto"来告知模型,我们要处理的分类问题的类型。默认是"ovr”。
输入"auto",模型会根据solver的取值来决定,solver是’liblinear’,auto会选择’ovr‘,否则选择’multinominal’。
solver控制的求解器参数如下:
在这里插入图片描述

样本不平衡参数class_weight

有时候样本的特征比例悬殊,甚至会出现99:1的情况,在这种情况下即使模型不考虑比例是1的样本,训练出来的结果也有99%的准确率,因此,需要平衡样本。在sklearn中,class_weight可以起到平衡样本的目的,其默认参数是None,可以将样本比例调整为1:1;参数是balanced时,可以自动调整样本的权重。在现实中也常用采样法,认为增加小比例的样本的数量。可以进行上采样(增加少数类的样本),比如SMOTE,或者下采样(减少多数类的样本)。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我可以回答您的问题。您可以按照以下步骤在sklearn中绘制ROC曲线: 1. 准备数据:首先,您需要准备测试数据集和训练数据集。您还需要使用训练数据集来训练逻辑回归模型。 2. 训练模型:使用训练数据集训练逻辑回归模型。您可以使用以下代码: ``` from sklearn.linear_model import LogisticRegression # 创建逻辑回归对象 lr = LogisticRegression() # 使用训练数据集来训练模型 lr.fit(X_train, y_train) ``` 3. 预测概率:使用测试数据集来预测类别概率。您可以使用以下代码: ``` # 预测测试数据集的类别概率 y_pred_proba = lr.predict_proba(X_test)[:,1] ``` 4. 计算ROC曲线数据:计算真阳性率(TPR)和假阳性率(FPR)。您可以使用以下代码: ``` from sklearn.metrics import roc_curve, auc # 计算ROC曲线数据 fpr,tpr,thresholds = roc_curve(y_test, y_pred_proba) roc_auc = auc(fpr,tpr) ``` 5. 绘制ROC曲线:使用Matplotlib库绘制ROC曲线。您可以使用以下代码: ``` import matplotlib.pyplot as plt # 绘制ROC曲线 plt.title('Receiver Operating Characteristic') plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc) plt.legend(loc = 'lower right') plt.plot([0, 1], [0, 1],'r--') plt.xlim([0, 1]) plt.ylim([0, 1]) plt.ylabel('True Positive Rate') plt.xlabel('False Positive Rate') plt.show() ``` 这是在sklearn中绘制ROC曲线的简单步骤。同时,您还可以使用KS曲线来评估模型性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

up-to-star

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

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

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

打赏作者

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

抵扣说明:

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

余额充值