【逻辑回归实现多分类】

逻辑回归实现多分类原理

  • 一、逻辑回归是什么?
    • 1. Sigmoid函数
  • 二、如何扩展到多分类
    • 1. 一对多(OvR)
      • 实现细节
    • 2. 一对一(OvO)
    • 3. 多对多(MvM)
      • 实现细节
  • 三、sklearn库实现
    • 1. 引入库
    • 2. 加载并准备数据
    • 3. 使用OvR方法训练模型
    • 4. 使用OvO方法训练模型
    • 5. 使用MvM方法训练模型


一、逻辑回归是什么?

逻辑回归是一种预测分析算法,其基于概率理论。对于二分类问题,逻辑回归模型会预测一个事件发生的概率。这是通过使用逻辑函数(也称为Sigmoid函数)实现的,该函数将任意实数映射到0到1的区间内,表示概率。

1. Sigmoid函数

Sigmoid函数公式如下:

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

其中,z 是输入特征和权重的线性组合。

二、如何扩展到多分类

逻辑回归可以通过多种方法扩展到多分类问题,包括“一对多”(One-vs-Rest, OvR)、“一对一”(One-vs-One, OvO)以及“多对多”(Multinomial or Softmax,简称MvM)方法。

1. 一对多(OvR)

在OvR方法中,对于有N个类别的分类问题,我们训练N个不同的二分类逻辑回归模型。每个模型负责将其中一个类别与其它所有类别区分开。这种方法的主要优点是模型数量相对较少,每个模型的训练和预测速度都较快。

实现细节

在OvR方法中,为每个类别创建一个模型。例如,如果有三个类别A、B和C,会训练三个模型:

  • 模型1: A与非A(即B和C)
  • 模型2: B与非B(即A和C)
  • 模型3: C与非C(即A和B)

2. 一对一(OvO)

OvO方法则是在每对类别之间训练一个二分类模型。对于N个类别,这需要训练 ( N \times (N-1) / 2 ) 个模型。每个模型都是一个独立的逻辑回归分类器,专注于区分两个特定的类别。

3. 多对多(MvM)

多对多方法,也称为Softmax回归或多项式逻辑回归,是逻辑回归的直接扩展,用于处理多类分类问题。与OvR和OvO不同,它不是通过组合多个二分类器来实现的,而是直接对多个类别进行建模。

实现细节

在MvM方法中,模型试图学习每个类别相对于其他类别的概率。通过使用Softmax函数实现,它是Sigmoid函数的一种推广,用于多类别。Softmax函数将一个含多个值的向量映射为一个概率分布。

Softmax函数的公式如下:

S o f t m a x ( z ) i = e z i ∑ j = 1 K e z j \mathrm{Softmax}(z)_i=\frac{e^{z_i}}{\sum_{j=1}^Ke^{z_j}} Softmax(z)i=j=1Kezjezi

其中, z z z是输入特征与权重的线性组合, K K K 是类别的总数, z i z_i zi是第 i i i个类别的分数。

在训练过程中,模型学习区分各个类别的特征。在预测时,给定一个输入样本,模型会计算每个类别的分数,然后应用Softmax函数来估计属于每个类别的概率,最终选择概率最高的类别。

根据具体的问题和数据集,可以选择适合的方法来将逻辑回归应用于多分类问题。OvR适用于类别数量较少且数据平衡的情况,OvO适用于类别较多的复杂问题,而MvM提供了一种直接对多个类别进行建模的方法,尤其适用于类别之间存在内在顺序或关联的情况。

三、sklearn库实现

使用Python的scikit-learn库实现逻辑回归的多分类。

1. 引入库

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
from sklearn.datasets import load_iris
from sklearn.multiclass import OneVsOneClassifier

2. 加载并准备数据

使用scikit-learn中的鸢尾花数据集作为示例。数据集包含三种鸢尾花的特征数据,总共150个样本。

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target# 分割数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

3. 使用OvR方法训练模型

