当前位置: 首页 > news >正文

算法自学 Lesson3 - 逻辑回归(LR)

目录

背景

一、适用数据集

1. 数据集选择

1.1 领域

1.2 数据集维度

1.3 记录行(样本数量)

2. 本文数据集介绍

3. 数据集下载

注意

二、逻辑回归的基本原理

1. 目的

2. Sigmoid 函数

3. 类别划分

4. 召回率

三、代码

1. 导入所需包&数据集

2. 数据预处理&数据编码

2.1 数据预处理

2.2 数据预处理&编码(Titanic dataset版,可跳过)

3. 绘制热力图

4. 数据拆分&标准化

5. 逻辑回归分类算法

6. 绘制 PR / ROC 曲线

6.1 PR 曲线

6.2 ROC 曲线


背景

逻辑回归(Logistic Regression)是一种用于分类问题的统计模型,尽管名字里有“回归”,但它主要用于解决二元分类(binary classification)或多类分类问题。与线性回归不同,逻辑回归输出的是一个概率,通过设置阈值将概率转换为类别。

一、适用数据集

1. 数据集选择

逻辑回归适用于二分类问题,即输出为两个类别(如【是/否】或【正/负】)。若要练习逻辑回归分析,在选择数据集时可以参考以下 3 个方面。反过来,如果在为项目选择合适的算法模型时,数据集符合以下条件,则可以选用逻辑回归进行数据分析。

1.1 领域

逻辑回归广泛应用于各种领域,包括但不限于:

  • 医疗健康:预测某人是否患病(如患病/不患病,阳性/阴性)。
  • 金融:预测贷款申请是否会被批准,或是否会违约(如信用风险评估)。
  • 市场营销:根据用户行为预测是否会购买产品或订阅服务。
  • 社交媒体:通过用户行为预测某个帖子是否会获得点赞或分享。
  • 人力资源:预测员工是否会离职。
  • 教育:预测学生是否会通过考试或被录取。

1.2 数据集维度

  • 特征数(维度):逻辑回归适用于中低维度的数据集。一般情况下,输入特征数从 2 到 20 维是常见的范围。过多的特征可能会导致过拟合,尤其是当样本数量不足时。
  • 类别标签:逻辑回归特别适用于二分类任务,因此类别标签只有两个(如 0 和 1,或者 “A 类” 和 “B 类”)。

1.3 记录行(样本数量)

样本量大小:逻辑回归的一个优势是即使在较小的数据集上也能有效工作,通常数百到几千条记录的样本集即可获得良好的训练效果。典型样本数量可以在 100 到 10,000 行之间:

  • 小型数据集(100-1000 行):适合初学者理解逻辑回归的基本概念和快速训练模型。
  • 中型数据集(1000-10,000 行):适合做一些更复杂的练习,如交叉验证、正则化等。

2. 本文数据集介绍

Titanic 数据集 基于 1912 年泰坦尼克号沉船事故的真实乘客数据,泰坦尼克号是当时最大的远洋客轮之一,但在其首次航行中不幸撞上冰山沉没,超过1500人遇难。该数据集包含了泰坦尼克号部分乘客的个人信息以及他们是否在船难中幸存,分析目的是:预测哪些乘客能够在这场灾难中幸存下来

数据集中包含 12 列的维度信息,详细如下:

  • PassengerId: 乘客的唯一标识符。
  • Survived: 是否幸存,目标变量(0 = 未幸存,1 = 幸存)。
  • Pclass: 乘客舱位等级(1 = 一等舱,2 = 二等舱,3 = 三等舱)。
  • Name: 乘客姓名。
  • Sex: 性别(male = 男性,female = 女性)。
  • Age: 年龄(有部分缺失值)。
  • SibSp: 同行的兄弟姐妹或配偶人数。
  • Parch: 同行的父母或子女人数。
  • Ticket: 票号。
  • Fare: 票价。
  • Cabin: 船舱号(有部分缺失值)。
  • Embarked: 登船地点(C = Cherbourg, Q = Queenstown, S = Southampton)。

数据记录行共有 1309 行,属于中型数据集。

3. 数据集下载

数据集下载地址:https://www.kaggle.com/datasets/heptapod/titanic

也可以在文首 绑定资源 中下载获取,原版下载出来有多列是无意义的【zero】列,作者这里直接在表里删了,上传资源为处理后的。自行在 Kaggle 下载的朋友记得处理【zero】列。

注意

Kaggle 上 Titanic 数据集有俩都点赞比较高,不要选择看起来更完整的 Titanic dataset!

博主先使用了 Titanic dataset,因为预测结果全都是 100%,于是开始 debug。。。

直到发现这个数据集的获救与否是由性别决定的(dead。。)

