Python打卡第36天

@浙大疏锦行

作业:

对之前的信贷项目,利用神经网络训练下,尝试用到目前的知识点让代码更加规范和美观。

import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import time
import matplotlib.pyplot as plt
from tqdm import tqdm
import pandas as pd
import warningswarnings.filterwarnings("ignore")# 设置GPU设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(f"使用设备: {device}")# 数据预处理函数
def preprocess_data(data_path):data = pd.read_csv(data_path)# 标签编码home_ownership_mapping = {'Own Home': 1, 'Rent': 2, 'Have Mortgage': 3, 'Home Mortgage': 4}data['Home Ownership'] = data['Home Ownership'].map(home_ownership_mapping)years_in_job_mapping = {'< 1 year': 1, '1 year': 2, '2 years': 3, '3 years': 4,'4 years': 5, '5 years': 6, '6 years': 7, '7 years': 8,'8 years': 9, '9 years': 10, '10+ years': 11}data['Years in current job'] = data['Years in current job'].map(years_in_job_mapping)# 独热编码data = pd.get_dummies(data, columns=['Purpose'])# 转换bool为intfor col in data.select_dtypes(include=['bool']).columns:data[col] = data[col].astype(int)# Term映射term_mapping = {'Short Term': 0, 'Long Term': 1}data['Term'] = data['Term'].map(term_mapping)data.rename(columns={'Term': 'Long Term'}, inplace=True)# 填充缺失值for feature in data.select_dtypes(include=['int64', 'float64']).columns:mode_value = data[feature].mode()[0]data[feature].fillna(mode_value, inplace=True)return data# 加载并预处理数据
data = preprocess_data('data.csv')
X = data.drop('Credit Default', axis=1)
y = data['Credit Default']# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y
)# 归一化
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 转换为Tensor
X_train = torch.FloatTensor(X_train).to(device)
y_train = torch.LongTensor(y_train.values).to(device)
X_test = torch.FloatTensor(X_test).to(device)
y_test = torch.LongTensor(y_test.values).to(device)# 定义模型
class MLP(nn.Module):def __init__(self, input_dim, hidden_dim=10, output_dim=2):super().__init__()self.layers = nn.Sequential(nn.Linear(input_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, output_dim))def forward(self, x):return self.layers(x)# 初始化模型
input_dim = X_train.shape[1]
model = MLP(input_dim=input_dim, output_dim=2).to(device)  # 二分类问题输出维度应为2# 损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)  # 使用Adam优化器# 训练参数
num_epochs = 1000
batch_size = 64
n_batches = len(X_train) // batch_size# 训练循环
losses = []
start_time = time.time()with tqdm(range(num_epochs), desc="训练进度") as pbar:for epoch in pbar:epoch_loss = 0# 小批量训练for i in range(n_batches):start = i * batch_sizeend = start + batch_sizebatch_X = X_train[start:end]batch_y = y_train[start:end]# 前向传播outputs = model(batch_X)loss = criterion(outputs, batch_y)# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()epoch_loss += loss.item()avg_loss = epoch_loss / n_batcheslosses.append(avg_loss)# 更新进度条pbar.set_postfix({'Loss': f'{avg_loss:.4f}'})print(f'训练时间: {time.time()-start_time:.2f}秒')# 绘制损失曲线
plt.figure(figsize=(10, 6))
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.grid(True)
plt.show()# 评估模型
model.eval()
with torch.no_grad():outputs = model(X_test)_, predicted = torch.max(outputs, 1)accuracy = (predicted == y_test).float().mean()print(f'测试集准确率: {accuracy.item()*100:.2f}%')
使用设备: cuda:0
训练进度: 100%|██████████| 1000/1000 [03:01<00:00,  5.50it/s, Loss=0.4466]
训练时间: 181.73秒

测试集准确率: 77.20%