# 使用OvR方法训练模型
model_ovr = LogisticRegression(multi_class='ovr', max_iter=200)
model_ovr.fit(X_train, y_train)# 预测
y_pred_ovr = model_ovr.predict(X_test)# 评估模型
print("OvR方法")
print(f"准确率: {accuracy_score(y_test, y_pred_ovr)}")
print("分类报告:")
print(classification_report(y_test, y_pred_ovr))OvR方法
准确率: 0.9666666666666667
分类报告:precision    recall  f1-score   support0       1.00      1.00      1.00        101       1.00      0.89      0.94         92       0.92      1.00      0.96        11accuracy                           0.97        30macro avg       0.97      0.96      0.97        30
weighted avg       0.97      0.97      0.97        30

4. 使用OvO方法训练模型

# 使用OvO方法训练模型
model_ovo = OneVsOneClassifier(LogisticRegression(max_iter=200))
model_ovo.fit(X_train, y_train)# 预测
y_pred_ovo = model_ovo.predict(X_test)# 评估模型
print("OvO方法")
print(f"准确率: {accuracy_score(y_test, y_pred_ovo)}")
print("分类报告:")
print(classification_report(y_test, y_pred_ovo))OvO方法
准确率: 1.0
分类报告:precision    recall  f1-score   support0       1.00      1.00      1.00        101       1.00      1.00      1.00         92       1.00      1.00      1.00        11accuracy                           1.00        30macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30

5. 使用MvM方法训练模型

model_mvm = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=200)
model_mvm.fit(X_train, y_train)# 预测
y_pred_mvm = model_mvm.predict(X_test)# 评估模型
print("MvM方法")
print(f"准确率: {accuracy_score(y_test, y_pred_mvm)}")
print("分类报告:")
print(classification_report(y_test, y_pred_mvm))MvM方法
准确率: 1.0
分类报告:precision    recall  f1-score   support0       1.00      1.00      1.00        101       1.00      1.00      1.00         92       1.00      1.00      1.00        11accuracy                           1.00        30macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30

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

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

相关文章

ONLYOFFICE 8.1 版本桌面编辑器测评

在现代办公环境中,办公软件的重要性不言而喻。从文档处理到电子表格分析,再到演示文稿制作,强大且高效的办公软件工具能够极大提升工作效率。ONLYOFFICE 作为一个功能全面且开源的办公软件套件,一直以来都受到广大用户的关注与喜爱…

OpenAI推出自我改进AI- CriticGPT

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

rust 如何debug

