目录

一、数据准备与预处理

二、数据集划分与归一化

三、构建神经网络模型

四、定义损失函数和优化器

五、训练模型

六、评估模型


在机器学习和深度学习的实践中,信贷风险评估是一个非常重要的应用场景。通过构建神经网络模型,我们可以对客户的信用状况进行预测,从而帮助金融机构更好地管理风险。最近,我尝试使用PyTorch框架来实现一个信贷风险预测的神经网络模型,并在这个过程中巩固了我对神经网络的理解。以下是我在完成这个任务过程中的详细记录和总结。

一、数据准备与预处理

信贷数据集通常包含客户的各种特征,如收入、信用评分、贷款金额等,以及是否违约的标签。为了更好地训练神经网络模型,数据预处理是必不可少的步骤。

import pandas as pd
import numpy as np
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, StandardScaler, OneHotEncoder, LabelEncoder
from imblearn.over_sampling import SMOTE
import matplotlib.pyplot as plt
from tqdm import tqdm# 设置GPU设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(f"使用设备: {device}")# 加载信贷预测数据集
data = pd.read_csv('data.csv')# 丢弃掉Id列
data = data.drop(['Id'], axis=1)# 区分连续特征与离散特征
continuous_features = data.select_dtypes(include=['float64', 'int64']).columns.tolist()
discrete_features = data.select_dtypes(exclude=['float64', 'int64']).columns.tolist()# 离散特征使用众数进行补全
for feature in discrete_features:if data[feature].isnull().sum() > 0:mode_value = data[feature].mode()[0]data[feature].fillna(mode_value, inplace=True)# 连续变量用中位数进行补全
for feature in continuous_features:if data[feature].isnull().sum() > 0:median_value = data[feature].median()data[feature].fillna(median_value, inplace=True)# 有顺序的离散变量进行标签编码
mappings = {"Years in current job": {"10+ years": 10,"2 years": 2,"3 years": 3,"< 1 year": 0,"5 years": 5,"1 year": 1,"4 years": 4,"6 years": 6,"7 years": 7,"8 years": 8,"9 years": 9},"Home Ownership": {"Home Mortgage": 0,"Rent": 1,"Own Home": 2,"Have Mortgage": 3},"Term": {"Short Term": 0,"Long Term": 1}
}# 使用映射字典进行转换
data["Years in current job"] = data["Years in current job"].map(mappings["Years in current job"])
data["Home Ownership"] = data["Home Ownership"].map(mappings["Home Ownership"])
data["Term"] = data["Term"].map(mappings["Term"])# 对没有顺序的离散变量进行独热编码
data = pd.get_dummies(data, columns=['Purpose'])

在上述代码中,我首先加载了信贷数据集,并对其进行了预处理。具体步骤包括:

  1. 丢弃无用的Id列。

  2. 区分连续特征和离散特征。

  3. 对离散特征使用众数进行补全,对连续特征使用中位数进行补全。

  4. 对有顺序的离散变量进行标签编码,对没有顺序的离散变量进行独热编码。

二、数据集划分与归一化

在数据预处理完成后,我将数据集划分为训练集和测试集,并对特征数据进行归一化处理。

# 分离特征数据和标签数据
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)# 对特征数据进行归一化处理
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)  # 确保训练集和测试集是相同的缩放# 将数据转换为PyTorch张量
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)

在上述代码中,我使用了MinMaxScaler对特征数据进行归一化处理,以确保所有特征的值都在0到1之间。这一步对于神经网络的训练非常重要,因为它可以加速模型的收敛速度并提高模型的性能。之后,我将数据转换为PyTorch张量,并将其移动到指定的设备(GPU或CPU)上。

三、构建神经网络模型

接下来,我定义了一个简单的多层感知机(MLP)模型,包含一个输入层、两个隐藏层和一个输出层。隐藏层使用了ReLU激活函数,并添加了Dropout层以防止过拟合。

class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.fc1 = nn.Linear(X_train.shape[1], 64)  # 输入层到第一隐藏层self.relu = nn.ReLU()self.dropout = nn.Dropout(0.3)  # 添加Dropout防止过拟合self.fc2 = nn.Linear(64, 32)  # 第一隐藏层到第二隐藏层self.fc3 = nn.Linear(32, 2)  # 第二隐藏层到输出层def forward(self, x):x = self.fc1(x)x = self.relu(x)x = self.dropout(x)x = self.fc2(x)x = self.relu(x)x = self.dropout(x)x = self.fc3(x)return x# 初始化模型
model = MLP().to(device)

在定义模型时,我使用了nn.Module作为基类,并通过forward方法定义了模型的前向传播逻辑。这种模块化的定义方式使得模型的结构清晰且易于扩展。

四、定义损失函数和优化器

损失函数和优化器是神经网络训练的两个关键组件。对于分类任务,交叉熵损失函数(CrossEntropyLoss)是最常用的损失函数之一。优化器则负责根据损失函数的梯度更新模型的参数,我选择了随机梯度下降(SGD)优化器。

