使用 Python 的多项 Logistic 回归问题

news2024/11/27 13:29:04

一、说明

        多项逻辑回归是一种统计方法,用于预测两个以上类别的分类结果。当因变量是分类变量而不是连续变量时,它特别有用。

二、分类预测

        在多项式逻辑回归中,模型预测属于因变量每个类别的观测值的概率。这些概率可以解释为观察结果属于每个类别的可能性。预测的类别通常是概率最高的类别,使其成为分类预测而不是连续预测。

        相反,当因变量仅具有两个类别时,使用标准逻辑回归,也称为二元逻辑回归(二项式逻辑回归的一种特殊情况) 。它预测观察结果属于一个类别与另一个类别的概率。二元逻辑回归中的预测是0和之间的连续概率1

三、下层原理

        以下是多项逻辑回归背后的数学原理。这些方程表示一组对数线性模型,其中每个类别的概率之比的对数通过系数(或斜率)参数与预测变量$X_i$ 线性相关,用 $\beta_1$ 、\beta_2,,, \beta_{K-1}表示。符号$\text{P}(Y_i = K)$  表示观测值 $i$ 属于$K$类的概率,其中$K$ 是每个类的整数表示,从 1 开始。

        从这些方程中,我们可以简化为下面的方程,它们是我们之前看到的方程的替代形式。它们源自以下事实:所有K个类别的概率之和必须为 1。在这些方程中,分子用作参考类别,其他K – 1 个类别的概率使用指数相对于该参考类别来表示预测变量Xi和相应系数βk的函数。

        这些方程中的指数函数 $e$ 用于将线性预测变量(即βk • Xi)转换为概率,该概率始终为正且介于 0 和 1 之间。通过将指数函数e应用于先前的两侧方程,我们得到第一类的以下方程:

        这些方程通常用于多项逻辑回归,其目标是基于一个或多个预测变量来预测属于K个类别中每一类的观测值的概率。

四、关于数据

        在此示例中,我们将使用加州大学欧文分校的鲍鱼数据集来预测鲍鱼的性别。多元线性回归模型可用于预测年龄,但在本例中,我们根据几个不同的特征来预测给定鲍鱼的性别。

        使用Python pandas包,我们可以看到数据的形状,以及前几行。

import pandas as pd df = pd.read_csv("https://raw.githubusercontent.com/s-lasch/CIS-280/main/abalone.csv") # read csv df.shape # get shape
(4177, 9)
df.head() # show first 5 rows
| sex | length | diameter | height | whole_weight | shucked_weight | viscera_weight | shell_weight | rings | 
------------------------------------------------------------------------------------------------------------ 
| M   | 0.455  | 0.365    | 0.095  | 0.5140       | 0.2245         | 0.1010         |0.150         | 15    |
| M   | 0.350  | 0.265    | 0.090  | 0.2255       | 0.0995         | 0.0485         | 0.070        | 7     |
| F   | 0.530  | 0.420    | 0.135  | 0.6770       | 0.2565         | 0.1415         | 0.210        | 9     |
| M   | 0.440  | 0.365    | 0.125  | 0.5160       | 0.2155         | 0.1140         | 0.155        | 10    |
| I   | 0.330  | 0.255    | 0.080  | 0.2050       | 0.0895         | 0.0395         | 0.055        | 7     |

五、处理数据

        我们可以看到该列中有三个不同的类别sex:M、F 和 I,分别代表男性、女性和婴儿。这些代表我们的模型将根据数据集中的其他列预测的类。

df['sex'].value_counts().sort_values(ascending=False) # count the number of distinct classes
M    1528
I    1342
F    1307
Name: sex, dtype: int64

        这意味着我们的y数据将是sex列,而我们的X数据将是除 之外的所有列sex

X = df.drop(['sex'], axis=1) 
y = df['sex']

现在我们准备将数据分为训练和测试。我们可以使用scikitlearn如下所示的包来做到这一点:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 5)

print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
(3341, 8)
(836, 8)
(3341,)
(836,)

六、一次性编码

        现在我们有了训练和测试数据,重要的是要记住任何回归模型都需要整数或浮点输入。由于该sex列是分类列,因此我们需要应用整数编码才能将它们用于回归。为此,我们将应用one-hot 编码,它将为每个不同的类分配一个整数。

