【逻辑回归实例】

news2024/11/24 8:27:21

逻辑回归:从理论到实践

在本文中,我们将介绍一种被广泛用于二分类问题的机器学习模型——逻辑回归。我们将通过一个实例,深入解析如何在 Python 环境中实现逻辑回归。

源数据下载链接

1. 什么是逻辑回归?

逻辑回归是一种用于解决二分类问题的监督学习模型。它的主要思想是:首先将输入特征与线性回归模型相结合,然后将线性回归的输出通过一个称为 sigmoid 函数的特殊函数转换,使得其输出值落在 (0, 1) 之间,代表了正类的概率。具体地,逻辑回归模型的形式可以表示为:

其中,(P(Y=1|X)) 是在给定输入特征 (X) 的情况下,目标变量 (Y) 为正类的概率;(w_0, w_1, …, w_n) 是模型需要学习的参数;(X_1, X_2, …, X_n) 是输入特征。这个方程的右侧部分就是 sigmoid 函数,其图像是一个 S 形曲线,可以将任何实数映射到 (0, 1) 之间。

2. Python 实现逻辑回归:

接下来,我们将通过一个完整的例子来展示如何在 Python 中实现逻辑回归模型。

2.1 数据预处理

在进行机器学习模型的训练之前,我们首先需要对数据进行预处理。在这个例子中,我们使用了一个名为 “bank-full.csv” 的数据集。这个数据集包含了一些银行客户的信息,以及他们是否订阅了定期存款(这是我们的目标变量,用 “y” 表示)。

首先导入了所需的库,并读取数据集:

import pandas as pd
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import seaborn as sns

sns.set(style='white')
sns.set(style='whitegrid', color_codes=True)

data = pd.read_csv('bank-full.csv', sep=';', quotechar='"', header=0)
data.dropna(inplace=True)
print(data.head())
print(data.shape)
print(list(data.columns))

然后,我们对数据集中的每个属性的所有可能值进行了查询:

data['education'].unique()
print("education的所有可能值:")
print(data['education'].unique())
...

查询了目标变量 “y” 的值的分布,并通过柱状图进行可视化:

data['y'].value_counts()
print(data['y'].value_counts())

sns.countplot(x='y', data=data, palette='hls')
plt.show()

# 计算y值分布的百分比
count_no_sub = len(data[data['y'] == 'no'])
count_sub = len(data[data['y'] == 'yes'])
pct_of_no_sub = count_no_sub / (count_no_sub + count_sub)
print('未开户的百分比:%.2f%%' % (pct_of_no_sub * 100))
pct_of_sub = count_sub / (count_no_sub + count_sub)
print('开户的百分比:%.2f%%' % (pct_of_sub * 100))

通过计算y值分布得知,原始数据集的分布不均匀,需要对其进行处理






对不是数值型的数据进行独热编码

# 对分类变量(cat_vars)进行独热编码
cat_vars = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'poutcome']
for var in cat_vars:
    cat_list = pd.get_dummies(data[var], prefix=var)
    data = data.join(cat_list)
data_final = data.drop(cat_vars, axis=1)

print(data_final.columns.values)


由于之前发现原始数据集关于y值的分布并不均匀,所以需要对其处理,使用smote方法对数据进行过采样。

# 使用smote方法对数据进行过采样
from imblearn.over_sampling import SMOTE
X = data_final.loc[:, data_final.columns != 'y']
y = data_final.loc[:, data_final.columns == 'y'].values.ravel()

os = SMOTE(random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

columns = X_train.columns
os_data_X, os_data_y = os.fit_resample(X_train, y_train)
os_data_X = pd.DataFrame(data=os_data_X, columns=columns)
os_data_y = pd.DataFrame(data=os_data_y, columns=['y'])

# 检查过采样后的数据
print('过采样后的数据个数:', len(os_data_X))
print('未开户的个数:', len(os_data_y[os_data_y['y'] == 'no']))
print('开户的个数:', len(os_data_y[os_data_y['y'] == 'yes']))
print('未开户的百分比:%.2f%%' % (len(os_data_y[os_data_y['y'] == 'no']) / len(os_data_X) * 100))
print('开户的百分比:%.2f%%' % (len(os_data_y[os_data_y['y'] == 'yes']) / len(os_data_X) * 100))

2.2 模型训练和评估

在完成了数据预处理之后,我们就可以开始训练我们的逻辑回归模型了。在这个过程中,我们会使用到 sklearn 库的 LogisticRegression 类。我们首先会将数据集划分为训练集和测试集,然后在训练集上训练模型,在测试集上评估模型的性能。

# 逻辑回归模型
from sklearn.linear_model import LogisticRegression
from sklearn import metrics

logreg = LogisticRegression()
logreg.fit(os_data_X, os_data_y.values.reshape(-1))
# 使用逻辑回归模型进行预测
y_pred = logreg.predict(X_test)
print('逻辑回归模型的准确率:', metrics.accuracy_score(y_test, y_pred))

from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

# 可视化混淆矩阵
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_test, y_pred)
print(confusion_matrix)

