手动实现逻辑回归算法(LogisticRegression)

目录

1. 前言

2. 示例

3. 原理介绍

4. 实验代码


1. 前言

逻辑回归是一种解决分类问题的算法

值得注意的是,在机器学习中,回归指的是连续型数据的预测问题。而这里的逻辑回归特指分类任务,比如判断一个人是否患病、是否健康等等

逻辑回归引入曲线函数:S型曲线,sigmoid函数

它能将输出值压缩在0-1之间,从而解决了线性回归不适用分类问题的问题。

关于sigmoid函数的优缺点分析可以参考:神经网络中激活函数介绍、优缺点分析-CSDN博客

逻辑回归的核心思想是:使用线性回归的思想来计算一个分数,然后通过 S型曲线(Sigmoid函数)将这个分数转化为类别1的概率。

2. 示例

假设我们要预测某个人是否健康:

  • 假如输入变量 x、y 包含年龄和体重等信息,我们通过线性组合(如z =ax+ by)得到 。

  • 然后通过S型曲线将z 转换为一个概率。如果这个概率超过某个阈值(例如0.5),我们就预测这个人健康,否则就认为不健康。

例如:假设

用逻辑回归模型预测一个人是否某种健康。我们手里有数据集,每个样本都有两列:年龄和体重,输出是 0(健康)或 1(不健康)。

年龄 x体重 y是否健康 z
25700
45851
35650
50901

 

3. 原理介绍

逻辑回归的目标是预测二元分类问题,输出的结果是一个0或1的概率。为了将线性回归的输出(无限范围的实数)转化为一个概率,使用Sigmoid函数

Sigmoid函数将任何实数映射到0到1之间,适合用来表示概率:

其中z=ax+by等等,这里的x、y是输入数据,也就是特征,a、b是权重,也就是特征的重要程度

Sigmoid函数的输出可以理解为“属于类别1的概率”。当输出接近1时,模型认为数据点属于类别1的概率较高;当输出接近0时,模型认为数据点属于类别0的概率较高。

损失函数:交叉熵损失

为了优化模型,使用交叉熵损失函数(log loss)来衡量模型预测的概率与真实类别标签之间的差距。交叉熵损失定义如下:

其中,yi 是真实类别,pi是预测值

交叉熵函数这块尤其重要,特别对于图像分割而言,聊聊关于分类和分割的损失函数:nn.CrossEntropyLoss()-CSDN博客

这篇博文做了详细介绍和实验,建议不懂得自己看下

梯度下降

逻辑回归通常通过梯度下降法来更新权重和偏置项,以最小化损失函数。

矩阵的梯度计算:聊聊关于矩阵反向传播的梯度计算-CSDN博客

4. 实验代码

实验的逻辑、步骤如下

  • 数据生成:创建两个特征,使用简单的条件生成二元分类数据。两个特征之和大于0的点被归为类别1,反之为类别0。

  • 训练模型:使用 LogisticRegression 训练模型。

  • 性能评估:使用混淆矩阵、ROC曲线、模型系数等方式评估模型的表现。

  • 绘图部分:绘制四个图形,分别是数据分布图、混淆矩阵、ROC曲线、逻辑回归的特征系数图。

代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, roc_curve, auc# 生成虚拟数据集
np.random.seed(42)
N = 1000
X = np.random.randn(N, 2)  # 生成两个特征
y = (X[:, 0] + X[:, 1] > 0).astype(int)  # 逻辑回归目标类别(0或1)# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 模型训练
model = LogisticRegression()
model.fit(X_train, y_train)# 模型预测
y_pred = model.predict(X_test)
y_pred_prob = model.predict_proba(X_test)[:, 1]# 计算模型精度
accuracy = accuracy_score(y_test, y_pred)
print(f'模型精度: {accuracy:.2f}')# 混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
print("混淆矩阵:\n", conf_matrix)# 绘图风格设置
sns.set(style="whitegrid")
plt.figure(figsize=(14, 10))# 1. 绘制数据分布图
plt.subplot(2, 2, 1)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', edgecolor='k')
plt.title('Data Distribution (Red: Class 1, Blue: Class 0)')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')# 2. 混淆矩阵可视化
plt.subplot(2, 2, 2)
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', cbar=False)
plt.title('Confusion Matrix')
plt.xlabel('Predicted Class')
plt.ylabel('True Class')# 3. ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred_prob)
roc_auc = auc(fpr, tpr)
plt.subplot(2, 2, 3)
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC Curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc="lower right")# 4. 逻辑回归系数
plt.subplot(2, 2, 4)
coefs = pd.Series(model.coef_[0], index=['Feature 1', 'Feature 2'])
coefs.plot(kind='bar', color='orange')
plt.title('Logistic Regression Coefficients')
plt.ylabel('Coefficient Value')plt.tight_layout()
plt.show()