y_train = y_train.apply(lambda x: 0 if x == "M" else 1 if x == "F" else 2)
y_test = y_test.apply(lambda x: 0 if x == "M" else 1 if x == "F" else 2)

        现在y数据已编码,我们必须将每个训练/测试数据集转换为torch.tensor. 这对于使用 Pytorch 的任何回归至关重要,因为它只能采用张量。

X_train_tensor = torch.tensor(X_train.to_numpy()).float()
X_test_tensor = torch.tensor(X_test.to_numpy()).float()
y_train_tensor = torch.tensor(y_train.to_numpy()).long()
y_test_tensor = torch.tensor(y_test.to_numpy()).long()

有关张量的更多信息,可以在这里找到真正深入的资源。史蒂文·拉什

七、该模型

        数据处理完成后,我们现在可以开始创建模型的过程。为了实现这个模型,我们将使用 Pytorch 库。由于有 8 个特征用于确定性别,因此我们需要将 设为in_features8。由于模型只能预测三种可能的类别,因此out_features将设为 3。有关 Pytorchtorch.nn模块的更多信息,请参阅文档。

import torch
import torch.nn as nn
from torch.nn import Linear
import torch.nn.functional as F


torch.manual_seed(348965)                                 # keep random values consistent

model = Linear(in_features=8, out_features=3)             # define the model

# define the loss function and optimizer
criterion = nn.CrossEntropyLoss()                         # use cross-entropy loss for multi-class classification
optimizer = torch.optim.SGD(model.parameters(), lr=.01)   # learning rate of 0.01, and Stocastic Gradient descent optimizer

八、训练模型

num_epochs = 2500    # loop iterations

