算法自学 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 函数的公式:
逻辑回归模型的核心是 Sigmoid 函数,它将线性回归的输出值(任何实数)压缩到 [0, 1] 的范围内,这样我们可以将输出解释为概率。
其中, ,即将特征向量 X 经过线性组合(权重 w 和偏置 b)后输入到 Sigmoid 函数中。
通过这种方式,我们将线性回归输出的值(通常是实数)转换为一个概率值:
3. 类别划分
逻辑回归通常使用 0.5 作为默认的阈值,将输出的概率值转换为二元分类的类别:
这个阈值可以根据具体的需求调整。
4. 召回率
召回率(Recall)是分类模型评估指标之一,尤其在 二元分类 问题中常用。召回率表示在所有实际为正例(Positive)的样本中,模型正确识别出的正例样本的比例。
公式:
三、代码
完整版代码和初步处理的数据集见文章绑定资源。
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)数据,…...

用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组成…...

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矩阵会改变顶点的位置信息。 输入: 顶点着色器输入部分主要是声明&…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...