代码耗时过长,进行优化

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import TensorDataset, DataLoader
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np
import time
from tqdm import tqdm
import matplotlib.pyplot as plt
import warnings# 禁用警告
warnings.filterwarnings("ignore")# 设备配置
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(f"使用设备: {device}")# ==================== 数据预处理函数 ====================
def preprocess_data(data_path):"""优化点1:封装预处理逻辑为函数"""data = pd.read_csv(data_path)# 标签编码(优化点2:使用字典映射替代if-else)mapping_dicts = {'Home Ownership': {'Own Home': 1, 'Rent': 2, 'Have Mortgage': 3, 'Home Mortgage': 4},'Years in current job': {'< 1 year': 1, '1 year': 2, '2 years': 3, '3 years': 4,'4 years': 5, '5 years': 6, '6 years': 7, '7 years': 8,'8 years': 9, '9 years': 10, '10+ years': 11},'Term': {'Short Term': 0, 'Long Term': 1}}for col, mapping in mapping_dicts.items():data[col] = data[col].map(mapping)# 独热编码(优化点3:自动处理新特征)data = pd.get_dummies(data, columns=['Purpose'], drop_first=True)# 优化点4:自动类型转换for col in data.select_dtypes(include=['bool', 'uint8']).columns:data[col] = data[col].astype(int)# 优化点5:统一缺失值处理num_cols = data.select_dtypes(include=['int64', 'float64']).columnsdata[num_cols] = data[num_cols].fillna(data[num_cols].mode().iloc[0])return data# ==================== 数据加载与分割 ====================
data = preprocess_data('data.csv')
X = data.drop('Credit Default', axis=1)
y = data['Credit Default']# 优化点6:分层抽样保证类别平衡
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y
)# 归一化(优化点7:避免数据泄露)
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# ==================== 模型定义 ====================
class MLP(nn.Module):"""优化点8:参数化模型结构"""def __init__(self, input_dim, hidden_dims=[64, 32], output_dim=2):super().__init__()layers = []prev_dim = input_dim# 动态构建隐藏层for hidden_dim in hidden_dims:layers.extend([nn.Linear(prev_dim, hidden_dim),nn.ReLU(),nn.Dropout(0.3)  # 优化点9:添加Dropout防止过拟合])prev_dim = hidden_dimlayers.append(nn.Linear(prev_dim, output_dim))self.net = nn.Sequential(*layers)def forward(self, x):return self.net(x)# ==================== 训练配置 ====================
# 转换为Tensor
X_train_t = torch.FloatTensor(X_train).to(device)
y_train_t = torch.LongTensor(y_train.values).to(device)
X_test_t = torch.FloatTensor(X_test).to(device)
y_test_t = torch.LongTensor(y_test.values).to(device)# 创建DataLoader(优化点10:批处理)
train_dataset = TensorDataset(X_train_t, y_train_t)
train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True)# 初始化模型
model = MLP(input_dim=X_train.shape[1]).to(device)# 损失函数与优化器(优化点11:AdamW + 权重衰减)
criterion = nn.CrossEntropyLoss()
optimizer = optim.AdamW(model.parameters(), lr=0.001, weight_decay=1e-4)# 学习率调度器(优化点12:余弦退火)
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50)# ==================== 训练循环 ====================
def train_model(model, train_loader, criterion, optimizer, num_epochs=100):"""优化点13:封装训练过程"""train_losses = []best_loss = float('inf')patience, counter = 5, 0pbar = tqdm(range(num_epochs), desc="训练进度")for epoch in pbar:model.train()epoch_loss = 0for batch_X, batch_y in train_loader:optimizer.zero_grad()outputs = model(batch_X)loss = criterion(outputs, batch_y)loss.backward()optimizer.step()epoch_loss += loss.item()# 计算平均损失avg_loss = epoch_loss / len(train_loader)train_losses.append(avg_loss)# 早停机制(优化点14)if avg_loss < best_loss:best_loss = avg_losscounter = 0torch.save(model.state_dict(), 'best_model.pth')else:counter += 1if counter >= patience:print(f"\n早停触发,最佳损失: {best_loss:.4f}")break# 更新进度条pbar.set_postfix({'Loss': f'{avg_loss:.4f}','LR': f"{optimizer.param_groups[0]['lr']:.2e}"})scheduler.step()return train_losses# 执行训练
start_time = time.time()
loss_history = train_model(model, train_loader, criterion, optimizer, num_epochs=100)
print(f"训练耗时: {time.time()-start_time:.2f}秒")# ==================== 结果可视化 ====================
plt.figure(figsize=(10, 5))
plt.plot(loss_history, label='训练损失')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('训练损失曲线')
plt.legend()
plt.grid(True)
plt.show()# ==================== 模型评估 ====================
model.load_state_dict(torch.load('best_model.pth'))
model.eval()
with torch.no_grad():y_pred = model(X_test_t)_, predicted = torch.max(y_pred, 1)acc = accuracy_score(y_test, predicted.cpu())print(f"\n测试集准确率: {acc*100:.2f}%")# 优化点15:输出分类报告
from sklearn.metrics import classification_report
print("\n分类报告:")
print(classification_report(y_test, predicted.cpu()))
使用设备: cuda:0
训练进度:  33%|███▎      | 33/100 [00:06<00:13,  5.12it/s, Loss=0.4611, LR=2.87e-04]早停触发,最佳损失: 0.4596
训练耗时: 6.45秒

