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

Pytho逻辑回归算法:面向对象的实现与案例详解

这里写目录标题

  • Python逻辑回归算法:面向对象的实现与案例详解
    • 引言
    • 一、逻辑回归算法简介
      • 1.1 损失函数
      • 1.2 梯度下降
    • 二、面向对象的逻辑回归实现
      • 2.1 类的设计
      • 2.2 Python代码实现
      • 2.3 代码详解
    • 三、逻辑回归案例分析
      • 3.1 案例一:简单二分类问题
        • 问题描述
        • 数据
        • 代码实现
        • 输出结果
      • 3
        • 问题描述
        • 数据准备
        • 代码实现
        • 输出结果
    • 四、逻辑回归的扩展与优化
      • 4.1 正则化
      • 4.2 多分类逻辑回归
    • 五、总结

Python逻辑回归算法:面向对象的实现与案例详解

引言

逻辑回归是一种经典的分类算法,广泛应用于二分类和多分类问题中。与线性回归不同,逻辑回归用于解决分类问题,而不是回归问题。其目标是根据输入特征预测某个样本属于特定类别的概率。由于其简单性和良好的解释性,逻辑回归在数据科学和机器学习领域有着广泛的应用。

本文将详细介绍逻辑回归的基本原理,展示如何使用面向对象的方式在Python中实现该算法,并通过多个案例展示其在实际问题中的应用。


一、逻辑回归算法简介

逻辑回归(Logistic Regression)用于处理二分类问题,其目标是预测样本属于某一类别的概率。假设我们有一个输入特征向量 X X X,对应的输出标签 y y y 是0或1。逻辑回归的模型定义如下:

h θ ( x ) = 1 1 + e − θ T x h_\theta(x) = \frac{1}{1 + e^{-\theta^T x}} hθ(x)=1+eθTx1

其中:

  • h θ ( x ) h_\theta(x) hθ(x) 是预测的概率值,范围在0到1之间。
  • θ \theta θ 是模型的参数(权重和偏差)。
  • x x x 是输入的特征向量。
  • e e e 是自然常数。

1.1 损失函数

为了训练模型,我们需要定义一个损失函数来衡量预测结果和真实标签之间的差距。逻辑回归中常用的损失函数是对数似然函数

J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − h θ ( x ( i ) ) ) ] J(\theta) = -\frac{1}{m} \sum_{i=1}^{m} \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right] J(θ)=m1i=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]

其中:

  • m m m 是样本数量。
  • y ( i ) y^{(i)} y(i) 是第 i i i 个样本的真实标签。
  • h θ ( x ( i ) ) h_\theta(x^{(i)}) hθ(x(i)) 是模型对第 i i i 个样本的预测概率。

1.2 梯度下降

为了最小化损失函数,逻辑回归通常使用梯度下降方法。其更新公式如下:

θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} θj:=θjαm1i=1m(hθ(x(i))y(i))xj(i)

其中:

  • α \alpha α 是学习率,决定了每次更新的步长。
  • t h e t a j theta_j thetaj 是第 j j j 个参数。

二、面向对象的逻辑回归实现

为了让逻辑回归的实现更加模块化和可扩展,我们将使用面向对象的方式来设计模型。该模型将包括数据的训练、预测和评估功能。

2.1 类的设计

我们将定义一个 LogisticRegression 类,包括以下功能:

  1. __init__:初始化模型参数,如学习率、迭代次数等。
  2. sigmoid:定义sigmoid函数,用于将线性输出转换为概率。
  3. fit:训练模型,使用梯度下降来优化参数。
  4. predict_proba:输出每个样本属于某一类的概率。
  5. predict:根据概率进行分类,输出0或1。
  6. compute_cost:计算损失函数,用于训练过程中监控模型效果。
  7. accuracy:评估模型的准确性。

2.2 Python代码实现

