逻辑回归介绍及statsmodels、sklearn实操

2023-11-10

目录

1、逻辑回归简要介绍

2、statsmodels中实现逻辑回归

3、sklearn实现逻辑回归

3.1 基础案例代码

3.2 样本不平衡问题处理

3.3 LogisticRegression模型参数说明

3.4 模型调优方法


1、逻辑回归简要介绍

逻辑回归是名为“回归”实为分类的一个算法,在金融行业应用广泛,常被用来预测用户是否违约、是否流失等。逻辑回归是通过概率进行分类预测的,其预测区间是0到1的连续值,这与线性回归有相似之处,线形回归预测值是负无穷到正无穷。逻辑回归和线性回归之间的联系通过连接函数来转化。

(1)逻辑回归的预测值P_{i} 可通过 logit函数,将其映射为取值在负无穷到正无穷数,可表示为如下的线性回归函数:

        Logit(\frac{P_{i}}{1-P_{i}}) = \beta _{1}X_{1} + \beta _{2}X_{2} + ... + \beta _{n}X_{n} + \beta _{0}

(2)线性回归的预测值z 可通过sigmoid函数,将其映射为取值在0到1之间的概率:

g(z) = \frac{1}{1+e^{-z}}

 

逻辑回归的求解和线性回归类似,都是求解参数\beta使预测值接近因变量,在求解参数的过程中也需要注意变量选择和多重共线性这两个问题,其中多重共线性在逻辑回归中的影响并不是很大,可根据实际情况考虑是否进行处理。

2、statsmodels中实现逻辑回归

代码案例付有数据集,可点击进行下载~~~逻辑回归介绍及statsmodels、sklearn实操数据集--accepts.csv-数据挖掘文档类资源-CSDN下载

%matplotlib inline
import os
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from scipy import stats 
import statsmodels.api as sm
import statsmodels.formula.api as smf


accepts = pd.read_csv('./data/accepts.csv')
# axis = 0, 把包含nan值的行删除掉; axis = 1, 把包含nan值的列删除掉
accepts = accepts.dropna(axis = 0, how = 'any')

# 创建测试集和训练集
train = accepts.sample(frac = 0.7, random_state = 101)
test = accepts[~accepts.index.isin(train.index)]

# 逻辑回归建模
formula = 'bad_ind ~ fico_score + bankruptcy_ind + age_oldest_tr + tot_derog + rev_util + ltv + veh_mileage'

lg = smf.glm(formula = formula, data = train
        , family = sm.families.Binomial(sm.families.links.logit())).fit()
lg.summary()

 可以看到有些参数是不显著的,可以进一步考虑用向前筛选、向后筛选、逐步法等进行变量筛选,在此不在赘述,一般会用sklearn中的LogisticRegression进行更方便的处理。

3、sklearn实现逻辑回归

3.1 基础案例代码

from sklearn.linear_model import LogisticRegression as LR
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, roc_auc_score

X = accepts[['fico_score', 'bankruptcy_ind', 'age_oldest_tr', 'tot_derog', 'rev_util', 'veh_mileage']]
X['bankruptcy_ind'] = [0 if i == 'N' else 1  for i  in X['bankruptcy_ind']]  # 处理分类变量bankruptcy_ind

Y = accepts['bad_ind']

# 划分训练集与测试
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3, random_state = 101)

penalty = ['l1', 'l2']  # 正则化参数
rocaucscore = []    # auc分数
accuracyscore = []  # 准确率
coefs = []          # 参数列表

for i in penalty:
    lr = LR(penalty = i, solver = 'saga', C = 0.7, max_iter = 1000).fit(x_train, y_train)
    y_pred = lr.predict(x_test)
    
    rocaucscore.append(roc_auc_score(y_test, y_pred))
    accuracyscore.append(accuracy_score(y_test, y_pred))
    coefs.append(lr.coef_)
    
print('roc_auc_score', rocaucscore)
print('accuracy_score', accuracyscore)
print('l1 coef {} \nl2 coef {}'.format(*coefs))