测试集准确率: 77.80%分类报告:precision    recall  f1-score   support0       0.77      0.98      0.86      10771       0.83      0.27      0.40       423accuracy                           0.78      1500macro avg       0.80      0.62      0.63      1500
weighted avg       0.79      0.78      0.73      1500

探索性作业(随意完成)

尝试进入nn.Module中,查看他的方法

方法一:使用 dir() 查看所有方法和属性

import torch.nn as nn# 列出 nn.Module 的所有方法和属性
print(dir(nn.Module))

这会输出 nn.Module 的所有成员,包括方法、属性和特殊方法(以 __ 开头和结尾的)。

方法二:使用 help() 查看详细文档

help(nn.Module)

这会显示 nn.Module 的完整文档,包括方法的详细说明、参数和返回值。

方法三:查看特定方法的源代码

如果你想深入了解某个方法的实现,可以使用 inspect 模块查看源代码:

import inspect
from torch.nn import Module# 查看 forward 方法的源代码
print(inspect.getsource(Module.forward))

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

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

相关文章

全面理解类和对象(下)

文章目录 再谈构造函数初始化列表 static概念&#xff1a; 友元友元函数友元类 内部类再次理解类和对象 再谈构造函数 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _month;int _day; };上述代码有了…

TomatoSCI分析日记——层次聚类

TomatoSCI分析日记——层次聚类 今天介绍的是一种常见的聚类方法——层次聚类。层次聚类会将数据集划分成嵌套的簇&#xff0c;形成一个层次结构&#xff08;树状图&#xff09;&#xff0c;经常用于探究样本的相似性。用大白话来说&#xff0c;就是&#xff1a;我有一大堆样品…

mysql都有哪些锁?

MySQL中的锁机制是确保数据库并发操作正确性和一致性的重要组成部分&#xff0c;根据锁的粒度、用途和特性&#xff0c;可以分为多种类型。以下是MySQL中常见的锁及其详细说明&#xff1a; 一、按锁的粒度划分 行级锁&#xff08;Row-level Locks&#xff09; 描述&#xff1a;…

flutter 项目调试、flutter run --debug调试模式 devtools界面说明

Flutter DevTools 网页界面说明 1. 顶部导航栏 Inspector&#xff1a;查看和调试 Widget 树&#xff0c;实时定位 UI 问题。Performance-- 性能分析面板&#xff0c;查看帧率、CPU 和 GPU 使用情况&#xff0c;识别卡顿和性能瓶颈。Memory-- 内存使用和对象分配分析&#xff…

使用Kotlin创建Spring Boot用户应用项目