输出如下:

  1. 数据分布图:显示虚拟数据集的两个特征以及分类结果(红色为类别1,蓝色为类别0)。

  2. 混淆矩阵:展示预测与真实标签的对比,用颜色区分预测正确和错误的数量。

  3. ROC曲线:展示模型的假阳性率和真阳性率的权衡,计算AUC值衡量模型性能。

  4. 逻辑回归系数:展示模型训练后得到的特征权重,以柱状图的形式显示每个特征的重要性。

这里使用了库函数,如果想要从头实现逻辑回归,可以参考之前的代码:

pytorch 深度学习初体验_听风吹等浪起的博客-CSDN博客

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

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

相关文章

nodejs基于vue+express度假村旅游管理系统设计与实现7t82p

目录 功能介绍数据库设计具体实现截图技术栈技术论证解决的思路论文目录核心代码风格详细视频演示源码获取 功能介绍 实现了一个完整的农家乐系统,其中主要有用户表模块、关于我们模块、收藏表模块、公告信息模块、酒店预订模块、酒店信息模块、景区信息模块、景区…

ARM(Day 2)

一、作业 (1)汇编代码 .text.globl _start_start:mov r0, #0x5mov r1, #0x10比较r0,r1 是否相等 相等执行stop 不相等执行下一步比较( r0 > r1 ?)cmp r0, r1 比较实际在做减法 (YES NO )subhi r0, r0, r1 r0 > r1 …

VLDB 2024 圆桌会议回顾:展望物联网与 AI 时代的时序数据库