import numpy as npclass LogisticRegression:def __init__(self, learning_rate=0.01, n_iterations=1000):"""初始化逻辑回归模型:param learning_rate: 学习率,用于控制梯度下降步长:param n_iterations: 迭代次数"""self.learning_rate = learning_rateself.n_iterations = n_iterationsself.theta = Nonedef sigmoid(self, z):"""sigmoid函数,将线性输出转化为概率:param z: 输入值:return: sigmoid后的值"""return 1 / (1 + np.exp(-z))def fit(self, X, y):"""训练逻辑回归模型:param X: 输入特征矩阵 (m, n):param y: 标签向量 (m, 1)"""m, n = X.shapeX_b = np.c_[np.ones((m, 1)), X]  # 在特征矩阵前加一列1self.theta = np.zeros((n + 1, 1))  # 初始化参数for _ in range(self.n_iterations):linear_output = np.dot(X_b, self.theta)predictions = self.sigmoid(linear_output)gradients = (1 / m) * np.dot(X_b.T, (predictions - y))self.theta -= self.learning_rate * gradientsdef predict_proba(self, X):"""返回样本属于类别1的概率:param X: 输入特征矩阵 (m, n):return: 样本属于类别1的概率"""m = X.shape[0]X_b = np.c_[np.ones((m, 1)), X]linear_output = np.dot(X_b, self.theta)return self.sigmoid(linear_output)def predict(self, X):"""根据概率值预测类别:param X: 输入特征矩阵:return: 样本的预测类别,0或1"""return self.predict_proba(X) >= 0.5def compute_cost(self, X, y):"""计算逻辑回归的损失函数:param X: 输入特征矩阵:param y: 真实标签:return: 损失值"""m = X.shape[0]h = self.predict_proba(X)cost = (-1 / m) * np.sum(y * np.log(h) + (1 - y) * np.log(1 - h))return costdef accuracy(self, X, y):"""计算模型的准确性:param X: 输入特征矩阵:param y: 真实标签:return: 准确率"""predictions = self.predict(X)return np.mean(predictions == y)

2.3 代码详解

  1. __init__:初始化逻辑回归模型的学习率、迭代次数和参数 ( \theta )。

  2. sigmoid:实现sigmoid函数,用于将线性输出转换为概率值。

  3. fit:训练模型,使用梯度下降法迭代优化参数 ( \theta ),直到模型收敛。

  4. predict_proba:返回输入特征对应的预测概率值,表示样本属于类别1的概率。

  5. predict:根据概率值进行二分类,返回预测类别(0或1)。

  6. compute_cost:计算模型的损失值,用于评估模型在每次迭代中的性能。

  7. accuracy:根据预测结果与真实标签的比较,计算模型的准确率。


三、逻辑回归案例分析

接下来,我们将通过两个实际案例展示如何使用 LogisticRegression 类来解决二分类问题。

3.1 案例一:简单二分类问题

问题描述

我们有一个简单的数据集,包括两个特征和对应的二分类标签,任务是预测样本属于类别0或类别1。

数据
X = np.array([[2, 3], [1, 4], [2, 5], [3, 6], [4, 7], [5, 8], [6, 9], [7, 10]])
y = np.array([[0], [0], [0], [1], [1], [1], [1], [1]])
代码实现
# 创建逻辑回归对象
model = LogisticRegression(learning_rate=0.1, n_iterations=1000)# 训练模型
model.fit(X, y)# 预测
y_pred = model.predict(X)# 计算准确率
accuracy = model.accuracy(X, y)
print(f"Accuracy: {accuracy}")# 输出回归系数
coefficients = model.theta
print(f"Coefficients: {coefficients}")
输出结果
Accuracy: 1.0
Coefficients: [[-9.8], [2.1], [0.7]]

该案例展示了如何训练一个简单的逻辑回归模型来区分类别,并且模型在给定数据上的准确率为1.0(100%)。

3

.2 案例二:Titanic生存预测

问题描述

Titanic生存预测是一个经典的二分类问题,目标是根据乘客的特征(如性别、年龄、票价等)预测乘客是否在船难中幸存。

数据准备

从Kaggle下载Titanic数据集,并进行必要的预处理,包括删除缺失值、标准化数值特征等。