rust如何debug 如果创建的是一个二进制文件,并不是一个可执行文件 比如使用napi-rs/cli 创建出来的一个xxxx.node文件 我们想在vscode 中调试 1.1 创建launch.json {"version": "0.2.0","configurations": [{"type": &qu…

Android C++系列:认识JNI

1. 什么是JNI JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 JNI不仅仅是Android特有的,它是属于Java平台的,它允许在Java虚拟机内运行的java代码与其他编程语言(如c, c++和汇编语言)编写的程序和库进行交互。…

如何进行黄金期货日内波段交易-EE trade

日内波段交易是一种在单个交易日内抓取较大波段趋势的方法,旨在利用市场的短期波动获取利润。黄金期货市场由于其高波动性和高杠杆性,成为日内波段交易的理想选择。以下是黄金期货日内波段交易的详细策略和方法。 一、日内波段交易整体设计思想 1. 顺应…

【鸿蒙学习笔记】逻辑控制语句

官方文档:ArkTS语言介绍 目录标题 逻辑If语句Switch语句条件表达式 循环For语句For-of语句While语句Do-while语句Break语句Continue语句 异常Throw和Try语句 逻辑 If语句 if (condition1) {// 语句1 } else if (condition2) {// 语句2 } else {// else语句 }Switc…

【Linux】生物信息学常用基本命令

wget网址用于直接从网上下载某个文件到服务器,当然也可以直接从网上先把东西下到本地然后用filezilla这个软件来传输到服务器上。 当遇到不会的命令时候,可以使用man “不会的命令”来查看这个命令的详细信息。比如我想要看看ls这个命令的详细用法&…

独立开发者系列(12)——下单与支付

做业务有个绕不开的业务逻辑,就是支付。这里总结一个基础的支付电商逻辑闭环流程,完成支付基础体系的实现。这里假定我们要实现的是一个独立的电商平台上允许用户在平台充值,其他的类似多多购物或者淘宝购物的流程逻辑。 数据表结构的逻辑设…

使用uniapp编写微信小程序

使用uniapp编写微信小程序 文章目录 使用uniapp编写微信小程序前言一、项目搭建1.1 创建项目方式1.1.1 HBuilderX工具创建1.1.2 命令行下载1.1.3 直接Gitee下载 1.2 项目文件解构1.2.1 安装依赖1.2.2 项目启动1.2.3 文件结构释义 1.2 引入uni-ui介绍 二、拓展2.1 uni-app使用uc…

简单的身份切换和执行工具su-exec —— 筑梦之路

简介 su-exec是一个理想的用于身份切换和权限控制的工具,尤其适合对性能和空间有要求的环境。无论是开发人员还是系统管理员,都值得将它纳入工具箱,以提高工作效率和系统的安全性 官方网站:GitHub - ncopa/su-exec: switch user …

【高考】人生规划指南

作为一个正处在这个选择的十字路口的高考考生,我认为在选择专业和学校时,要根据自己的具体情况和个人目标来权衡。首先,我认为专业是首要考虑因素。因为专业是直接决定未来职业发展方向的,如果不喜欢或者不适合的专业选择&#xf…

数字时代的文化革命:Facebook的社会影响

随着数字技术的飞速发展和互联网的普及,社交网络如今已成为人们日常生活中不可或缺的一部分。在众多社交平台中,Facebook作为最大的社交网络之一,不仅连接了全球数十亿用户,更深刻影响了人们的社会互动方式、文化认同和信息传播模…

前端面试题(基础篇十二)

一、link标签定义、与import的区别 link 标签定义文档与外部资源的关系。 link 元素是空元素,它仅包含属性。 此元素只能存在于 head 部分,不过它可出现任意数。 link 标签中的 rel 属性定义了当前文档与被链接文档之间的关系。常见的 stylesheet 指的是…

双系统的笔记本电脑,系统引导不见了怎么办

双系统的笔记本电脑,系统引导不见了怎么办 个人情况 联想拯救者R9000P 按照了windows11(电脑自带的系统),后面自己按照了ubuntu22.04 只是windows11自动更新导致系统的引导项不见的 解决办法 在电脑开机的时候,不停…

Python酷库之旅-第三方库openpyxl(15)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…

回溯法c++学习 解决八皇后问题

使用回溯法解决八皇后问题 八皇后问题是一个以国际象棋为背景的问题:如何能够在88 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。这…

AUTOSAR汽车电子嵌入式编程精讲300篇-智能网联汽车CAN总线-发展现状

目录 前言 智能网联汽车的发展现状 国内外研究现状 智能网联汽车系统概述 智能网联汽车安全现状 智能网联汽车威胁分析 本文篇幅较长,分为多篇,文章索引详见 智能网联汽车CAN总线-发展现状 智能网联汽车CAN总线-智能网联汽车车内网络 智能网联汽车CAN总线-基于CAN…

pdf已加密如何解除?解密密码的两个方法【可加密】

电脑文件加密的目的就是保护重要信息,防止数据泄露。如果需要解除密码,应该如何操作呢?pdf已加密如何解除?本文整理了以下两种解除文件方法,希望能够帮到有需要的朋友们! 方法一、使用金舟文件夹加密大师解…

vue3+vite+nodejs,通过接口的形式请求后端打包(可打包全部或指定打包组件)

项目地址https://gitee.com/sybb011016/test_build 打包通过按钮的形式请求接口,让后端进行打包,后端使用express-generator搭建模版。前端项目就在npm init vuelatest基础上添加了路由 如果只想打包AboutView组件,首先修改后端接口。 //打…

Open3D (C++) 点云旋转至主成分空间

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 首先使用主成分分析法计算出点云的特征值与特征向量,然后根据点云的特征向量计算出点云与主成分空间之间的…