3.2 样本不平衡问题处理

该案例中由于样本分布不平衡(目标变量1的数量为786,为0的数量为3319),模型预测较难将正样本预测出来,auc过低,对于样本分布不平衡的数据集,一般先进行上采样,然后再建模。

from imblearn.over_sampling import SMOTE 
smo = SMOTE(random_state = 50)
x_train_smo, y_train_smo = smo.fit_resample(x_train, y_train)   # smote上采样

print('y_train 中 分布\n', y_train.value_counts())
print('\ny_train_smo 中 分布\n', y_train_smo.value_counts())

 

 接下来再进行建模,看预测指标是否有提升

lr = LR(C = 0.8).fit(x_train_smo, y_train_smo)
y_pred = lr.predict(x_test)
print('accuracy_score', accuracy_score(y_test, y_pred))
print('roc_auc_score', roc_auc_score(y_test, y_pred))

 

可以看到测试集上auc有所提升。 

3.3 LogisticRegression模型参数说明

LogisticRegression参数详解
求解器sovler liblinear lbfgs newton-cg sag saga
求解方式 坐标下降法 拟牛顿法的一种,利用损失函数二阶导数矩阵(海森矩阵)来迭代优化损失函数 牛顿法的一种,利用损失函数二阶导数矩阵(海森矩阵)来迭代优化损失函数 随机平均梯度下降,与普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度 随机平均梯度下降的进化,稀疏多项逻辑回归的首选
支持的惩罚项 penalty L1, L2 L2 L2 L2 L1,L2
L1正则化能将系数收缩为0,而L2只能将系数无限接近于0
惩罚项 C C越小,惩罚力度越强
求解器收敛的最大迭代次数max_iter 默认为100,仅适用于newton-cg,sag,lbfgs求解器。过小会错过最优解,过大计算会变大。
回归类型multi_class

ovr 二分类

auto

ovr 一对多

multinomial 多对多

auto

求解器效果 在大型数据集上运行更快
对未标准化的数据集很有用

3.4 模型调优方法

模型调优一般会通过画学习曲线的方式进行,以正则化参数C的调优为例,可通过模型在测试集上的交叉验证结果来,也可以通过训练集和测试集上的auc等指标趋势来进行判断,如下为参考代码

c = np.arange(0.05, 1, 0.05)   # 参数C的搜索范围
accu_score_test = []   # 测试集上的准确率得分
auc_score_test = []    # 测试集上的auc得分
accu_score_train = []  # 训练集上的准确率得分
auc_score_train = []   # 训练集上的auc得分
cross_value_scores = []  # 交叉验证结果

for i in c:
    # 创建分类器
    lr = LR(C = i, max_iter = 1000, solver = 'liblinear', penalty = 'l2')
    # 交叉验证结果, 这里通过scoring参数指定交叉验证结果为auc
    cross_value_scores.append(cross_val_score(lr
                                              , x_train_smo, y_train_smo
                                              , cv = 5
                                              , scoring = 'roc_auc').mean())
    
    lr = lr.fit(x_train_smo, y_train_smo)
    y_pred =  lr.predict(x_test)
    y_pred_train = lr.predict(x_train_smo)
    accu_score_train.append(accuracy_score(y_train_smo, y_pred_train))  # 训练集上的准确率
    auc_score_train.append(roc_auc_score(y_train_smo, y_pred_train))   # 训练集上的auc
    
    accu_score_test.append(accuracy_score(y_test, y_pred))    # 测试集上的准确率
    auc_score_test.append(roc_auc_score(y_test, y_pred))      # 测试集上的auc
    
    
fig = plt.figure(figsize = (16, 12))
ax0 = fig.add_subplot(211)
ax0.plot(c, cross_value_scores)
ax0.set_title('auc score of cross value validition')

ax1 = fig.add_subplot(223)
ax1.plot(c, accu_score_test, label = 'accu_score_test', color = 'darkorange')
ax1.plot(c, accu_score_train, label = 'accu_score_train', color = 'royalblue')
ax1.set_title('accu_score of train and test')
ax1.legend()