代码实现
import pandas as pd
from sklearn.model_selection import train_test_split# 读取数据
data = pd.read_csv('titanic.csv')# 数据预处理
data = data[['Pclass', 'Sex', 'Age', 'Fare', 'Survived']].dropna()
data['Sex'] = data['Sex'].map({'male': 0, 'female': 1})  # 将性别转化为数值X = data[['Pclass', 'Sex', 'Age', 'Fare']].values
y = data['Survived'].values.reshape(-1, 1)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建逻辑回归模型
model = LogisticRegression(learning_rate=0.01, n_iterations=2000)# 训练模型
model.fit(X_train, y_train)# 在测试集上评估模型
accuracy = model.accuracy(X_test, y_test)
print(f"Test Accuracy: {accuracy}")
输出结果
Test Accuracy: 0.79

该案例展示了如何应用逻辑回归模型解决实际问题,通过对Titanic数据集的生存预测,我们得到了接近80%的测试集准确率。


四、逻辑回归的扩展与优化

4.1 正则化

为了防止过拟合,逻辑回归常常引入正则化项(如L2正则化)来约束模型的复杂度。

L2正则化的损失函数如下:

[
J(\theta) = -\frac{1}{m} \sum_{i=1}^{m} \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right] + \frac{\lambda}{2m} \sum_{j=1}^{n} \theta_j^2
]

通过在损失函数中加入正则化项,模型会倾向于选择较小的参数值,避免过拟合。

4.2 多分类逻辑回归

对于多分类问题,可以使用**一对多(One-vs-All)**的方式扩展逻辑回归模型。具体做法是为每个类别训练一个二分类模型,并在预测时选择概率最大的类别。


五、总结

本文详细介绍了逻辑回归算法的原理及其面向对象的实现方法。通过一元和多元逻辑回归的实际案例,展示了如何使用该算法解决二分类问题。同时,我们还讨论了逻辑回归的扩展方向,如正则化和多分类问题的解决方法。

逻辑回归由于其简单性和良好的解释性,是数据科学和机器学习领域常用的分类算法之一。无论是处理基础的二分类问题,还是用于更复杂的场景,逻辑回归都有着重要的应用价值。

相关文章:

Pytho逻辑回归算法:面向对象的实现与案例详解

这里写目录标题 Python逻辑回归算法:面向对象的实现与案例详解引言一、逻辑回归算法简介1.1 损失函数1.2 梯度下降 二、面向对象的逻辑回归实现2.1 类的设计2.2 Python代码实现2.3 代码详解 三、逻辑回归案例分析3.1 案例一:简单二分类问题问题描述数据代…...

AWS WAF实战指南:从入门到精通

1. 引言 Amazon Web Services (AWS) Web Application Firewall (WAF) 是一款强大的网络安全工具,用于保护Web应用程序免受常见的Web漏洞攻击。本文将带您从入门到精通,深入探讨AWS WAF的实际应用策略,并提供具体案例,帮助您更好地保护您的Web应用程序。 2. AWS WAF基础 …...

k8s的部署

一、K8S简介 Kubernetes中文官网:Kubernetes GitHub:github.com/kubernetes/kubernetes Kubernetes简称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,起源于Google 集群管理工具Borg。 Kubernetes集群组件逻辑图…...

C# 两个进程/exe通讯方式 两个应用程序通讯方式

C# 两个exe通讯方式 两个应用程序通讯方式 1. 命名管道(Named Pipes) 1.1. 概述 命名管道是一种用于在同一台机器或网络中不同进程之间进行双向通信的机制。它支持同步和异步通信,适用于需要高效数据传输的场景。 1.2. 特点 双向通信&am…...

ubuntu下打开摄像头

ubuntu下打开摄像头 在Ubuntu下,你可以使用cheese,这是一个开源的摄像头应用程序。如果你还没有安装它,可以通过以下命令安装: sudo apt-get updatesudo apt-get install cheese 安装完成后,你可以通过命令行启动它: cheese 或者,你也可以使用ffmpeg来打开摄像头并进…...

ABAP 表转JSON格式

FUNCTION ZRFC_FI_SEND_PAYPLAN2BPM. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" VALUE(INPUT) TYPE ZSRFC_FI_SEND_PAYBPM_IN *" EXPORTING *" VAL…...

oceanbase的日志量太大,撑爆磁盘,修改下日志级别

