DAY 36 超大力王爱学Python

article/2025/8/10 8:45:24

仔细回顾一下神经网络到目前的内容,没跟上进度的同学补一下进度。

  • 作业:对之前的信贷项目,利用神经网络训练下,尝试用到目前的知识点让代码更加规范和美观。
  • 探索性作业(随意完成):尝试进入nn.Module中,查看他的方法
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.metrics import confusion_matrix, classification_report, roc_auc_score
import numpy as np
import pandas as pd
from tqdm import tqdm
import matplotlib.pyplot as plt# 设置随机种子,保证结果可复现
torch.manual_seed(42)
np.random.seed(42)# 数据加载与预处理
def load_and_preprocess_data():# 加载数据try:data = pd.read_csv('D:\代码\项目一信贷风险预测\data.csv')except:# 如果路径错误,使用模拟数据演示print("无法加载数据,使用模拟数据...")data = pd.DataFrame({'Home Ownership': np.random.choice(['Rent', 'Own Home', 'Home Mortgage'], 1000),'Annual Income': np.random.normal(50000, 20000, 1000),'Years in current job': np.random.choice(['1 year', '2 years', '3 years', '4 years', '5 years', '10+ years'], 1000),'Tax Liens': np.random.randint(0, 3, 1000),'Number of Open Accounts': np.random.randint(1, 20, 1000),'Years of Credit History': np.random.normal(10, 5, 1000),'Maximum Open Credit': np.random.normal(50000, 30000, 1000),'Number of Credit Problems': np.random.randint(0, 5, 1000),'Months since last delinquent': np.random.normal(20, 15, 1000),'Bankruptcies': np.random.randint(0, 3, 1000),'Purpose': np.random.choice(['debt consolidation', 'home improvements', 'buy a car', 'medical bills', 'small business'], 1000),'Term': np.random.choice(['Short Term', 'Long Term'], 1000),'Current Loan Amount': np.random.normal(20000, 15000, 1000),'Current Credit Balance': np.random.normal(15000, 10000, 1000),'Monthly Debt': np.random.normal(2000, 1000, 1000),'Credit Score': np.random.normal(700, 100, 1000),'Credit Default': np.random.binomial(1, 0.3, 1000)})# 处理缺失值data['Annual Income'] = data['Annual Income'].fillna(data['Annual Income'].mean())data['Years in current job'] = data['Years in current job'].fillna(data['Years in current job'].mode()[0])data['Months since last delinquent'] = data['Months since last delinquent'].fillna(data['Months since last delinquent'].mean())data['Bankruptcies'] = data['Bankruptcies'].fillna(data['Bankruptcies'].mean())data['Credit Score'] = data['Credit Score'].fillna(data['Credit Score'].mean())# 对类别变量进行编码label_encoders = {}categorical_columns = ['Home Ownership', 'Years in current job', 'Purpose', 'Term']for col in categorical_columns:le = LabelEncoder()data[col] = le.fit_transform(data[col])label_encoders[col] = lereturn data# 数据加载与预处理
data = load_and_preprocess_data()# 划分特征和目标变量
X = data.drop(['Id', 'Credit Default'], axis=1).values if 'Id' in data.columns else data.drop(['Credit Default'], axis=1).values
y = data['Credit Default'].values# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 将数据转换为 PyTorch 张量
X_train = torch.FloatTensor(X_train)
y_train = torch.FloatTensor(y_train).unsqueeze(1)
X_test = torch.FloatTensor(X_test)
y_test = torch.FloatTensor(y_test).unsqueeze(1)# 定义神经网络模型
class CreditNet(nn.Module):def __init__(self, input_size=16):super(CreditNet, self).__init__()self.fc1 = nn.Linear(input_size, 64)self.relu = nn.ReLU()self.fc2 = nn.Linear(64, 32)self.dropout = nn.Dropout(0.2)  # 添加Dropout防止过拟合self.fc3 = nn.Linear(32, 16)self.fc4 = nn.Linear(16, 1)self.sigmoid = nn.Sigmoid()def forward(self, x):out = self.fc1(x)out = self.relu(out)out = self.fc2(out)out = self.relu(out)out = self.dropout(out)  # 应用Dropoutout = self.fc3(out)out = self.relu(out)out = self.fc4(out)out = self.sigmoid(out)return out# 实例化模型、定义损失函数和优化器
model = CreditNet(input_size=X_train.shape[1])
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
num_epochs = 100
train_losses = []print("开始训练模型...")
for epoch in tqdm(range(num_epochs), desc="训练进度"):optimizer.zero_grad()outputs = model(X_train)loss = criterion(outputs, y_train)loss.backward()optimizer.step()train_losses.append(loss.item())# 每10个epoch打印一次损失if (epoch + 1) % 10 == 0:tqdm.write(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')# 可视化训练损失
plt.figure(figsize=(10, 6))
plt.plot(range(1, num_epochs + 1), train_losses)
plt.title('Training Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.grid(True)
plt.show()# 在测试集上评估模型
model.eval()
with torch.no_grad():outputs = model(X_test)predicted_probs = outputs.numpy().flatten()predicted = (predicted_probs > 0.5).astype(int)y_test_np = y_test.numpy().flatten()# 计算准确率accuracy = np.mean(predicted == y_test_np)print(f'\nAccuracy: {accuracy * 100:.2f}%')# 计算AUCtry:auc = roc_auc_score(y_test_np, predicted_probs)print(f'AUC: {auc:.4f}')except:print("无法计算AUC(可能只有一类样本)")# 混淆矩阵cm = confusion_matrix(y_test_np, predicted)print("\nConfusion Matrix:")print(cm)# 分类报告print("\nClassification Report:")print(classification_report(y_test_np, predicted, target_names=['非违约', '违约']))
开始训练模型...
训练进度:  39%|███▉      | 39/100 [00:00<00:00, 382.36it/s]    
Epoch [10/100], Loss: 0.6428
Epoch [20/100], Loss: 0.6112
Epoch [30/100], Loss: 0.5762
Epoch [40/100], Loss: 0.5473
Epoch [50/100], Loss: 0.5242
Epoch [60/100], Loss: 0.5083
训练进度:  39%|███▉      | 39/100 [00:00<00:00, 382.36it/s]    
Epoch [70/100], Loss: 0.4941
训练进度: 100%|██████████| 100/100 [00:00<00:00, 320.51it/s]   
Epoch [80/100], Loss: 0.4845
Epoch [90/100], Loss: 0.4759
Epoch [100/100], Loss: 0.4705

import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.metrics import roc_auc_score, classification_report
import numpy as np
import pandas as pd
from tqdm import tqdm
import matplotlib.pyplot as plt# 设置中文字体为黑体(SimHei)
plt.rcParams['font.sans-serif'] = ['SimHei']  
# 解决负号显示乱码问题
plt.rcParams['axes.unicode_minus'] = False  
# 设置随机种子,保证结果可复现
torch.manual_seed(42)
np.random.seed(42)# 加载和预处理数据
def load_and_preprocess_data():try:data = pd.read_csv('D:\代码\项目一信贷风险预测\data.csv')except:print("无法加载数据,使用模拟数据...")data = pd.DataFrame({'Home Ownership': np.random.choice(['Rent', 'Own Home', 'Home Mortgage'], 1000),'Annual Income': np.random.normal(50000, 20000, 1000),'Years in current job': np.random.choice(['1 year', '2 years', '3 years', '4 years', '5 years', '10+ years'], 1000),'Tax Liens': np.random.randint(0, 3, 1000),'Number of Open Accounts': np.random.randint(1, 20, 1000),'Years of Credit History': np.random.normal(10, 5, 1000),'Maximum Open Credit': np.random.normal(50000, 30000, 1000),'Number of Credit Problems': np.random.randint(0, 5, 1000),'Months since last delinquent': np.random.normal(20, 15, 1000),'Bankruptcies': np.random.randint(0, 3, 1000),'Purpose': np.random.choice(['debt consolidation', 'home improvements', 'buy a car', 'medical bills', 'small business'], 1000),'Term': np.random.choice(['Short Term', 'Long Term'], 1000),'Current Loan Amount': np.random.normal(20000, 15000, 1000),'Current Credit Balance': np.random.normal(15000, 10000, 1000),'Monthly Debt': np.random.normal(2000, 1000, 1000),'Credit Score': np.random.normal(700, 100, 1000),'Credit Default': np.random.binomial(1, 0.3, 1000)})# 处理缺失值data['Annual Income'] = data['Annual Income'].fillna(data['Annual Income'].mean())data['Years in current job'] = data['Years in current job'].fillna(data['Years in current job'].mode()[0])data['Months since last delinquent'] = data['Months since last delinquent'].fillna(data['Months since last delinquent'].mean())data['Bankruptcies'] = data['Bankruptcies'].fillna(data['Bankruptcies'].mean())data['Credit Score'] = data['Credit Score'].fillna(data['Credit Score'].mean())# 对类别变量进行编码label_encoders = {}categorical_columns = ['Home Ownership', 'Years in current job', 'Purpose', 'Term']for col in categorical_columns:le = LabelEncoder()data[col] = le.fit_transform(data[col])label_encoders[col] = lereturn datadata = load_and_preprocess_data()# 划分特征和目标变量
X = data.drop(['Id', 'Credit Default'], axis=1).values if 'Id' in data.columns else data.drop(['Credit Default'], axis=1).values
y = data['Credit Default'].values# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 转换为PyTorch张量
X_train = torch.FloatTensor(X_train)
y_train = torch.FloatTensor(y_train).unsqueeze(1)
X_test = torch.FloatTensor(X_test)
y_test = torch.FloatTensor(y_test).unsqueeze(1)# 定义不同配置的模型
class ModelConfig1(nn.Module):"""浅网络 + ReLU"""def __init__(self, input_size=16):super().__init__()self.layers = nn.Sequential(nn.Linear(input_size, 32),nn.ReLU(),nn.Linear(32, 1),nn.Sigmoid())def forward(self, x):return self.layers(x)class ModelConfig2(nn.Module):"""深网络 + ReLU"""def __init__(self, input_size=16):super().__init__()self.layers = nn.Sequential(nn.Linear(input_size, 64),nn.ReLU(),nn.Linear(64, 32),nn.ReLU(),nn.Linear(32, 16),nn.ReLU(),nn.Linear(16, 1),nn.Sigmoid())def forward(self, x):return self.layers(x)class ModelConfig3(nn.Module):"""深网络 + ReLU + Dropout"""def __init__(self, input_size=16):super().__init__()self.layers = nn.Sequential(nn.Linear(input_size, 64),nn.ReLU(),nn.Dropout(0.3),nn.Linear(64, 32),nn.ReLU(),nn.Dropout(0.3),nn.Linear(32, 16),nn.ReLU(),nn.Linear(16, 1),nn.Sigmoid())def forward(self, x):return self.layers(x)class ModelConfig4(nn.Module):"""深网络 + LeakyReLU + BatchNorm"""def __init__(self, input_size=16):super().__init__()self.layers = nn.Sequential(nn.Linear(input_size, 64),nn.BatchNorm1d(64),nn.LeakyReLU(0.1),nn.Linear(64, 32),nn.BatchNorm1d(32),nn.LeakyReLU(0.1),nn.Linear(32, 16),nn.BatchNorm1d(16),nn.LeakyReLU(0.1),nn.Linear(16, 1),nn.Sigmoid())def forward(self, x):return self.layers(x)# 训练和评估函数
def train_and_evaluate(model_class, optimizer_class, lr=0.001, epochs=50):model = model_class(input_size=X_train.shape[1])criterion = nn.BCELoss()optimizer = optimizer_class(model.parameters(), lr=lr)train_losses = []test_aucs = []for epoch in range(epochs):model.train()optimizer.zero_grad()outputs = model(X_train)loss = criterion(outputs, y_train)loss.backward()optimizer.step()train_losses.append(loss.item())# 每5个epoch评估一次if (epoch + 1) % 5 == 0:model.eval()with torch.no_grad():test_outputs = model(X_test)try:auc = roc_auc_score(y_test.numpy(), test_outputs.numpy())test_aucs.append(auc)except:test_aucs.append(0)# 最终评估model.eval()with torch.no_grad():test_outputs = model(X_test)test_preds = (test_outputs > 0.5).float()accuracy = (test_preds == y_test).sum().item() / y_test.size(0)try:final_auc = roc_auc_score(y_test.numpy(), test_outputs.numpy())except:final_auc = 0return {'train_losses': train_losses,'test_aucs': test_aucs,'accuracy': accuracy,'auc': final_auc,'model': model}# 超参数配置
configs = [{'model_class': ModelConfig1, 'optimizer': optim.Adam, 'lr': 0.001, 'name': '浅网络+Adam'},{'model_class': ModelConfig2, 'optimizer': optim.Adam, 'lr': 0.001, 'name': '深网络+Adam'},{'model_class': ModelConfig3, 'optimizer': optim.Adam, 'lr': 0.001, 'name': '深网络+Dropout+Adam'},{'model_class': ModelConfig4, 'optimizer': optim.Adam, 'lr': 0.001, 'name': '深网络+BN+LeakyReLU+Adam'},{'model_class': ModelConfig4, 'optimizer': optim.SGD, 'lr': 0.01, 'name': '深网络+BN+LeakyReLU+SGD'},
]# 运行所有配置
results = {}
for config in configs:print(f"\n训练配置: {config['name']}")result = train_and_evaluate(config['model_class'], config['optimizer'], config['lr'],epochs=50)results[config['name']] = resultprint(f"最终准确率: {result['accuracy']*100:.2f}% | AUC: {result['auc']:.4f}")# 可视化训练损失
plt.figure(figsize=(12, 6))
for name, result in results.items():plt.plot(result['train_losses'], label=name)
plt.title('不同配置的训练损失对比')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.grid(True)
plt.show()# 可视化测试AUC
plt.figure(figsize=(12, 6))
x_ticks = [i for i in range(5, 51, 5)]
for name, result in results.items():plt.plot(x_ticks, result['test_aucs'], label=name)
plt.title('不同配置的测试AUC对比')
plt.xlabel('Epoch')
plt.ylabel('AUC')
plt.legend()
plt.grid(True)
plt.show()# 对比最终结果
print("\n最终结果对比:")
for name, result in results.items():print(f"{name}: 准确率={result['accuracy']*100:.2f}%, AUC={result['auc']:.4f}")最终结果对比:
浅网络+Adam: 准确率=72.33%, AUC=0.6804
深网络+Adam: 准确率=74.73%, AUC=0.7048
深网络+Dropout+Adam: 准确率=70.60%, AUC=0.7402
深网络+BN+LeakyReLU+Adam: 准确率=76.53%, AUC=0.7633
深网络+BN+LeakyReLU+SGD: 准确率=71.53%, AUC=0.6697

@浙大疏锦行


http://www.hkcw.cn/article/sVyoFTGYwL.shtml

相关文章

【Oracle】数据备份与恢复

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. Oracle备份恢复概述1.1 为什么备份这么重要&#xff1f;1.2 Oracle备份策略全景图 2. 物理备份详解2.1 冷备份 - 最简单粗暴的方式2.1.1 冷备份的步骤2.1.2 冷备份恢复过程 2.2 热备份 - 不停机的备份艺术2.…

使用BERT/BiLSTM + CRF 模型进行NER进展记录~

使用代码处理数据集&#xff0c;发现了一些问题&#xff0c;以及解决办法~ 下载了一组数据集&#xff0c;数据存放在CSV中&#xff0c;GBK格式。如下&#xff1a; 首先对每一列直接进行NER抽取&#xff0c;结果非常不好&#xff1a; 几乎是乱抽取的&#xff0c;解决办法是自己创…

18. Qt系统相关:多线程

一、概述 在Qt中&#xff0c;使用QThread类对系统线程进行了封装。QThread代表一个在应用程序中可独立控制的线程&#xff0c;也可以和进程中的其他线程共享数据。 二、QThread常用API 三、QThread使用 自定义一个类&#xff0c;继承自QThread&#xff0c;并且只有一个线程处…

YOLOv7 辅助检测头与重参数化解析2025.6.1

YOLOv7 是目标检测领域的一个重要模型&#xff0c;其在速度和精度之间取得了较好的平衡。其中的**辅助检测头&#xff08;Auxiliary Head&#xff09;和重参数化&#xff08;Re-parameterization&#xff09;**是其核心创新点。以下是对这两个技术的详细解析&#xff1a; 一、辅…

CP4-OFDM模糊函数原理及仿真

文章目录 前言一、互补P4码序列二、barker-OFDM 信号1、OFDM 信号表达式2、模糊函数表达式 三、MATLAB 仿真1、MATLAB 核心源码2、仿真结果①、CP4-OFDM 模糊函数②、CP4-OFDM 距离分辨率③、CP4-OFDM 速度分辨率④、CP4-OFDM 等高线图 四、资源自取 前言 本文进行 CP4-OFDM 的…

【C语言预处理详解(上)】--预定义符号,#define定义常量,#define定义宏,带有副作用的宏参数,宏替换的规则,宏和函数的对比

目录 一.预定义符号 二.#define定义常量 三.#define定义宏 3.1--定义宏的方法和注意事项 3.2--带有副作用的宏参数 3.3--宏替换的规则 四.宏与函数的对比 &#x1f525;个人主页&#xff1a;草莓熊Lotso的个人主页 &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &a…

CppCon 2014 学习:C++ Memory Model Meets High-Update-Rate Data Structures

这段内容是对一个主题的概览&#xff08;Overview&#xff09;&#xff0c;涉及并行更新的问题&#xff0c;特别是“Issaquah Challenge”这个具体案例。详细解读如下&#xff1a; Overview&#xff08;概览&#xff09; The Issaquah Challenge 这是一个特定的挑战或问题&am…

如何用利用deepseek的API能力来搭建属于自己的智能体-优雅草卓伊凡

如何用利用deepseek的API能力来搭建属于自己的智能体-优雅草卓伊凡 上一篇文章我们已经介绍了智能体和大模型AI的区别&#xff0c;现在我们开始搭建自己的智能体进行工作 1. 了解 DeepSeek 提供的 AI 能力 DeepSeek 提供强大的 大语言模型&#xff08;LLM&#xff09;&#x…

智能制造之精读——RPA制造行业常见场景【附全文阅读】

RPA 在制造行业应用广泛&#xff0c;为企业带来显著价值&#xff0c;是极具潜力的智能化解决方案。它能节省成本&#xff0c;降低人力与管理成本&#xff1b;提升运营效率&#xff0c;减少人机交互损耗&#xff1b;提高质量&#xff0c;保障流程准确性&#xff1b;还能增强合规…

【2025.06】jupyter notebook 7+ 新手安装、配置、扩展应用(windows篇)

本文目录 前述一、安装二、配置2.1 jupyter_notebook_config.py生成配置文件2.2 服务器与网络设置a. 修改端口号b. 允许远程访问c. 设置工作目录 2.3 安全与认证a. 禁用密码登录&#xff08;仅限本地安全环境&#xff09;b. 设置登录密码c. 启用SSL加密&#xff08;HTTPS&#…

ASP.NET Core SignalR 身份认证集成指南(Identity + JWT)

文章目录 前言一、完整解决方案架构二、实现步骤1.配置 Identity 和 JWT 认证2. SignalR JWT配置3.SignalR Hub 集成认证和授权4.控制器5.客户端集成 (JavaScript)6.配置 appsettings.json 三、认证流程详解1.用户登录&#xff1a;2.SignalR 连接&#xff1a;3.JWT 验证&#x…

Redis最佳实践——性能优化技巧之数据结构选择

Redis在电商应用中的数据结构选择与性能优化技巧 一、电商核心场景与数据结构选型矩阵 应用场景推荐数据结构内存占用读写复杂度典型操作商品详情缓存Hash低O(1)HGETALL, HMSET购物车管理Hash中O(1)HINCRBY, HDEL用户会话管理Hash低O(1)HSETEX, HGET商品分类目录Sorted Set高O…

【Tauri2】049——upload

前言 这篇就看看一个简单地插件——upload Upload | Taurihttps://tauri.app/plugin/upload/upload的英文意思是“上传&#xff08;程序或信息&#xff09;”。 看来是用来上传文件的。 支持移动端 正文 安装 pnpm tauri add upload 在前后端都会安装&#xff0c;即 .plug…

《深度解构现代云原生微服务架构的七大支柱》

☁️《深度解构现代云原生微服务架构的七大支柱》 一线架构师实战总结&#xff0c;系统性拆解现代微服务架构中最核心的 7 大支柱模块&#xff0c;涵盖通信协议、容器编排、服务网格、弹性伸缩、安全治理、可观测性、CI/CD 等。文内附架构图、实操路径与真实案例&#xff0c;适…

ADAS概述

一、ADAS的概念 1.1 ADAS功能概述、架构方案、控制器、传感器 核心概念&#xff1a;ADAS(Advanced Driving Assistance System)是高级驾驶辅助系统的总称&#xff0c;包含三大类功能&#xff1a; 舒适体验类&#xff1a;如自适应巡航(ACC)、高速公路辅助(HWA)、车道居中控制&…

深入探讨redis:万字讲解集群

什么是集群 广义的集群&#xff1a;多个机器&#xff0c;构成了分布式系统&#xff0c;就可以称为“集群”。 狭义的集群&#xff1a;redis提供的集群模式&#xff0c;这个集群模式之下&#xff0c;主要解决的是存储空间不足的问题(拓展存储空间) 随着数据量的增多一台机器的…

一键开关机电路分析

左边电源9V为输入电源&#xff0c;中间有一个LDO&#xff0c;输出5V给右侧的芯片供电。 Q1是PNP三极管&#xff0c;Q2和Q3是NPN三极管。 初始状态下&#xff0c;按键断开&#xff0c;Q3截止&#xff0c;故Q1的基极为高电平&#xff0c;电压为9V&#xff0c;be间没有电流流过&am…

输入ifconfig,发现ens33不见了,无法连接至虚拟机

输入ifconfig&#xff0c;发现ens33不见了&#xff0c;无法连接至虚拟机 输入ifconfig&#xff0c;发现ens33不见了&#xff0c;无法连接至虚拟机 输入ifconfig&#xff0c;发现ens33不见了&#xff0c;无法连接至虚拟机 当输入ifconfig&#xff0c;发现少了ens33&#xff0c;无…

c++学习值---模版

目录 一、函数模板&#xff1a; 1、基本定义格式&#xff1a; 2、模版函数的优先匹配原则&#xff1a; 二、类模板&#xff1a; 1、基本定义格式&#xff1a; 2、类模版的优先匹配原则&#xff08;有坑哦&#xff09;&#xff1a; 3、缺省值的设置&#xff1a; 4、ty…

day62—DFS—太平洋大西洋水流问题(LeetCode-417)

题目描述 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights &#xff0c; hei…