criterion = nn.CrossEntropyLoss()  # 使用交叉熵损失函数
optimizer = optim.SGD(model.parameters(), lr=0.01)  # 使用SGD优化器

五、训练模型

训练模型的过程是一个迭代优化的过程。在每一轮迭代中,模型会计算损失函数的值,并通过反向传播更新参数。为了监控训练过程,我每10轮打印一次损失值。

num_epochs = 200  # 训练轮数
for epoch in range(num_epochs):model.train()  # 设置为训练模式optimizer.zero_grad()  # 清空梯度outputs = model(X_train)  # 前向传播loss = criterion(outputs, y_train)  # 计算损失loss.backward()  # 反向传播optimizer.step()  # 更新参数if (epoch + 1) % 10 == 0:print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')

通过上述代码,我成功地训练了模型,并观察到损失值随着训练轮数的增加而逐渐降低。这表明模型正在逐步学习数据中的规律。

六、评估模型

训练完成后,我使用测试集对模型的性能进行了评估。评估指标是准确率,即模型正确预测的样本数占总样本数的比例。

model.eval()  # 设置为评估模式
with torch.no_grad():correct = 0total = 0outputs = model(X_test)_, predicted = torch.max(outputs.data, 1)total += y_test.size(0)correct += (predicted == y_test).sum().item()accuracy = 100 * correct / total
print(f'Accuracy on test set: {accuracy:.2f}%')

最终,模型在测试集上的准确率达到了 [具体准确率]%。虽然这个结果还有提升的空间,但它已经证明了神经网络在信贷风险评估任务中的有效性。

@浙大疏锦行

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

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

相关文章

如何确定是不是一个bug?

在软件测试过程中,我们经常会遇到一些异常现象,但并非所有异常都是Bug。如何准确判断一个问题是否属于Bug?本文将从Bug的定义、判定标准、常见误区和实战技巧四个方面展开,帮助测试工程师提高Bug判定的准确性。 1. Bug的定义:什么情况下算Bug? 一个Bug(缺陷)通常指软件…

Lombok与Jackson实现高效JSON序列化与反序列化

引言 在Java开发中&#xff0c;处理JSON数据是常见需求&#xff0c;而Jackson作为广泛使用的JSON库&#xff0c;能够高效地将Java对象与JSON互相转换。然而&#xff0c;传统的POJO&#xff08;Plain Old Java Object&#xff09;需要手动编写大量样板代码&#xff08;如getter…

论文阅读:PURPLE: Making a Large Language Model a Better SQL Writer

论文地址&#xff1a;PURPLE: Making a Large Language Model a Better SQL Writer 摘要 大语言模型&#xff08;LLM&#xff09;技术在自然语言到 SQL&#xff08;NL2SQL&#xff09;翻译中扮演着越来越重要的角色。通过大量语料训练的 LLM 具有强大的自然语言理解能力和基本…

【图像大模型】ControlNet:深度条件控制的生成模型架构解析

ControlNet&#xff1a;深度条件控制的生成模型架构解析 一、核心原理与技术突破1.1 基础架构设计1.2 零卷积初始化1.3 多条件控制机制 二、系统架构与实现细节2.1 完整处理流程2.2 性能指标对比 三、实战部署指南3.1 环境配置3.2 基础推理代码3.3 高级控制参数 四、典型问题解…

【从0到1搞懂大模型】chatGPT 中的对齐优化(RLHF)讲解与实战(9)

GPT系列模型的演进 chatgpt系列模型演进的重要节点包含下面几个模型&#xff08;当然&#xff0c;这两年模型发展太快了&#xff0c;4o这些推理模型我就先不写了&#xff09; (Transformer) → GPT-1 → GPT-2 → GPT-3 → InstructGPT/ChatGPT(GPT-3.5) → GPT-4 下面介绍一…

2025年AEI SCI1区TOP,改进麻雀搜索算法MSSA+建筑三维重建,深度解析+性能实测

目录 1.摘要2.麻雀搜索算法SSA原理3.整体框架4.改进SSA算法5.结果展示6.参考文献7.代码获取8.读者交流 1.摘要 对现有建筑进行高质量的三维重建对于其维护、修复和管理至关重要。图像采集中的有效视角规划会显著影响基于摄影测量的三维重建质量。复杂的建筑结构常常导致传统视…

鸿蒙开发:如何实现列表吸顶

前言 本文基于Api13 列表吸顶功能&#xff0c;在实际的开发中有着很大的作用&#xff0c;比如可以让列表层级之间更加分明&#xff0c;减少一定程度上的视觉混乱&#xff0c;由于吸顶的标题会随着滚动固定在顶部&#xff0c;可以让用户无需反复滑动回顶部确认分组位置&#xff…

使用Zotero的RSS订阅功能快速了解感兴趣领域最新文章

