自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

ops/2025/2/6 9:42:46/

自定义数据集:继承  torch.utils.data.Dataset  类创建自定义数据集,并重写  __len__  和  __getitem__  方法。

 

定义逻辑回归模型:继承  nn.Module  类,定义一个线性层,并在  forward  方法中应用sigmoid激活函数。

 

训练模型:使用二元交叉熵损失函数  BCELoss  和随机梯度下降优化器  SGD  进行训练。

 

保存模型:使用  torch.save  保存模型的参数。

 

加载模型并预测:加载保存的模型参数,设置模型为评估模式,对新数据进行预测。

 

计算评估指标:使用  sklearn.metrics  中的函数计算精确度、召回率及F1分数

import torch

import torch.nn as nn

import torch.optim as optim

from torch.utils.data import Dataset, DataLoader

from sklearn.metrics import precision_score, recall_score, f1_score

 

 

# 自定义数据集

class MyDataset(Dataset):

    def __init__(self, data, labels):

        self.data = torch.FloatTensor(data)

        self.labels = torch.FloatTensor(labels)

 

    def __len__(self):

        return len(self.data)

 

    def __getitem__(self, idx):

        return self.data[idx], self.labels[idx]

 

 

# 生成一些自定义数据

np.random.seed(0)

data = np.random.randn(100, 10)

labels = np.random.randint(0, 2, size=(100, 1))

 

# 创建数据集和数据加载器

dataset = MyDataset(data, labels)

dataloader = DataLoader(dataset, batch_size=10, shuffle=True)

 

 

# 定义逻辑回归模型

class LogisticRegression(nn.Module):

    def __init__(self, input_dim):

        super(LogisticRegression, self).__init__()

        self.linear = nn.Linear(input_dim, 1)

 

    def forward(self, x):

        return torch.sigmoid(self.linear(x))

 

 

model = LogisticRegression(input_dim=10)

 

# 定义损失函数和优化器

criterion = nn.BCELoss()

optimizer = optim.SGD(model.parameters(), lr=0.01)

 

# 训练模型

num_epochs = 100

for epoch in range(num_epochs):

    for batch_data, batch_labels in dataloader:

        optimizer.zero_grad()

        outputs = model(batch_data)

        loss = criterion(outputs, batch_labels.view(-1, 1))

        loss.backward()

        optimizer.step()

    if (epoch + 1) % 10 == 0:

        print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')

 

# 保存模型

torch.save(model.state_dict(), 'logistic_regression.pth')

 

# 加载模型进行预测

loaded_model = LogisticRegression(input_dim=10)

loaded_model.load_state_dict(torch.load('logistic_regression.pth'))

loaded_model.eval()

 

# 进行预测

new_data = np.random.randn(10, 10)

new_data = torch.FloatTensor(new_data)

with torch.no_grad():

    predictions = loaded_model(new_data)

    predicted_labels = (predictions > 0.5).float()

 

# 计算精确度、召回率及F1分数

true_labels = np.random.randint(0, 2, size=(10, 1))

precision = precision_score(true_labels, predicted_labels.numpy())

recall = recall_score(true_labels, predicted_labels.numpy())

f1 = f1_score(true_labels, predicted_labels.numpy())

 

print(f'Precision: {precision:.4f}')

print(f'Recall: {recall:.4f}')

print(f'F1-score: {f1:.4f}')


http://www.ppmy.cn/ops/156117.html

相关文章

数据库系统概念第六版记录 一

1.关系型数据库 关系型数据库(Relational Database,简称 RDB)是基于关系模型的一种数据库,它通过表格的形式来组织和存储数据。每个表由若干行(记录)和列(字段)组成,数据…

移除元素-双指针(下标)

题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作&#xff1a…

Linux-Robust-Futex学习笔记

robust futex 简介 概述: 为了保证futex的robustness,添加了一种能够用于处理进程异常终止时锁状态的机制,就是当拥有锁的线程异常终止时,该线程能够将锁进行释放 基本原理: 每个线程都有一个私有的robust list&…

Spring Boot 实例解析:配置文件

SpringBoot 的热部署&#xff1a; Spring 为开发者提供了一个名为 spring-boot-devtools 的模块来使用 SpringBoot 应用支持热部署&#xff0c;提高开发者的效率&#xff0c;无需手动重启 SpringBoot 应用引入依赖&#xff1a; <dependency> <groupId>org.springfr…

深度学习之“线性代数”

线性代数在深度学习中是解决多维数学对象计算问题的核心工具。这些数学对象包括标量、向量、矩阵和张量&#xff0c;借助它们可以高效地对数据进行操作和建模。以下将详细介绍这些数学对象及其在深度学习中的典型用途。 数学对象概述 标量 标量是最简单的数学对象&#xff0…

算法 哈夫曼树和哈夫曼编码

目录 前言 一&#xff0c;二进制转码 二&#xff0c;哈夫曼编码和哈夫曼树 三&#xff0c;蓝桥杯 16 哈夫曼树 总结 前言 这个文章需要有一定的树的基础&#xff0c;没学过树的伙伴可以去看我博客树的文章 当我们要编码一个字符串转成二进制的时候&#xff0c;我们要怎么…

【回溯+剪枝】电话号码的字母组合 括号生成

文章目录 17. 电话号码的字母组合解题思路&#xff1a;回溯 哈希表22. 括号生成解题思路&#xff1a;回溯 剪枝 17. 电话号码的字母组合 17. 电话号码的字母组合 ​ 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 …

寻路算法:A*算法。

在2D应用场景中&#xff0c;会出现寻找最短路径的情况。可以运用的算法很多&#xff0c;广度优先算法&#xff0c;曼哈顿算法等等。虽然可以最终访问到。但是为了节省性能&#xff0c;推荐使用A*算法。 1.图示 2.基本原理 遍历一个点周围的点。看看那个点的寻路消耗最小。再以…