# 计算和绘制二分类模型的 ROC 曲线和计算 ROC AUC 分数
from sklearn.metrics import roc_auc_score, roc_curve
from sklearn.preprocessing import LabelEncoder

# 创建 LabelEncoder 实例
le = LabelEncoder()

# 将目标变量和预测结果编码为数值标签
y_test_encoded = le.fit_transform(y_test)
y_pred_encoded = le.transform(logreg.predict(X_test))

# 计算 ROC AUC 分数
logit_roc_auc = roc_auc_score(y_test_encoded, y_pred_encoded)

# 计算 ROC 曲线
fpr, tpr, thresholds = roc_curve(y_test_encoded, logreg.predict_proba(X_test)[:, 1])

# 绘制 ROC 曲线
plt.figure()
plt.plot(fpr, tpr, label='Logistic Regression (area = %0.2f)' % logit_roc_auc)
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

结果如下:

混淆矩阵:

3. 结论

逻辑回归可以应用于各种二分类问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/747119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一次零基础靶机渗透细节全程记录

一、打靶总流程 1.确定目标: 在本靶场中,确定目标就是使用nmap进行ip扫描,确定ip即为目标,只是针对此靶场而言。其他实战中确定目标的方式包括nmap进行扫描,但不局限于这个nmap。 2.信息收集: 比如平常挖…

园区预付费远程抄表方案

园区预付费远程抄表方案是一种能够实现园区内电表数据远程采集、实时监控和预付费管理的方案。该方案解决了传统手动抄表方式的不便和不准确问题,同时避免了上门收费的安全隐患和成本问题。下面将从方案组成、工作原理、优点等方面进行详细介绍。 一、方案组成 园区…

P1095 [NOIP2007 普及组] 守望者的逃离

总的来说就是能闪则闪&#xff0c;闪烁在能闪时一定比跑的快&#xff1b;分批进行&#xff0c;判断哪个更快&#xff1b; 直接上代码吧&#xff0c;里面有注释&#xff0c; #include <iostream>using namespace std;const int N 3e5 5; int M, S, T, blue[N], dp[N];…

selenium自动化测试的显示等待

目录 等待条件 条件类的实现原理 WebDriverWait是如何进行条件判断的 selenium里都有哪些条件 然后就是自定义了 总结&#xff1a; 在进行UI自动化测试的时候&#xff0c;我们为了保持用例的稳定性&#xff0c;往往要设置显示等待&#xff0c;显示等待就是说明确的要等到某…

Java中的IO流详解

目录 友情提醒第一章、File类和IO技术概述1.1&#xff09;File类和IO技术的作用1.2&#xff09;创建File类对象1.3&#xff09;File类中的方法1.4&#xff09;文件过滤器&#xff1a;FileFileter 第二章、IO流2.1&#xff09;IO流的分类2.2&#xff09;字节输入流&#xff1a;I…

【Matlab】智能优化算法_非洲秃鹫优化算法AVOA

【Matlab】智能优化算法_非洲秃鹫优化算法AVOA 1.背景介绍2.数学模型3.文件结构4.算法流程图5.伪代码6.详细代码及注释6.1 AVOA.m6.2 boundaryCheck.m6.3 exploitation.m6.4 exploration.m6.5 initialization.m6.6 levyFlight.m6.7 main.m6.8 ObjectiveFunction.m6.9 random_se…

ARPACK特征值求解分析

线性方程组求解、特征值问题是数值线性代数的主要研究内容。力学、电磁等许多问题&#xff0c;最终都可以归结为特征值、特征向量的求解。 ARPACK使用IRAM(Implicit Restarted Arnoldi Method)求解大规模系数矩阵的部分特征值与特征向量。了解或者熟悉IRAM算法&#xff0c;必定…

S32K flash擦除异常以及flash保护 (FLASH_DRV_CommandSequence函数异常)

出现问题 出现擦除flash异常,一直在FLASH_DRV_CommandSequence卡死复位 但是出现比较奇怪的现象&#xff0c;通过DEBUG在线调试&#xff0c;打断点&#xff0c;一步一步调试可以正常对flash正常擦除读写&#xff0c;但是脱离在线调试就出现不能正常擦除读写。 出现这种还是看…

大模型基础之大语言模型的进展

