逻辑回归损失函数

news2024/9/20 21:56:39

文章目录

    • 1.基础简析
      • 交叉熵损失函数(Cross-Entropy Loss)
      • 对数似然损失函数(Log-Likelihood Loss)
    • 2.关键步骤
    • 3.案例

1.基础简析

逻辑回归(Logistic Regression)是一种广泛应用于分类问题的统计模型,它使用了一个称为逻辑函数(Sigmoid function)的非线性变换来预测一个事件发生的概率。在逻辑回归中,常用的损失函数是交叉熵损失函数(Cross-Entropy Loss)或者对数似然损失函数(Log-Likelihood Loss)。这两个表述实际上是等价的,只是视角不同。

交叉熵损失函数(Cross-Entropy Loss)

对于二分类问题,假设我们有一个实例 (x_i),其真实标签为 (y_i)((y_i \in {0, 1})),模型预测的概率为 (p_i = \sigma(z_i)),其中 (z_i = w^Tx_i + b) 是线性组合的输出((w) 为权重向量,(b) 为偏置项,(\sigma) 为 sigmoid 函数),交叉熵损失函数定义为:

[L = -\frac{1}{N} \sum_{i=1}^{N} [y_i \log(p_i) + (1-y_i) \log(1-p_i)]]

这里,(N) 是样本数量,(y_i) 是实际标签,(p_i) 是模型预测该样本属于正类的概率。

对数似然损失函数(Log-Likelihood Loss)

从对数似然的角度看,如果我们将每个样本的预测看作是一个伯努利试验,那么整个数据集的似然函数可以写作所有单个样本似然的乘积。最大化似然等同于最小化对数似然的负值,这自然导出了与上面相同的交叉熵表达式。因此,对数似然损失也是:

[L = -\sum_{i=1}^{N} [y_i \log(p_i) + (1-y_i) \log(1-p_i)]]

在实际应用中,为了方便计算,通常会对这个公式进行小的调整,比如添加一个正则化项来防止过拟合,但这不影响其基本形式。

通过优化这个损失函数(通常是使用梯度下降法或其变种),逻辑回归模型能够学习到最佳的参数 (w) 和 (b),从而使得预测概率 (p_i) 尽可能接近真实标签 (y_i),进而提高分类的准确性。

2.关键步骤

在逻辑回归的训练过程中,通过不断迭代调整模型参数(权重 (w) 和偏置 (b)),以减小损失函数 (L) 的值,达到模型优化的目的。这一过程具体包括以下几个关键步骤:

  1. 初始化参数:首先给模型的参数 (w) 和 (b) 设置初始值,这可以是随机值或者是零。

  2. 计算预测概率:对于每个样本 (x_i),计算其属于正类的概率 (p_i = \sigma(z_i)),其中 (z_i = w^T x_i + b),(\sigma) 是sigmoid函数,定义为 (\sigma(z) = \frac{1}{1 + e^{-z}})。

  3. 计算损失:利用上述提到的交叉熵损失函数公式,计算当前参数下整个数据集的损失 (L)。

  4. 梯度计算:接下来,需要计算损失函数关于每个参数的梯度,即损失函数对 (w) 和 (b) 的偏导数。这些梯度指示了参数更新的方向和步长。对于逻辑回归的交叉熵损失,梯度计算可得:

    • 对于权重 (w_j):(\frac{\partial L}{\partial w_j} = \frac{1}{N} \sum_{i=1}^{N}(p_i - y_i)x_{ij})
    • 对于偏置 (b):(\frac{\partial L}{\partial b} = \frac{1}{N} \sum_{i=1}^{N}(p_i - y_i))
  5. 参数更新:根据梯度下降的规则,使用学习率 (\alpha) 来调整参数,使其沿负梯度方向移动,以期望减少损失。更新公式如下:

    • (w_j = w_j - \alpha \frac{\partial L}{\partial w_j})
    • (b = b - \alpha \frac{\partial L}{\partial b})
  6. 迭代:重复步骤2至5,直到满足某个停止条件,比如损失函数的改变小于一个很小的阈值,或者达到预设的最大迭代次数。

  7. 正则化:为了防止过拟合,可以在损失函数中加入正则项(如L1或L2正则化),这会影响梯度计算和参数更新的过程,但基本的迭代优化框架保持不变。

通过这一系列步骤,逻辑回归模型逐渐学习到数据中的模式,并能够在新的数据上做出更准确的分类预测。

3.案例

下面是一个使用Python和scikit-learn库实现逻辑回归的简单代码案例,用于处理二分类问题。假设我们有一组特征数据X和对应的标签数据y

# 导入所需库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import pandas as pd
import numpy as np

# 假设数据已经加载到DataFrame中,X为特征,y为标签
# X = pd.DataFrame(...)  # 特征数据
# y = pd.Series(...)     # 标签数据

# 如果没有现成的数据,我们可以创建一些模拟数据
np.random.seed(0)
X = np.random.rand(100, 2)  # 创建100行2列的随机特征数据
y = (X[:, 0] + X[:, 1] > 1).astype(int)  # 根据特征生成二元分类标签

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化逻辑回归模型
logreg = LogisticRegression(max_iter=10000)  # max_iter设置较高以避免收敛警告