回顾我们在 VLDB 2024 8 月 26 日至 8 月 30 日,数据库领域的顶级国际会议 VLDB 2024 在广州举行。IoTDB 最新研发成果的三篇论文被本次大会录用(详见:IoTDB 在顶级会议 VLDB 2024:四篇最新论文入选,特邀做 TPC 报告与…

MySQL篇(存储过程 触发器 存储函数)(持续更新迭代)

目录 一、存储过程 1. 简介 2. 特点 3. 语法 3.1. 创建 3.2. 调用 3.3. 查看 3.4. 删除 4. 示例 二、变量 1. 简介 2. 系统变量 2.1. 查看系统变量 2.2. 设置系统变量 2.3. 演示示例 3. 用户定义变量 3.1. 赋值 方式一 方式二 3.2. 使用 3.3. 演示示例 4.…

计算机组成原理——存储系统

计算机组成原理——存储系统 存储器层次结构 存储器层次结构如下: 寄存器(CPU)Cache(高速缓冲存储器)主存磁盘磁带、光盘等 按照上述层次结构,自下而上速度依次增快、容量相对依次渐小、造价越来越高昂…

vitis2022.2生成动态设备树

打开vitis 点击xilinx 点击generate Device Tree 导入硬件描述文件,以及指定输出目录 再点击Modify Device Tree Settings 修改device_tree下的dt_overlay 修改后点击ok 最后点击generate即可

每日学习一个数据结构-Trie树(字典树)

文章目录 定义节点结构根节点插入操作查找操作删除操作特点应用示例 “Trie”树,又称为前缀树或字典树,是一种专门用于存储字符串的数据结构。它在许多应用程序中都非常有用,特别是在那些需要高效查找、插入和删除字符串的应用场景中。下面是…

网络通信——路由器、交换机、集线器(HUB)

注意:传输层,应用层没有网路设备 一.路由器(网络层设备) 1.分割广播域 2.一个接口就是一个广播域 3.一般接口位4,8,12。 4.数据转发 (由路由表转发数据) 5.根据路由表来进行路径选…

MySQL连接查询解析与性能优化成本

文章目录 一、连接查询1.连接查询基础1. INNER JOIN内连接2. LEFT JOIN (或 LEFT OUTER JOIN)左外连接3. RIGHT JOIN (或 RIGHT OUTER JOIN)右外连接4. FULL OUTER JOIN 2.连接查询的两种过滤条件3.连接的原理 二、性能优化成本1.基于成本的优化2.调节成本常数(1)mysql.server_…

【最基础最直观的排序 —— 冒泡排序算法】

最基础最直观的排序 —— 冒泡排序算法 冒泡排序(Bubble Sort)是一种计算机科学领域的较简单的排序算法,属于交换排序。其基本思想是在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数&am…

【C++】继承(上)

个人主页~ 继承 一、继承的概念以及定义1、继承的概念2、继承的定义(1)定义格式(2)继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域 一、继承的概念以及定义 1、继承的概念 继承机制是面向对象程序…

Java集合(Map篇)

一.Map a.使用Map i.键值(key-value)映射表的数据结构,能高效通过key快速查找value(元素)。 ii.Map是一个接口,最常用的实现类是HashMap。 iii.重复放入k-v不会有问题,但是一个…

周邦彦,北宋文坛的独特乐章

周邦彦,字美成,号清真居士,生于北宋仁宗嘉祐元年(公元1056年),卒于北宋徽宗宣和三年(公元1121年),享年65岁。他是宋代“婉约派”词人的代表之一,与柳永、晏几…

java日志框架之Log4j

文章目录 一、Log4j简介二、Log4j组件介绍1、Loggers (日志记录器)2、Appenders(输出控制器)3、Layout(日志格式化器) 三、Log4j快速入门四、Log4j自定义配置文件输出日志1、输出到控制台2、输出到文件3、输出到数据库 五、Log4j自…

comp 9517 Computer Vision week1

本篇博文为课堂笔记,因为英语不好现在不得不课下看录像复习一遍 颜色模型 RGBHSVYCbCrL\*a\*b RGB 有红、绿、蓝三通道 problem:不同通道之间高度相关,包含同种信息 如果想要紧凑的(as compactly as possible)存储图像RGB不合适,…

[DRAM Test]内存测试维修工具大全

目录 1、《HCI MemTest, RunMemtestPro》 2、《MEMTEST64》 3、AIDA64稳定性测试 4、《MEMTEST86》与《MEMTEST86》 5、Windows Memory Diagnostic Tool(微软内存诊断工具) 6、《RAM STRESS TEST》 7、《AMT64和AMT128》 8、《DocMemory》 9、《RAMFIX V110516B》 10…

word如何快速打开文档中的网址超链接?

1、鼠标放在文档中超链接上: 2、然后左手按住【CTRL】键,之后鼠标光标会变成一个手形, 然后右手,点击鼠标左键,即可快速使用电脑当前设置的默认浏览器打开并跳转到网址:

力扣反转链表系列【25. K 个一组翻转链表】——由易到难,一次刷通!!!

力扣《反转链表》系列文章目录 刷题次序,由易到难,一次刷通!!! 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段 题解224. 两两交换链表中的节点两个一组反转链表 题解325. K 个一组翻转…

回溯算法(递归+回退)——1基础理论

文章目录 一、概念二、算法原理三、代码模板四、例题实现1、参数确定2、确定终止条件3、for循环的构建4、AC代码JavaC 5、剪枝优化理论:代码编写方式:JavaC 一、概念 回溯算法(BackTracking)一种通过递归,实现暴力枚举…

Python | Leetcode Python题解之第429题N叉树的层序遍历

题目: 题解: class Solution:def levelOrder(self, root: Node) -> List[List[int]]:if not root:return []ans list()q deque([root])while q:cnt len(q)level list()for _ in range(cnt):cur q.popleft()level.append(cur.val)for child in c…