关键字&#xff1a;LLM大语言模型&#xff0c;fine-tuning微调 预训练语言模型的两种范式 1 特征提取器 提取语言的特征和表示&#xff0c;作为下游模型的输入。例如有名的word2vec模型。 use the output of PLMs as the input of downstream model 2 fine-tuning&#xf…

【代码随想录 | Leetcode | 第一天】数组 | 二分查找 | 边界问题 | 34-35-69-367-704

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来二分查找边界问题&#xff08;循环不变量规则&#xff09;的分享✨ 目录 前言704. 二分查找367. 有效的完全平方数69. x 的平方根35. 搜索插入位置34. 在排序数组中查找元素的第一个和最后一个位…

PN结、形成过程、单向导电性、伏安特性、电容效应

目录 1.1.3PN结 PN结形成过程&#xff1a; PN结的单向导电性&#xff1a; PN结的伏安特性 PN结的电容效应 1.1.3PN结 形成&#xff1a;由于扩散运动而形成 扩散运动&#xff1a;物质总是从浓度高的地方向浓度低的地方运动&#xff0c;这种由于浓度差而产生的运动称为扩散运…

微服务 云原生:微服务相关技术简要概述

后端架构演进 单体架构 所谓单体架构&#xff0c;就是只有一台服务器&#xff0c;所有的系统、程序、服务、应用都安装在这一台服务器上。比如一个 bbs 系统&#xff0c;它用到的数据库&#xff0c;它需要存储的图片和文件等&#xff0c;统统都部署在同一台服务器上。 单体架…

ubuntu20.04配置vscode

下载&#xff1a; https://az764295.vo.msecnd.net/stable/660393deaaa6d1996740ff4880f1bad43768c814/code_1.80.0-1688479026_amd64.debhttps://az764295.vo.msecnd.net/stable/660393deaaa6d1996740ff4880f1bad43768c814/code_1.80.0-1688479026_amd64.deb 安装&#xff1a…

MySQL基础篇第9章(子查询)

文章目录 1、需求分析与问题解决1.1 实际问题1.2 子查询的基本使用1.3 子查询的分类 2、单行子查询2.1 单行比较操作符2.2 代码示例2.3 HAVING中的子查询2.4 CASE中的子查询2.5 子查询中的空值问题2.6 非法使用子查询 3、多行子查询3.1 多行比较操作符3.2 代码示例3.3 空值问题…

vuepress - - - 首页底部版权信息加a标签超链接跳转或备案信息跳转链接

修改前 默认的底部版权信息只能填写纯文本&#xff0c;加不了超链接跳转等。 对应\docs\README.md内容&#xff1a; 修改后 修改后&#xff0c;点击Zichen跳转会打开新的网页。 看官网例子 底部添加了备案号跳转链接。 找到官网的github部署的文件。点导航栏中的“指…

flutter开发实战-实现webview与Javascript通信JSBridge

flutter开发实战-实现webview与H5中Javascript通信JSBridge 在开发中&#xff0c;使用到webview&#xff0c;flutter实现webview是使用原生的插件实现&#xff0c;常用的有webview_flutter与flutter_inappwebview 这里使用的是webview_flutter&#xff0c;在iOS上&#xff0c;…

【IMX6ULL驱动开发学习】20. input子系统(按键实现ls命令)

一、input子系统相关结构体 二、input子系统实例实现&#xff1a; static struct input_dev *key_input;...... ....../* 1.申请空间 */ key_input input_allocate_device(); if(key_input NULL){printk("input alloc failed\n");return -ENOMEM; } /* 2.设置事件类…

Go实现WebSocket

Go语言标准包里面没有提供对WebSocket的支持&#xff0c;但是在由官方维护的go.net子包中有对这个的支持&#xff0c;你可以通过如下的命令获取该包&#xff1a; go get golang.org/x/net/websocket WebSocket分为客户端和服务端&#xff0c;接下来我们将实现一个简单的例子:…

云进销存是什么意思,云进销存系统该如何选?

云进销存是指基于云计算技术的一种进销存管理系统&#xff0c;云进销存系统可以帮助企业或中小商户实时监控库存情况、优化采购和销售流程、提高物流效率&#xff0c;以及生成各类报表和统计分析&#xff0c;从而提升企业或商户的运营效率和管理水平。 一、云进销存对中小商户有…

C#,数值计算——不完全 Beta 函数(incomplete beta function)的源代码

Incomplete Beta Function The incomplete beta function (also called the Euler Integral) is a generalized β-function; An independent integral (with integral bounds from 0 to x) replaces the definite integral. The formula is: Where: 0 ≤ x ≤ 1, a, b > 0…