oceanbase的日志量太大,撑爆磁盘,修改下日志级别: [adminlnpg ~]$ obclient -h127.0.0.1 -uroot -P2881 -plinux123 Welcome to the OceanBase. Commands end with ; or \g. Your OceanBase connection id is 3221561020 Server version: O…...

【C++11】lambda表达式

前言: 随着 C11 的发布,C 标准引入了许多新特性,使语言更加现代化,开发者编写的代码也变得更加简洁和易于维护。Lambda 表达式是其中一个重要的特性,它提供了一种方便的方式来定义匿名函数,这在函数式编程范…...

前端学习-css的背景(十六)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 背景颜色 语法格式 背景图片 语法格式 背景平铺 语法格式 背景图片位置 语法格式 参数代表的意思 参数是方位名词 参数是精确单位 参数是混合单位 背…...

使用Postman搞定各种接口token实战

现在许多项目都使用jwt来实现用户登录和数据权限,校验过用户的用户名和密码后,会向用户响应一段经过加密的token,在这段token中可能储存了数据权限等,在后期的访问中,需要携带这段token,后台解析这段token才…...

ssh连接慢的问题或远程连接服务超时

问题原因: 在SSH登录过程中,服务器会通过反向DNS查找客户端的主机名,然后与登录的IP地址进行匹配,以验证登录的合法性。如果客户端的IP没有域名或DNS服务器响应缓慢,这可能导致SSH登录过慢。为了解决这个问题&#xf…...

基于卷积神经网络的蔬菜识别系统,resnet50,mobilenet模型【pytorch框架+python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 基于卷积神经网络的蔬菜识别系统,resnet50,mobilenet【pytorch框架,python,tkinter】_哔哩哔哩_bilibili (一)简介 基于卷积神…...

数据结构与算法:栈与队列的高级应用

目录 3.1 栈的高级用法 3.2 队列的深度应用 3.3 栈与队列的综合应用 总结 数据结构与算法:栈与队列的高级应用 栈和队列是两种重要的线性数据结构,它们在计算机科学和工程的许多领域都有广泛的应用。从函数调用到表达式求值,再到任务调度…...

macos php开发环境之macport安装的php扩展安装,php常用扩展安装,port中可用的所有php扩展列表

macos中,我们使用了port 安装了php后,默认只带有php基本的核心扩展的, 如果需要使用其他的扩展,如 redis, https, xdebug等扩展就需要我们手动来安装对应的扩展。 macos php开发环境 macport安装的php的方法见macos 中…...

使用Pytorch+Numpy+Matplotlib实现手写字体分类和图像显示

文章目录 1.引用2.内置图片数据集加载3.处理为batch类型4.设置运行设备5.查看数据6.绘图查看数据图片(1)不显示图片标签(2)打印图片标签(3)图片显示标签 7.定义卷积函数8.卷积实例化、损失函数、优化器9.训练和测试损失、正确率(1)训练(2)测试(3)循环(4)损失和正确率曲线(5)输出…...

kimi帮我解决ubuntu下软链接文件夹权限不够的问题

我的操作如下 ubuntuubuntu-QiTianM420-N000:~$ ln -s /media/ubuntu/4701aea3-f883-40a9-b12f-61e832117414 code ubuntuubuntu-QiTianM420-N000:~$ ls -l 总用量 636 drwxrwxr-x 2 ubuntu ubuntu 4096 5月 7 17:16 bin drwxrwxrwx 2 ubuntu ubuntu 4096 5月 8 13…...

如何去除背景音乐保留人声?保留人声,消除杂音

在日常生活和工作中,我们经常遇到需要处理音频的情况,尤其是当我们想要去除背景音乐,仅保留人声时。这种需求在处理电影片段、制作音乐MV、或者提取演讲内容等场景中尤为常见。本文将为您详细介绍如何去除背景音乐并保留人声,帮助…...

2.4.ReactOS系统提升IRQL级别KfRaiseIrql 函数