重复:千万要使用对的 Titanic 数据集啊!

二、逻辑回归的基本原理

1. 目的

逻辑回归的目的是预测输入数据属于某一类别的概率。它最常用于二元分类问题,例如:预测某个乘客在 Titanic 数据集中是否生还。

2. Sigmoid 函数

Sigmoid 函数的公式:

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

逻辑回归模型的核心是 Sigmoid 函数,它将线性回归的输出值(任何实数)压缩到 [0, 1] 的范围内,这样我们可以将输出解释为概率。

其中,z = w^T X + b ,即将特征向量 X 经过线性组合(权重 w 和偏置 b)后输入到 Sigmoid 函数中。

通过这种方式,我们将线性回归输出的值(通常是实数)转换为一个概率值:

P(y=1|X)

3. 类别划分

逻辑回归通常使用 0.5 作为默认的阈值,将输出的概率值转换为二元分类的类别:

\hat{y} = \begin{cases} 1 & \text{if } P(y=1|X) > 0.5 \\ 0 & \text{if } P(y=1|X) \leq 0.5 \end{cases}

这个阈值可以根据具体的需求调整。

4. 召回率

召回率(Recall)是分类模型评估指标之一,尤其在 二元分类 问题中常用。召回率表示在所有实际为正例(Positive)的样本中,模型正确识别出的正例样本的比例。

公式:

\text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}}

三、代码

完整版代码和初步处理的数据集见文章绑定资源

1. 导入所需包&数据集

#数据分析与可视化包
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号from sklearn.model_selection import learning_curve, train_test_split
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.linear_model import LogisticRegression #逻辑回归
from sklearn.metrics import roc_curve, auc, precision_recall_curve
from sklearn.metrics import log_loss
from sklearn.pipeline import make_pipelinefrom sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score
#accuracy_score,准确率
#f1_score,精确率和召回率的调和平均数
#precision_score,精确率
#recall_score,召回率from sklearn.metrics import confusion_matrix, classification_report
#confusion_matrix混淆矩阵
#classification_report任务性能分析Titanic_data=pd.read_csv("D:/project/Jupyter/csdn/AI_ML/datasets/Lesson3_Titanic.csv")Titanic_dataTitanic_data.info()

2. 数据预处理&数据编码

2.1 数据预处理

# 将 float 类型转换为 int 类型
Titanic_data['Age'] = Titanic_data['Age'].astype('int64')
Titanic_data['Fare'] = Titanic_data['Fare'].astype('int64')# 用众数填充 Embarked(登船地点)列缺失值
Titanic_data['Embarked'].fillna(Titanic_data['Embarked'].mode()[0], inplace=True)# 将 float 类型转换为 int 类型
Titanic_data['Embarked'] = Titanic_data['Embarked'].astype('int64')

2.2 数据预处理&编码(Titanic dataset版,可跳过)

本部分是 Titanic dataset 的预处理,相对完整。参考一下就行,在 Titanic 数据集用不到。

# 填补缺失值
# Age(年龄)列用中位数填充,Embarked(登船地点)列用众数填充
# 按乘客的票舱等级(Pclass)进行分组,分别计算每个等级的均值填补 Fare(票价)列
Titanic_data['Age'].fillna(Titanic_data['Age'].median(), inplace=True)
Titanic_data['Embarked'].fillna(Titanic_data['Embarked'].mode()[0], inplace=True)
Titanic_data['Fare'] = Titanic_data.groupby('Pclass')['Fare'].apply(lambda x: x.fillna(x.median()))# 将 非int或float 类型列进行编码变为 int 类型
# 将性别和登船港口编码为数值
Titanic_data['Sex'] = Titanic_data['Sex'].map({'male': 0, 'female': 1})
Titanic_data['Embarked'] = Titanic_data['Embarked'].map({'C': 0, 'Q': 1, 'S': 2})# 丢弃无用的列
Titanic_data.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)# 对 Age 和 Fare 列进行四舍五入,并转换为 int64 型
Titanic_data['Age'] = Titanic_data['Age'].round().astype('int64')
Titanic_data['Fare'] = Titanic_data['Fare'].round().astype('int64')# 查看处理后的数据
Titanic_data.head()Titanic_data.info()

由于 'Name'、 'Ticket' 列,即 “姓名”、“票号” 列都是唯一的,在判断乘客是否会遇难时无法起到帮助分析作用,即可删去。

由于 'Cabin' 列,即 “船舱号” 并无性质表现,且缺失过多,分析是可删去,以免大量的填补数据干扰模型预测结果。

3. 绘制热力图

显示各个特征之间的相关性,并显示不同特征之间的相关关系。观察数据各维度之间的相关性,同时具有验证数据集可用性的功效(如作者通过热力图发现 Titanic dataset 用不了)。