for epoch in range(num_epochs):
    # forward pass
    outputs = model(X_train_tensor)
    loss = criterion(outputs, y_train_tensor)

    # backward and optimize
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    # print progress every 100 epochs
    if (epoch+1) % 100 == 0:
        print('Epoch [{}/{}]\tLoss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
Epoch [100/2500]     Loss: 1.1178
Epoch [200/2500]     Loss: 1.1006
Epoch [300/2500]     Loss: 1.0850
Epoch [400/2500]     Loss: 1.0708
Epoch [500/2500]     Loss: 1.0579
Epoch [600/2500]     Loss: 1.0460
Epoch [700/2500]     Loss: 1.0352
Epoch [800/2500]     Loss: 1.0252
Epoch [900/2500]     Loss: 1.0161
Epoch [1000/2500]    Loss: 1.0077
Epoch [1100/2500]    Loss: 0.9999
Epoch [1200/2500]    Loss: 0.9927
Epoch [1300/2500]    Loss: 0.9860
Epoch [1400/2500]    Loss: 0.9799
Epoch [1500/2500]    Loss: 0.9741
Epoch [1600/2500]    Loss: 0.9688
Epoch [1700/2500]    Loss: 0.9638
Epoch [1800/2500]    Loss: 0.9592
Epoch [1900/2500]    Loss: 0.9549
Epoch [2000/2500]    Loss: 0.9509
Epoch [2100/2500]    Loss: 0.9471
Epoch [2200/2500]    Loss: 0.9435
Epoch [2300/2500]    Loss: 0.9402
Epoch [2400/2500]    Loss: 0.9371
Epoch [2500/2500]    Loss: 0.9342

九、验证

现在要检查准确性,我们可以运行以下代码:

outputs = model(X_test_tensor)
_, preds = torch.max(outputs, dim=1)
accuracy = torch.mean((preds == y_test_tensor).float())
print('\nAccuracy: {:.2f}%'.format(accuracy.item()*100))
Accuracy: 52.63%

这意味着我们的模型在几乎 53% 的时间内根据 8 个不同特征准确识别了鲍鱼的性别,这不是很好。

十、完整代码

        这是完整的代码:

import torch
import torch.nn as nn
from torch.nn import Linear
import torch.nn.functional as F


torch.manual_seed(348965)                                 # keep random values consistent

model = Linear(in_features=8, out_features=3)             # define the model

# define the loss function and optimizer
criterion = nn.CrossEntropyLoss()                         # use cross-entropy loss for multi-class classification
optimizer = torch.optim.SGD(model.parameters(), lr=.01)   # learning rate of 0.01, and Stocastic Gradient descent optimizer

# convert the data to PyTorch tensors
X_train_tensor = torch.tensor(X_train.to_numpy()).float()
X_test_tensor = torch.tensor(X_test.to_numpy()).float()
y_train_tensor = torch.tensor(y_train.to_numpy()).long()
y_test_tensor = torch.tensor(y_test.to_numpy()).long()

# train the model
num_epochs = 2500    # loop iterations

for epoch in range(num_epochs):
    # forward pass
    outputs = model(X_train_tensor)
    loss = criterion(outputs, y_train_tensor)

    # backward and optimize
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    # print progress every 100 epochs
    if (epoch+1) % 100 == 0:
        print('Epoch [{}/{}]\tLoss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))


outputs = model(X_test_tensor)
_, preds = torch.max(outputs, dim=1)
accuracy = torch.mean((preds == y_test_tensor).float())
print('\nAccuracy: {:.2f}%'.format(accuracy.item()*100))
Epoch [100/2500]    Loss: 1.1178
Epoch [200/2500]    Loss: 1.1006
Epoch [300/2500]    Loss: 1.0850
Epoch [400/2500]    Loss: 1.0708
Epoch [500/2500]    Loss: 1.0579
Epoch [600/2500]    Loss: 1.0460
Epoch [700/2500]    Loss: 1.0352
Epoch [800/2500]    Loss: 1.0252
Epoch [900/2500]    Loss: 1.0161
Epoch [1000/2500]    Loss: 1.0077
Epoch [1100/2500]    Loss: 0.9999
Epoch [1200/2500]    Loss: 0.9927
Epoch [1300/2500]    Loss: 0.9860
Epoch [1400/2500]    Loss: 0.9799
Epoch [1500/2500]    Loss: 0.9741
Epoch [1600/2500]    Loss: 0.9688
Epoch [1700/2500]    Loss: 0.9638
Epoch [1800/2500]    Loss: 0.9592
Epoch [1900/2500]    Loss: 0.9549
Epoch [2000/2500]    Loss: 0.9509
Epoch [2100/2500]    Loss: 0.9471
Epoch [2200/2500]    Loss: 0.9435
Epoch [2300/2500]    Loss: 0.9402
Epoch [2400/2500]    Loss: 0.9371
Epoch [2500/2500]    Loss: 0.9342

最初于 2023 年 5 月 1 日发布于https://s-lasch.github.io。

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

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

相关文章

聊聊并发编程——原子操作类和Fork/Join框架

目录 原子操作类 实现原子性原理 保证原子性的方法 Fork/Join框架 分而治之 工作窃取算法 Fork/Join框架的设计 示例 原子操作类 线程A和线程B同时更新变量i进行操作i1,最后的结果可能i不等于3而是等于2。这是线程不安全的更新操作,一般我们会使用Synchron…

CCF CSP认证 历年题目自练Day18

CCF CSP认证 历年题目自练Day18 题目一 试题编号: 201809-1 试题名称: 卖菜 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这…

如何保持终身学习

文章目录 2.1. 了解你的大脑2.2 学习是对神经元网络的塑造2.3 大脑的一生 3.学习的心里基础3.1 固定思维与成长思维3.2 我们为什么要学习 4. 学习路径4.1 构建知识模块4.2 大脑是如何使用注意力的4.3 提高专注力4.4 放松一下,学的更好4.5 巩固你的学习痕迹4.6 被动学…

amazon自养号测评:为卖家提供稳定转化率的解决方案

亚马逊作为全球最大的跨境电商平台之一,吸引了大量卖家进入市场。然而,如何提高产品的转化率,吸引更多买家并促使他们下单,对卖家来说仍然是一个关键问题。本文将分享一些亚马逊卖家可以采用的小技巧,帮助他们实现这一…

Nginx之动静分离解读

目录 基本概念 基本入门 location匹配顺序 补充:URLRewrite 基本概念 动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作&#x…

2023八股每日一题(九月份)

9月13日 Q:JDK、JRE、JVM之间的区别 A: JDK(Java SE Development Kit),Java标准开发包,它提供了编译、运⾏Java程序所需的各种⼯具和资源,包括Java编译器、Java运⾏时环境,以及常⽤的Java类库等JRE( Java…

jQuery入门学习

jQuery框架 jQuery是一个快速的、简洁的JavaScript框架(库),它会封装很多JavaScript中常用的功能代码,提供了一个简洁的JS设计模式 优化HTML文档操作(优化DOM操作)事件处理动画设计Ajax 要使用JQ我们需要…

MySQL进阶_3.性能分析工具的使用

文章目录 第一节、数据库服务器的优化步骤第二节、查看系统性能参数第三节、 慢查询日志第四节、 查看 SQL 执行成本第五节、 分析查询语句:EXPLAIN 第一节、数据库服务器的优化步骤 当我们遇到数据库调优问题的时候,可以按照以下流程进行分析。整个流程…

【Java每日一题】— —第十八题:求二维数组中的元素最小值及其索引。(2023.10.02)

🕸️Hollow,各位小伙伴,今天我们要做的是第十八题。 🎯问题: 求二维数组中的元素最小值及其索引。 测试结果如下: 🎯 答案: int [][]anew int[3][];a[0]new int [3];a[1]new int[5…

【Leetcode】 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "23" 输出&…

如何在 Wio Terminal 上运行 RT-Thread 操作系统

Wio Terminal 是 Seeed Studio 设计的一款开发套件。它基于 SAMD51 的微控制器,运行速度为 120MHz(最高可达 200MHz),拥有 4MB 外部闪存和 192KB RAM,具有 Realtek RTL8720DN 支持的无线连接,同时支持蓝牙和…

京东数据报告:2023年8月京东手机行业品牌销售排行榜

鲸参谋监测的京东平台8月份手机市场销售数据已出炉! 根据鲸参谋电商数据分析平台的数据显示,8月份,京东平台手机的销售量为380万,环比下滑约7%。同比下滑约17%;销售总额为120亿,环比下滑约17%,…

开启赏车新体验 远航汽车即将亮相2023中国(天津)国际汽车展览会

2023年9月28日至10月4日,2023中国(天津)国际汽车展览会将在国家会展中心(天津)举行。本次车展预计展出总面积20万平方米,是本年度北方地区规模最大、品牌最齐全的国际顶级车展。远航汽车将携旗下多款车型亮…

c#设计模式-结构型模式 之 装饰者模式

🚀介绍 在装饰者模式中,装饰者类通常对原始类的功能进行增强或减弱。这种模式是在不必改变原始类的情况下,动态地扩展一个对象的功能。这种类型的设计模式属于结构型模式,因为这种模式涉及到两个类型之间的关系,这两个…

Java编程技巧:分类

1、表结构 字段名称字段类型字段解释idvarchar主键idnamevarchar分类名称sequenceint同级排序parentvarchar父级分类id,一级分类的父级分类id为0pathvarchar分类id路径,中间用英文逗号,分隔,方便使用find_in_set函数搜索namePathvarchar分类…

90、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->Hash 相关命令

本次讲解要点: Hash 相关命令:是指value中的数据类型 启动redis服务器: 打开小黑窗: C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe red…

Linux系统下C语言实现百度网盘(附实现步骤,和全部代码讲解)

Linux系统下C语言实现百度网盘 Linux操作系统下用C语言写一个网盘完整代码:服务器客户端 Linux操作系统下用C语言写一个网盘 本次实验完成了完整的网盘功能(查询文件,下载文件,上传文件,刷新界面,和退出系…

服务器流量只有1tb,害怕被刷怎办,这篇文章教你防止对方刷流量!

本篇文章主要讲解,服务器流量监控和关闭网络请求的方法教程,在某种情况下可以有效杜绝被刷流量的困扰。 日期:2023年10月2日 作者:任聪聪 根本有效避免刷流的前置办法 说明:只选择固定带宽,不限流量的服务器…

【Linux进行时】进程地址空间

进程地址空间 例子引入&#xff1a; 我们在讲C语言的时候&#xff0c;老师给大家画过这样的空间布局图&#xff0c;但是我们对它不了解 我们写一个代码来验证Linux进程地址空间 #include<stdio.h> #include<assert.h> #include<unistd.h> int g_value100; …

【吞噬星空】连播两集,尼赫鲁对徐欣动手,罗峰修分身强势复仇

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析吞噬星空资讯。 吞噬星空动画第四季定档之后&#xff0c;官方真的是太宠粉了&#xff0c;每天都会公布全新预告情报&#xff0c;无论是外星人物角色&#xff0c;亦或者宇宙星球建模&#xff0c;那都是相当的炸裂。如今更…