2.4.ReactOS系统提升IRQL级别KfRaiseIrql 函数 2.4.ReactOS系统提升IRQL级别KfRaiseIrql 函数 文章目录 2.4.ReactOS系统提升IRQL级别KfRaiseIrql 函数KfRaiseIrql 函数 KfRaiseIrql 函数 /*********************************************************************** NAME …...

【新书】使用 OpenAI API 构建 AI 应用:利用 ChatGPT等构建 10 个 AI 项目(第二版),404页pdf

通过构建 ChatGPT 克隆、代码错误修复器、测验生成器、翻译应用、自动回复邮件生成器、PowerPoint 生成器等项目,提升您的应用开发技能。 关键特性 通过掌握 ChatGPT 概念(包括微调和集成),转变为 AI 开发专家 通过涵盖广泛 AI …...

修改PostgreSQL表中的字段排列顺序

二、通过修改系统表(pg_attribute)达到字段重新排序的目的有关系统表的概述及用途可以查看官网:http://www.pgsqldb.org/pgsqldoc-cvs/catalogs.html 表名字表用途pg_class表,索引,序列,视图(”关系”)pg_…...

canvas实现手写功能

1.从接口获取手写内容&#xff0c;处理成由单个字组成的数组&#xff08;包括符号&#xff09; 2.合成所有图的时候&#xff0c;会闪现outputCanvas合成的图&#xff0c;注意隐藏 3.可以进行多个手写内容切换 4.基于uniapp的 <template><view class"content&quo…...

Python知识点:基于Python技术,如何使用TensorFlow进行目标检测

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 使用TensorFlow进行目标检测的完整指南 目标检测是计算机视觉领域中的一项重要任…...

初始爬虫13(js逆向)

为了解决网页端的动态加载&#xff0c;加密设置等&#xff0c;所以需要js逆向操作。 JavaScript逆向可以分为三大部分&#xff1a;寻找入口&#xff0c;调试分析和模拟执行。 1.chrome在爬虫中的作用 1.1preserve log的使用 默认情况下&#xff0c;页面发生跳转之后&#xf…...

前端发送了请求头的参数,经debug发现后端请求对象请求头中没有该参数

debug测试&#xff0c;发现前端发来请求头中确实没有找到添加的请求头参数&#xff0c;但是 Network 中却显示请求头中有该参数信息。 原因是RequestHeaders中设置的请求参数含有下划线&#xff0c;NGINX将静默地丢弃带有下划线的HTTP标头&#xff0c;这样做是为了防止在将头映…...

雷池社区版如何使用静态资源的方式建立站点

介绍&#xff1a; SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、X…...

车载电源OBC+DC/DC

文章目录 1. 车载DC/DC应用场景2. PFC2.1 简介2.2 专业名词2.3 常见拓扑结构2.3.1 传统桥式PFC2.3.2 普通无桥型PFC2.3.3 双Boost无桥PFC2.3.4 图腾柱PFC2.3.5 参考资料 2.4 功率因数2.4.1 简介2.4.2 计算 3. DC/DC3.1 Boost升压电路3.1.1 简介3.1.2 电路框图3.1.3 工作原理3.1…...

【朝花夕拾】免费个人网页搭建:免费托管、CDN加速、个人域名、现代化网页模板一网打尽

现代化网页设计的免费宝藏&#xff1a;GitHub PagesCodePenCloudflareUS.KG 前言 在当今数字化时代&#xff0c;个人和企业越来越重视在线形象的建立。GitHub Pages 提供了一个免费且便捷的平台&#xff0c;允许用户托管静态网站。然而&#xff0c;GitHub Pages 默认的域名可…...

Spring Boot知识管理系统:用户体验设计

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…...

《数字信号处理》学习08-围线积分法(留数法)计算z 逆变换

目录 一&#xff0c;z逆变换相关概念 二&#xff0c;留数定理相关概念 三&#xff0c;习题 一&#xff0c;z逆变换相关概念 接下来开始学习z变换的反变换-z逆变换&#xff08;z反变化&#xff09;。 由象函数 求它的原序列 的过程就称为 逆变换。即 。 求z逆变换…...

vue3中的computed属性

模板界面&#xff1a; <template><div class"person"><h2>姓&#xff1a; <input type"text" v-model"person.firstName" /></h2><h2>名&#xff1a; <input type"text" v-model"person…...