ax2 = fig.add_subplot(224)
ax2.plot(c, auc_score_test, label = 'auc_score_test', color = 'darkorange')
ax2.plot(c, auc_score_train, label = 'auc_score_train', color = 'royalblue')
ax2.set_title('auc_score of train and test')
ax2.legend()

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

逻辑回归介绍及statsmodels、sklearn实操 的相关文章

  • 使用 Python 编辑 RTF 文件

    也许这是一个愚蠢的问题 但我不明白 所以道歉 我有一个 RTF 文档 我想更改它 例如 有一个表 我想复制一行并以面向对象的方式更改代码中第二行中的文本 我认为 pyparsing 应该是可行的方法 但我摆弄了几个小时但没有明白 我没有提供
  • 如何指定聚类的距离函数?

    我想对给定距离的点进行聚类 奇怪的是 似乎 scipy 和 sklearn 聚类方法都不允许指定距离函数 例如 在sklearn cluster AgglomerativeClustering 我唯一可以做的就是输入一个亲和力矩阵 这将非常
  • 使用 pandas.date_range() 生成多个日期时间,每周两个日期

    我在用着pd date range start date end date freq W MON 每周一生成每周频率日期时间start date 2017 01 01 and end date 2017 12 31 这意味着每月大约生成 4
  • Tkinter 菜单删除项

    如何删除任何菜单项 例如我想删除 播放 self menubar Menu self root self root config menu self menubar self filemenu2 Menu self menubar self
  • 定义Python源代码编码的正确方法

    PEP 263 http www python org dev peps pep 0263 定义如何声明Python源代码编码 通常 Python 文件的前两行应以以下内容开头 usr bin python coding
  • 如何使用 python 的 http.client 准确读取一个响应块?

    Using http client在 Python 3 3 或任何其他内置 python HTTP 客户端库 中 如何一次读取一个分块 HTTP 响应一个 HTTP 块 我正在扩展现有的测试装置 使用 python 编写 http clie
  • 如何为未捕获的异常处理程序编写单元测试

    我有一个函数可以捕获uncaught例外情况 如下 有没有办法编写一个单元测试来执行uncaught exception handler 功能正常 但测试正常退出 import logging def config logger logge
  • 如何使用 Python boto3 获取 redshift 中的列名称

    我想使用 python boto3 获取 redshift 中的列名称 创建Redshift集群 将数据插入其中 配置的机密管理器 配置 SageMaker 笔记本 打开Jupyter Notebook写入以下代码 import boto3
  • 将 C++ 指针作为参数传递给 Cython 函数

    cdef extern from Foo h cdef cppclass Bar pass cdef class PyClass cdef Bar bar def cinit self Bar b bar b 这总是会给我类似的东西 Can
  • 为什么第二个 request.session cookies 返回空?

    我想使用 requests Session post 登录网站 但是当我已经登录主页 然后进入帐户页面时 看来cookies还没有保存 因为cookies是空的 而且我无法进入正确的帐户页面 import requests from bs4
  • 是否有一个包可以维护所有带有符号的货币列表?

    是否有一个 python 包提供所有 或相当完整 货币的列表与符号 如美元的 有优秀的pycountry 贪财的 https github com limist py moneyed and ccy http code google com
  • 时间序列数据预处理 - numpy strides 技巧以节省内存

    我正在预处理一个时间序列数据集 将其形状从二维 数据点 特征 更改为三维 数据点 时间窗口 特征 在这样的视角中 时间窗口 有时也称为回顾 指示作为输入变量来预测下一个时间段的先前时间步长 数据点的数量 换句话说 时间窗口是机器学习算法在对
  • 为什么这个 if 语句会导致语法错误

    我正在尝试设置一个 elif 语句 如果用户按下 Enter 键 代码将继续 但是我不断遇到语法错误 GTIN 0 while True try GTIN int input input your gtin 8 number if len
  • 为正则表达式编写解析器

    即使经过多年的编程 我很羞愧地说我从未真正完全掌握正则表达式 一般来说 当问题需要正则表达式时 我通常可以 在一堆引用语法之后 想出一个合适的正则表达式 但我发现自己越来越频繁地使用这种技术 所以 自学并理解正则表达式properly 我决
  • 如何从列表类别中对 pandas 数据框进行排序?

    所以我在下面有这个数据集 我想根据我的列表从 名称 列进行排序 以及按 A 升序和按 B 降序排序 import pandas as pd import numpy as np df1 pd DataFrame from items A 1
  • 在 numpy 中连接维度

    我有x 1 2 3 4 5 6 7 8 9 10 11 12 shape 2 2 3 I want 1 2 3 4 5 6 7 8 9 10 11 12 shape 2 6 也就是说 我想连接中间维度的所有项目 在这种特殊情况下我可以得到这
  • 如何在 scikit 中加载 CSV 数据并将其用于朴素贝叶斯分类

    尝试加载自定义数据以在 Scikit 中执行 NB 分类 需要帮助将示例数据加载到 Scikit 中 然后执行 NB 如何加载目标的分类值 使用相同的数据进行训练和测试 或使用完整的数据集进行测试 Sl No Member ID Membe
  • Jupyter Notebook:带有小部件的交互式绘图

    我正在尝试生成一个依赖于小部件的交互式绘图 我遇到的问题是 当我使用滑块更改参数时 会在前一个绘图之后完成一个新绘图 而我预计只有一个绘图会根据参数发生变化 Example from ipywidgets import interact i
  • Python 中的 Unix cat 函数 (cat * > merged.txt)? [复制]

    这个问题在这里已经有答案了 一旦建立了目录 有没有办法在Python中使用Unix中的cat函数或类似的函数 我想将 files 1 3 合并到 merged txt 我通常会在 Unix 中找到该目录 然后运行 cat gt merged
  • 描述符“join”需要“unicode”对象,但收到“str”

    代码改编自here http wiki geany org howtos convert camelcase from foo bar to Foo Bar def lower case underscore to camel case s