# 训练模型
logreg.fit(X_train, y_train)

# 预测测试集
y_pred = logreg.predict(X_test)

# 计算并打印准确率
print("Accuracy of logistic regression classifier on test set: {:.2f}".format(logreg.score(X_test, y_test)))

# 输出混淆矩阵
confusion_matrix = metrics.confusion_matrix(y_test, y_pred)
print("Confusion Matrix:\n", confusion_matrix)

这段代码首先导入了必要的库,并创建了一组简单的模拟数据来演示逻辑回归模型的训练和测试过程。然后,它将数据划分为训练集和测试集,初始化逻辑回归模型,并用训练数据拟合模型。最后,它对测试集进行预测,并计算模型的准确率及混淆矩阵,以评估模型性能。

请注意,实际应用中,您需要根据自己的数据集调整数据读取和预处理部分的代码。

在上述基础之上,如果我们想进一步优化模型或者进行模型的评估,可以考虑以下几个方面:

  1. 交叉验证:使用交叉验证来更稳健地评估模型性能,而不仅仅依赖于一次分割得到的训练集和测试集。
  2. 超参数调优:通过网格搜索或随机搜索等方法调整逻辑回归模型的超参数,如正则化强度 C,以找到最优参数组合。
  3. 特征选择与工程:基于特征的重要性分析,选择或构建更有预测力的特征。
  4. 模型评估指标:除了准确率之外,还可以考虑查准率(Precision)、查全率(Recall)、F1分数等其他评估指标,特别是对于类别不平衡的数据集。

下面是这些概念如何融入代码的示例:

from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.metrics import classification_report

# 使用交叉验证评估模型
cv_scores = cross_val_score(logreg, X, y, cv=5)  # 5折交叉验证
print("Cross-validation scores: ", cv_scores)
print("Mean cross-validation score: {:.2f}".format(np.mean(cv_scores)))