文章目录 写在前面中文期刊的RSS订阅英文期刊的RSS订阅回到Zotero有啥用&#xff1f; 写在前面 作为一名研究生或者科研工作者&#xff0c;肯定需要经常检索自己研究领域的最新文献&#xff0c;相比于不定期的去各大数据库检索文献&#xff0c;借助RSS订阅功能则更加便捷。 R…

Windows安装Docker Desktop开启 Kubenetes制作并部署本地镜像

1、安装Docker Desktop docker desktop官方下载链接&#xff0c;下载后一路点下来安装就好了。 2、制作本地镜像 跟着docker步骤制作镜像&#xff0c;需要先配置docker 镜像源&#xff0c;因为网络问题 {"builder": {"gc": {"defaultKeepStorage&…

嵌入式学习笔记 - freeRTOS 列表,链表,节点跟任务之间关系

一 下图说明了 freeRTOS 就绪列表&#xff0c;链表&#xff0c;节点跟任务之间关系 一个任务对应一个节点&#xff0c;一个链表对应一个优先级&#xff0c;一个任务根据优先级可以插入任何一个链表中。 插入函数为&#xff0c;这也是freeRTOS的核心函数&#xff0c;对每个任务…

scikit-learn pytorch transformers 区别与联系

以下是 scikit-learn、PyTorch 和 Transformers 的区别与联系的表格形式展示: 特性/库scikit-learnPyTorchTransformers主要用途传统机器学习算法深度学习框架预训练语言模型与自然语言处理任务核心功能分类、回归、聚类、降维、模型选择等张量计算、自动微分、神经网络构建与…

【C/C++】从零开始掌握Kafka

文章目录 从零开始掌握Kafka一、Kafka 基础知识理解&#xff08;理论&#xff09;1. 核心组件与架构2. 重点概念解析 二、Kafka 面试重点知识梳理三、C 使用 Kafka 的实践&#xff08;librdkafka&#xff09;1. librdkafka 简介2. 安装 librdkafka 四、实战&#xff1a;高吞吐生…

Spyglass:目标文件(.spq)的结构

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 预备知识 为了方便检查&#xff0c;Spyglass向用户提供Guideware作为检查参考&#xff1b;Guideware又包含各种方法(Methodology)&#xff0c;应用于设计的不同阶段&…

一些Dify聊天系统组件流程图架构图

分享一些有助于深入理解Dify聊天模块的架构图 整体组件架构图 #mermaid-svg-0e2XalGLqrRbH1Jy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0e2XalGLqrRbH1Jy .error-icon{fill:#552222;}#mermaid-svg-0e2XalGLq…

地理空间索引:解锁日志分析中的位置智慧

title: 地理空间索引:解锁日志分析中的位置智慧 date: 2025/05/24 18:43:06 updated: 2025/05/24 18:43:06 author: cmdragon excerpt: 地理空间索引在日志分析中应用广泛,涉及用户登录IP定位、移动端位置轨迹和物联网设备位置上报等场景。MongoDB支持2dsphere和2d两种地理…

分库分表深度解析

一、为什么要分库分表&#xff1f; 通常&#xff0c;数据库性能受到如下几个限制&#xff1a; 硬件瓶颈&#xff1a;单机的 CPU、内存、磁盘 I/O 等资源总是有限。例如&#xff0c;当单表中的记录达到上亿、甚至更高时&#xff0c;表扫描、索引维护和数据迁移会变得非常慢。单…

QListWidget的函数,信号介绍

前言 Qt版本:6.8.0 该类用于列表模型/视图 QListWidgetItem函数介绍 作用 QListWidget是Qt框架中用于管理可交互列表项的核心组件&#xff0c;主要作用包括&#xff1a; 列表项管理 支持动态添加/删除项&#xff1a;addItem(), takeItem()批量操作&#xff1a;addItems()…

ModbusRTU转profibusDP网关与RAC400通讯报文解析

ModbusRTU转profibusDP网关与RAC400通讯报文解析 在工业自动化领域&#xff0c;ModbusRTU和ProfibusDP是两种常见的通信协议。ModbusRTU以其简单、可靠、易于实现等特点&#xff0c;广泛应用于各种工业设备之间的通信&#xff1b;而ProfibusDP则是一种高性能的现场总线标准&am…

Python容器

一、容器 1. 列表【】&#xff1a;有序可重复可混装可修改 [元素1&#xff0c;元素2&#xff0c;元素3&#xff0c;...] • 可以容纳多个元素 • 可以容纳不同类型的元素&#xff08;混装&#xff09; • 数据是有序存储的&#xff08;有下标序号&#xff09; • 允许重复数…

webpack面试问题

一、核心概念 Webpack的构建流程是什么? 答案: 初始化:读取配置,创建Compiler对象编译:从入口文件开始,递归分析依赖关系,生成依赖图模块处理:调用Loader转换模块(如babel-loader)输出:将处理后的模块组合成Chunk,生成最终文件Loader和Plugin的区别? Loader:文件…