plt.figure(figsize=(10, 8))
sns.heatmap(Titanic_data.corr(), annot=True, cmap='coolwarm')
plt.title('Correlation Heatmap')
plt.show()

4. 数据拆分&标准化

# 特征选择
X = Titanic_data.drop('Survived', axis=1)
y = Titanic_data['Survived']# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 标准化特征(可选,但推荐逻辑回归中进行特征缩放)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

5. 逻辑回归分类算法

# 使用 scikit-learn 的逻辑回归模型
model = LogisticRegression(max_iter=10000,penalty='l2',#C=0.1,#solver='liblinear',class_weight="balanced")
model.fit(X_train, y_train)# 预测
y_pred_test = model.predict(X_test)
print(classification_report(y_test,y_pred_test))y_pred_train = model.predict(X_train)
print(classification_report(y_train,y_pred_train))confusion_matrix(y_train,y_pred_train)#生成混淆矩阵#画热力图
sns.heatmap(confusion_matrix(y_test,y_pred_test),annot=True,fmt="d")accuracy_score(y_pred_test,y_test)#准确率
f1_score(y_pred_test,y_test)#精确率和召回率的调和平均数# 从负类,计算模型精确率和召回率
precision_score(y_pred_test,y_test,pos_label=0)#精确率
recall_score(y_pred_test,y_test,pos_label=0)#召回率print(model.coef_)print(model.intercept_)# 显示模型系数
coefficients = pd.DataFrame(model.coef_.flatten(), index=X.columns, columns=['Coefficient'])
print(coefficients)pd.DataFrame(model.coef_,columns=X.columns).T.plot(kind="barh")#显示系数大小model.predict_proba(X_test)model.predict(X_test)# 从正类,计算精确率和召回率
precision = precision_score(y_test, y_pred_test,pos_label=1)
recall = recall_score(y_test, y_pred_test,pos_label=1)print(f"Precision: {precision}")
print(f"Recall: {recall}")

6. 绘制 PR / ROC 曲线

6.1 PR 曲线

显示模型在不同阈值下的精确率和召回率的权衡关系。

probs=model.predict_proba(X_test)[:,0]
precision,recall,thresholds=precision_recall_curve(y_test,probs,pos_label=0)
plt.plot(recall,precision)
plt.title("Precision-Recall Curve")
plt.xlabel("recall")
plt.ylabel("precision")pd.DataFrame([precision,recall,thresholds])

6.2 ROC 曲线

probs=model.predict_proba(X_test)[:,1]
fpr,tpr,thresholds=roc_curve(y_test,probs,pos_label=1)
roc_auc = auc(fpr, tpr)
plt.plot(fpr,tpr, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], linestyle='--')
plt.title("roc_curve")
plt.xlabel("fpr")
plt.ylabel("tpr")
plt.legend(loc='lower right')
plt.show()

AUC 在 0.8 到 0.9 之间,表明模型具有良好的性能,可以有效地区分正例和负例。

相关文章:

算法自学 Lesson3 - 逻辑回归(LR)

目录 背景 一、适用数据集 1. 数据集选择 1.1 领域 1.2 数据集维度 1.3 记录行(样本数量) 2. 本文数据集介绍 3. 数据集下载 注意 二、逻辑回归的基本原理 1. 目的 2. Sigmoid 函数 3. 类别划分 4. 召回率 三、代码 1. 导入所需包&数…...

文件IO流

1.文件流概念 2.文件创建方式 3.常用方法 4.IO流原理 (1)InputStream,OutputStream, Reader, Writer四个都是抽象类,无法直接new, 需要由子类继承,然后new子类; (2)Reader和Writer…...

拥塞控制与TCP子问题(粘包问题,异常情况等)

​拥塞控制 除了拥塞控制 以上的策越都是为了解决tcp 客户端和服务端提高效率,解决丢包的策略 但是拥塞控制是了为解决网络拥堵 出现了大面积丢包,我们发送方会判定是网络出现了问题? 丢包好解决,我们直接采用超时重传&#…...

stm32入门教程--DMA 超详细!!!

目录 简介 工作模式 1、数据转运DMA 2、ADC扫描模式DMA 简介 工作模式 1、数据转运DMA 这个例子的任务是将SRAM的数组DataA,转运到另一个数组DataB中,这个基本结构里的各个参数应该如何配置呢? 首先是外设站点和存储器站点的起始地址、…...

【使用Flask构建RESTful API】从零开始开发简单的Web服务!

使用Flask构建RESTful API:从零开始开发简单的Web服务 引言 随着Web应用程序的广泛使用,RESTful API已成为现代Web服务的核心技术之一。通过RESTful API,我们可以轻松地创建、读取、更新和删除(CRUD)数据&#xff0c…...