随机推荐

  • AOP实现企业级API访问接口监控(通过Google Guava缓存数据)

    开发了企业的功能模块 分享给大家参考 若大家看到我的实现有不足之处或有自己的见解欢迎评论区分享 学习去咯 文章目录 前言 一 AOP的基本知识 1 什么是AOP 2 有哪些AOP的概念 3 AOP包含的几个概念 4 AOP 有哪些应用场景
  • QT打开文件及文件路径

    获取文件夹路径 static QString getExistingDirectory QWidget parent Q NULLPTR const QString caption QString const QString dir QSt
  • Android NDK添加NEON以及cpufeatures支持

    本人使用Android studio3 0进行NDK开发 由于Android develop官网文档是针对2 2版本以下 这里为2 2以上版本的cmakelist配置做以下纪录 一 添加NEON支持 在build gradle app 中添
  • vue实现element自定义新增、删除table表格的行,和可输入input(可以自行修改成双击表格可编辑)

    效果如图 新增表格行 可点编辑再修改表格行内容 也可以自行修改成双击表格可编辑 思路 1 新增表格行 handleAddBtn 给表格数组 我这里是用tableData数组 push空的对象 2 删除行 handleDeleteBtn 首先
  • Python轻量级Web框架Flask(2)——Flask模板渲染/Flask项目拆分

    1 run启动参数详解 debug 是否开启调试模式 开启后 debug true 修改过python代码会自动重启 不用停止运行之后再去启动 port 启动指定服务器的端口号 默认是5000 host 主机 默认是127 0 0 1 只有
  • MySQL技术内幕InnoDB存储引擎 学习笔记 第四章 表

    InnoDB引擎表中 每张表都有一个主键 如果创建表时没有显式定义主键 则 1 首先看表中是否有非空的唯一索引 如果有 则该列为主键 2 否则自动创建一个6字节大小的指针作为主键 InnoDB所有数据都逻辑地放在一个表空间中 表空间又由段
  • 基于SSM的校园旧书交易交换平台

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • KMeans算法

    目录 一 基本概念 二 Centroid Initialization Methods 三 Mini Batch K Means 四 找寻最优的聚类数量 4 1 拐点 4 2 silhouette score 轮廓分数 五 Kmeans的优
  • Java基础怎么样才算牢固,能熟练使用还是深入源码?

    java就是一门工具 本质上跟你开的车没什么区别 java的熟练程度 就犹如你的驾驶技术 本质上就是工具操作的熟练度 对于工具的操作而言 绝大多数人 会用就行了 源码基本上没有深入的必要 因为对于绝大多数程序员以及非程序员而言 这个轮不到你
  • B端产品的交互设计流程探索:乐高设计法和用户体验的二次提升

    面对突如其来的B端体验设计的挑战 可以解决吗 或者说设计师的思路该如何针对B端设计的特点进行调整 甚至设计管理的思路如何调整 一起来文章中看看解决办法 如何应对B端到来的挑战 随着互联网常规C端业务逐渐由蓝海转为红海 B端设计迎来了各种挑战
  • VS-SQL 连接DBHelper类

    using System using System Collections Generic using System Data using System Data SqlClient using System Text using Syst
  • 阿里云实习生部门笔试2020.04

    月初申请阿里c c 实习生 公司很快安排了上机笔试 是两道算法题大题 很难 没刷过题导致题目也看不怎么懂 笔试完第二天阿里云打电话安排另一场笔试 题目如下 评测题目 无 第一题 char str http www ibegroup com
  • python 题(附答案)

    1 一行代码实现1 100之和 gt gt 5050 2 描述 join 和split 区别 join用来连接字符串 split恰好相反拆分字符串 gt gt my name is huihui gt gt my name is huihu
  • vba可以放服务器上处理文档,当Word Doc位于服务器上时,如何从Excel VBA更改Word Doc中的文本?...

    我有一个宏 可以根据单词模板创建实验报告 然后将其保存到远程服务器 在我的Excel工作表中选择一个单元格 运行宏 使用空白模板打开Word实例 并根据所选单元格和其他数据保存文件 我想要做的是编辑空白模板中的标题 并将其更新为实验名称 该
  • 70进货卖100利润是多少_服装批发利润大揭秘!让你拿货砍价心里有个底

    你以为服装批发档口卖货的策略是薄利多销 你以为一包货只要小几百元很便宜 错 不要用零售的价格参考服装批发的价格 服装批发还可以更便宜 只要你了解服装批发商的利润空间 你就知道他们的价格底线在哪 拿货砍价更有目标 首先 我们从服装在市场上的来
  • python高性能服务器编写,Tornado的高性能服务器开发常用方法

    最近一直开发AI人脸识别相关的项目 需要提供给客户一些服务 所以我需要开发一些服务端程序 由于AI算法都是用python3写的 所以我就索性用起了python开发服务端 毕竟速度也快 以前用过Flask Django 这次决定有Tornad
  • 编译与链接

    把C 当脚本语言写 https www cnblogs com index html archive 2012 07 28 cppscript html vc 调用exe时 如何获取exe的输出信息 输出显示在IDE的输出中 http bl
  • [Python人工智能] 五.theano实现神经网络正规化Regularization处理

    从本系列文章开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前四篇文章讲解了神经网络基础概念 Theano库的安装过程及基础用法 theano实现回归神经网络 theano实现分类神经网络 这篇文章讲解Overfit
  • Hibenate技术详解

    一 Hibernate的基本用法 1 Hibernate的数据库操作 在所有的ORM框架中有一个非常重要的媒介 PO Persistence Object 持久化对象 持久化对象的作用是完成持久化操作 简单的说 通过该对象可以对数据进行增删
  • 逻辑回归介绍及statsmodels、sklearn实操

    目录 1 逻辑回归简要介绍 2 statsmodels中实现逻辑回归 3 sklearn实现逻辑回归 3 1 基础案例代码 3 2 样本不平衡问题处理 3 3 LogisticRegression模型参数说明 3 4 模型调优方法 1 逻辑