项目初始化与配置 通过Spring Initializr创建Kotlin项目 若需使用Kotlin语言开发Spring Boot应用(假设已安装Kotlin环境),可通过start.spring.io进行项目初始化。在项目创建页面需进行以下关键配置: 语言选择:切换至Kotlin选项项目元数据:需填写Group(如com.apress.us…

【Linux网络篇】:Socket网络套接字以及简单的UDP网络程序编写

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;Linux篇–CSDN博客 文章目录 网络编程套接字一.预备知识1.理解源IP地址和目的IP地址2.认识端…

Python爬虫实战:研究Newspaper框架相关技术

1. 引言 1.1 研究背景与意义 互联网的快速发展使得新闻信息呈现爆炸式增长&#xff0c;如何高效地获取和分析这些新闻数据成为研究热点。新闻爬虫作为一种自动获取网页内容的技术工具&#xff0c;能够帮助用户从海量的互联网信息中提取有价值的新闻内容。本文基于 Python 的 …

【node.js】实战项目

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. 项目概览与架构设计1.1 实战项目&#xff1a;企业级电商管理系统1.2 技术栈选择 2. 项目初始化与基础架构2.1 项目结构设计2.2 基础配置管理 3. 用户服务实现3.1 用户服务架构3.2 用户模型设计3.3 用户服务…

Mybatis框架的构建(IDEA)

选择maven项目 修改设置 在设置中添加自定义代码模板 开始写代码 动态SQL语句的示例&#xff1a; pom文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"…

经济法-6-公司法律制度知识点

一、出资期限 1.有限责任公司&#xff1a;全体股东需在公司成立之日起5年内缴足认缴的注册资本 2.股份有限公司&#xff1a;以发起方式设立的&#xff0c;发起人需在公司登记前实缴全部股款 3.认缴期加速到期 公司不能清偿到期债务的&#xff0c;公司或者已到期债权的债权人…

jquery.table2excel方法导出

jquery提供了一个table2excel方法可以用来导出页面到xls等 $("#grid_595607").table2excel({exclude: ".noExport", // 排除类名为 noExport 的元素filename: "导出数据.xls",exclude_img: true, // 不导出图片exclude_links: true, // 不导…

echarts设置标线和最大值最小值

echarts设置标线和最大值最小值 基本ECharts图表初始化配置 设置动态的y轴范围&#xff08;min/max值&#xff09; 通过markPoint标记最大值和最小值点 使用markLine添加水平参考线 配置双y轴图表 自定义标记点和线的样式&#xff08;颜色、符号等&#xff09; 响应式调整图表大…

Java文件操作:从“Hello World”到“Hello File”

&#x1f50d; 开发者资源导航 &#x1f50d;&#x1f3f7;️ 博客主页&#xff1a; 个人主页&#x1f4da; 专栏订阅&#xff1a; JavaEE全栈专栏 文件 什么是文件&#xff1f; 广义&#xff1a;操作系统进行资源管理的一种机制&#xff0c;很多的软件/硬件资源&#xff0c;…

2025第三届黄河流域网络安全技能挑战赛--Crypto--WriteUp

2025第三届黄河流域网络安全技能挑战赛–Crypto–WriteUp Crypto sandwitch task from Crypto.Util.number import * import gmpy2 flag bflag{fake_flag} assert len(flag) 39 p getPrime(512) q getPrime(512) n p * q e 0x3 pad1 beasy_problem pad2 bHow_to_so…

三重天理论

第一重天&#xff1a;公理层&#xff08;形而上地基&#xff09; 这里构建的是人类理性的"操作系统"&#xff0c;公理作为不证自明的逻辑起点&#xff08;如矛盾律/同一律&#xff09;&#xff0c;恰似海德格尔所说的"存在之镜"。黑格尔辩证法在此显现为动…

2025年第八届广西大学生程序设计大赛(正式赛)题解(更新中)

知乎评价&#xff1a;如何评价2025年第八届GXCPC广西大学生程序设计大赛暨中国-东盟国际大学生程序设计大赛&#xff1f; 榜单&#xff1a;牛客比赛排名 题目链接&#xff1a;第八届广西大学生程序设计大赛暨2025邀请赛 TIP&#xff1a;提交处可查看别人过题代码 难度签到题普通…

WHAT - 兆比特每秒 vs 兆字节每秒

文章目录 Mbps 解释Mbps 和 MB/s&#xff08;兆字节每秒&#xff09;换算总结网络场景1. 在路由器设置中的 Mbps2. 在游戏下载时的 Mbps / MB/s总结 Mbps 解释 首先&#xff0c;Mbps 是一个常见的网络带宽单位&#xff0c;意思是&#xff1a; Megabits per second&#xff08;…

[C语言实战]C语言内存管理实战:实现自定义malloc与free(四)

[C语言实战]C语言内存管理实战&#xff1a;实现自定义malloc与free&#xff08;四&#xff09; 摘要&#xff1a;通过实现简化版的内存管理器&#xff0c;深入理解动态内存分配的核心原理。本文包含内存块设计、分配算法、空闲合并策略的完整实现&#xff0c;并附可运行的代码…

YOLOv8源码修改(5)- YOLO知识蒸馏(下)设置蒸馏超参数:以yolov8-pose为例

目录 前言 1. 不同蒸馏算法资源占用 2. 不动态调整蒸馏损失 2.1 训练定量化结果 2.1 训练结果可视化结果 3. 动态调整蒸馏损失权重及实验分析 3.1 余弦衰减和指数衰减 3.2 CWD蒸馏损失 3.3 MGD蒸馏损失 3.4 AT蒸馏损失 3.5 SKD和PKD蒸馏损失 4. 调权重心得总结 5…

历年华东师范大学保研上机真题

2025华东师范大学保研上机真题 2024华东师范大学保研上机真题 2023华东师范大学保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school?classification1 简单一位数代数式计算 题目描述 给一个小学生都会算的1位数与1位数运算的代数式&#xff0c;请你求出这个表…