用sdcc给51单片机编译C程序

学习单片机大部分人用的是Keil uVision,虽然好用,可大部分人用的是盗版,其实单片机程序小的话,完全可以用文本编辑器(推荐notepad)编写,然后用免费的sdcc来编译,下面介绍一下大致的过程。 sdcc…...

Java Lock LockSupport 源码

前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & Lock & LockSupport & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Java & Lock & LockSupport & 总结》(学习总结/最新…...

Elasticsearch基础操作入门

阅前准备知识 学习 Elasticsearch (简称 ES) 的查询方式,建议从以下几个步骤入手: 理解 Elasticsearch 的基础概念 首先要了解 Elasticsearch 的核心概念,例如: Index(索引):相当于数据库中…...

跨域问题解决办法

跨域问题在Web开发中是一个常见的问题,特别是在前后端分离的开发模式下。以下是一些解决跨域问题的办法: 一、后端配置CORS(跨来源资源共享) CORS是一种机制,它使用额外的HTTP头来告诉浏览器一个网页的当前来源&…...

【数据结构与算法】力扣 23. 合并 K 个升序链表

题干描述 23. 合并 K 个升序链表 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入: lists [[1,4,5],[1,3,4],[2,6]] 输出: [1,1,2,3,4,4,5,6]…...

Java Lock CountDownLatch 总结

前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & Lock & CountDownLatch & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Java & Lock & CountDownLatch & 总结》(学习总…...

vue+spreadjs开发

创建vue3项目 pnpm create vite --registryhttp://registry.npm.taobao.org安装spreadjs包 pnpm install "grapecity-software/spread-sheets17.1.7" "grapecity-software/spread-sheets-resources-zh17.1.7" "grapecity-software/spread-sheets-vu…...

针对初学者的PyTorch项目推荐

文章目录 1. MNIST手写数字识别2. CIFAR-10图像分类3. 图像风格迁移4. 文本生成(使用RNN)5. 简单的问答系统6. 简单的生成对抗网络(GAN)7. 简单的推荐系统 对于初学者来说,选择一些简单且具有教育意义的项目来实践PyTo…...

Helm Chart文件介绍

介绍(这个还没有完善 ,目前在找工作呢) Helm是Kubernetes的包管理器,类似于Ubuntu中的apt、CentOS中的yum或Python中的pip,可以快速查找、下载和安装软件包。Helm主要由客户端组件helm和服务端组件Tiller组成&#xf…...

1Panel 是新一代的 Linux 服务器运维管理面板

1Panel 是一款新一代的 Linux 服务器运维管理面板,旨在通过现代化的 Web 界面帮助用户轻松管理 Linux 服务器。它集成了主机监控、文件管理、数据库管理、容器管理等功能,并且支持多语言和国际化,包括英语、中文(繁体)和日语。以下是 1Panel …...

Qml-ShaderEffect的使用

Qml-ShaderEffect的使用 ShaderEffect的概述 ShaderEffect使用自定义的顶点和片段着色器用于渲染一个矩形。用于在qml场景中添加阴影、模糊、着色和页面卷曲等效果。 Qt5和Qt6中ShaderEffect有一定区别,在Qt6中由于支持不同的渲染API,ShaderEffect是用…...

鸿蒙next之axios二次封装并携带cookie

由于官方提供的ohos.net.http模块,直接使用不是很灵活,就引入了第三方ohos/axios库。 以下是引入axios并进行二次封装的步骤: 1、DevEco Studio打开终端输入命令安装插件 ohpm install ohos/axios 2、新建RequestUtil.ets import { JSON, …...

WordPress中最值得推荐的AI插件:专家级指南

WordPress平台上,人工智能(AI)技术不断发展,为用户提供了丰富的工具和功能。对于有经验的用户,这些工具不仅能提升网站性能和用户体验,还能在安全和互动方面提供更多支持。在这篇文章中,我将为大…...

HTTP介绍及请求过程

HTTP(HyperText Transfer Protocol),即超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。以下是关于 HTTP 的详细介绍: 一、基本概念 定义与作用: HTTP 是互联网上应用最为广泛的一种网络协议,它定义了客户端和服务器之间请求和响应的标准方式。…...

WebGL进阶(五)-可视域

理论基础: 顶点着色器 Vertex Shader 主要是负责处理顶点位置、顶点颜色、顶点向量等顶点的数据;处理一些顶点的变换:例如在进行视图变换和投影变换时MVP矩阵会改变顶点的位置信息。 输入: 顶点着色器输入部分主要是声明&…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes&#xff0…...

如何为服务器生成TLS证书

TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...