# 超参数调优
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100]}  # 设置要搜索的参数范围
grid_search = GridSearchCV(logreg, param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 输出最佳参数组合
print("Best parameters found: ", grid_search.best_params_)

# 使用最佳参数重新训练模型
best_logreg = grid_search.best_estimator_
y_pred_best = best_logreg.predict(X_test)

# 打印分类报告
report = classification_report(y_test, y_pred_best)
print("\nClassification Report:\n", report)

这段代码展示了如何使用5折交叉验证评估模型的稳定性和平均性能,以及如何通过GridSearchCV进行超参数调优来找到模型的最佳配置。最后,利用找到的最佳参数重新训练模型,并使用classification_report输出详细的分类评估指标,包括精确度、召回率、F1分数等,这有助于更全面地理解模型在不同类别上的表现。

😍😍 海量H5小游戏、微信小游戏、Web casualgame源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

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

相关文章

选粮必看!安全又美味的主食罐头来啦!江小傲、希喂、迈格仕真实测评

开猫咖3年啦,店里有加菲,美短,布偶,暹罗,都是我一手带大的。店铺开在高校附近,顾客以学生为主,也有很多养猫人士会到店里来,和我交流选粮经验。不少铲屎官都希望选到安全有美味的罐头…

Inconsistent Query Results Based on Output Fields Selection in Milvus Dashboard

题意:在Milvus仪表盘中基于输出字段选择的不一致查询结果 问题背景: Im experiencing an issue with the Milvus dashboard where the search results change based on the selected output fields. Im working on a RAG project using text data conv…

Facebook Dating:社交平台的约会新体验

随着社交媒体的普及和技术的发展,传统的社交方式正在经历革新,尤其是在约会这个领域。Facebook作为全球领先的社交平台,推出了Facebook Dating,旨在为用户提供一个全新的约会体验。本文将探讨Facebook Dating如何重新定义社交平台…

自托管社交媒体管理软件Mixpost

本文软件应网友 ilikeit 的要求而折腾; 什么是 Mixpost ? Mixpost 是一款强大且多功能的社交媒体管理软件,旨在简化社交媒体操作并增强内容营销策略。可以让您轻松地在一个地方创建、安排、发布和管理社交媒体内容,没有任何限制或…

C语言 | Leetcode C语言题解之第242题有效的字母异位词

题目&#xff1a; 题解&#xff1a; bool isAnagram(char* s, char* t) {int len_s strlen(s), len_t strlen(t);if (len_s ! len_t) {return false;}int table[26];memset(table, 0, sizeof(table));for (int i 0; i < len_s; i) {table[s[i] - a];}for (int i 0; i &…

Java开发之Java线程池

#来自ゾフィー&#xff08;佐菲&#xff09; 1 简介 在需要异步或者并发编程中&#xff0c;常常使用线程池&#xff0c;所谓线程池&#xff0c;就是事先创建好一堆线程&#xff0c;装到一个池子里面&#xff0c;需要用到时候取出来&#xff0c;这样带来了以下的好处&#xff1a…

用ComfyUI安装可图Kolors大模型做手机壁纸

一、Kolors简介 国内科技公司快手在人工智能领域取得了显著进展&#xff0c;特别推出了「可图 Kolors」这一开源模型&#xff0c;它在图像生成质量上超越了SD3&#xff0c;与Midjourney v6模型相媲美&#xff0c;并支持中文提示词识别与生成中文字符&#xff0c;成为国产AI绘画…

【STM32】理解时钟树(图示分析)

文章目录 时钟系统什么是时钟时钟树简化图示类比示例时钟树详解时钟源系统时钟配置各总线时钟外设时钟 时钟系统 什么是时钟 时钟在电子和计算机系统中指的是生成周期性信号的电路或设备&#xff0c;这种周期性信号用于同步系统内的各种操作。时钟信号通常是方波&#xff0c;…

YOLO 模型基础入门及官方示例演示

文章目录 Github官网简介模式数据集Python 环境Conda 环境Docker 环境部署 CPU 版本官方 CLI 示例官方 Python 示例 任务目标检测姿势估计图像分类 Ultralytics HUB视频流示例 Github https://github.com/ultralytics/ultralytics 官网 https://docs.ultralytics.com/zhhttp…

图像生成(Text-to-Image)发展脉络

这篇博客对 图像生成&#xff08;image generation&#xff09; 领域的经典工作发展进行了梳理&#xff0c;包括重要的一些改进&#xff0c;目的是帮助读者对此领域有一个整体的发展方向把握&#xff0c;并非是对每个工作的详细介绍。 脉络发展&#xff08;时间顺序&#xff0…

13.5.【C语言】二维数组

接第13篇&#xff08;http://t.csdnimg.cn/TioJH&#xff09; 把一维数组做为数组的元素&#xff0c;这时候就是二维数组&#xff0c;二维数组作为数组元素的数组被称为三维数组&#xff0c;二维数组以上的数组统称为多维数组。 01.创建 格式&#xff1a; 数据类型 数组名[…

GESP CCF 图形化编程四级认证真题 2024年6月

一、单选题&#xff08;共 10 题&#xff0c;每题 2 分&#xff0c;共 30 分&#xff09; 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 C B C D C D A B D C C D A A B 1、小…

Java语言程序设计基础篇_编程练习题**15.12(几何问题:是否在圆内)

**15.12(几何问题:是否在圆内) 请编写一个程序&#xff0c;绘制一个圆心在(100, 60)而半径为50的固定的圆。当鼠标移动时&#xff0c;显示一条消息表示鼠标点是在圆内还是在圆外&#xff0c;如图15-27a所示 答题思路&#xff1a; 新建一个面板Pane(),一个Circle(100&#xff…

七天打造一套量化交易系统:Day1-数据分类、获取、清洗与存储

七天打造一套量化交易系统&#xff1a;Day1-数据分类、获取、清洗与存储 数据是量化交易的基础&#xff0c;重要性不言而喻。无论是股票、期货、期权、基金、ETF等等&#xff0c;甚至包括比特币&#xff0c;这些投资标的历史行情数据都可以用作回测分析&#xff0c;本篇将分享…

Python测试服务器连接的实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

2024最佳游戏引擎排行

游戏产业几十年来一直是一个大生意&#xff0c;而且发展势头迅猛。据估计&#xff0c;全球游戏市场在 2025 年每年将达到 5031.4 亿美元&#xff0c;2023 年为 3960 亿美元。 尽管如今有市面上有各种各样的解决方案&#xff0c;但游戏开发人员和管理者在选择适合他们需求的游戏…

【基于netty+zookeeper的rpc远程调用框架】首篇——缘起

&#x1f43c;作者简介&#xff1a;一名大三在校生&#x1f38b; 空有想法&#xff0c;没有实践 文章目录 第一章 概述缘起一、为什么要手写一个rpc项目二、什么是rpc三、rpc怎么使用四、rpc的通信流程 欢迎添加微信&#xff0c;加入我的核心小队&#xff0c;请备注来意 第一章…

NCRE1-2 管理和运营宽带城域网的关键技术

是记录&#xff0c;会有错误 网络管理 这个喜欢考选择题 带内网络管理 用传统的电信网络通过 D C N ( D a t a C o m m u n i c a t i o n N e t w o r k ) DCN(Data\ Communication\ Network) DCN(Data Communication Network)或 P S I N ( P u b l i c S w i t c h T e l …

Java特性与快速入门(JDK,JRE,JVM与hello world)

目录 1.Java重要特点 2.Java运行机制及运行过程 跨平台性 3.什么是JDK,JRE 4.JDK,JRE和JVM的包含关系 5.Java快速入门 输出 hello world&#xff01; 代码示例&#xff1a; 原理讲解&#xff1a; 练习 代码示例&#xff1a; 1.Java重要特点 2.Java运行机制及运行…

自定义Bean转换工具类

BeanConvertor工具类&#xff1a;简化Java对象转换的利器 在Java开发中,我们经常需要在不同的对象之间转换数据。这可能是因为我们需要将数据从一个层(如数据访问层)转移到另一个层(如服务层或表示层),或者是因为我们需要将外部API的数据结构转换为我们的内部数据结构。这种转…