当前位置: 首页 > article >正文

【MATLAB数据处理实用案例详解(15)】——利用BP神经网络实现个人信贷信用评估

目录

    • 一、问题描述
    • 二、BP神经网络实现个人信贷信用评估原理
    • 三、算法步骤
      • 3.1 读入数据
      • 3.2 划分训练样本与测试样本
      • 3.3 样本归一化
      • 3.4 创建BP神经网络,并完成训练
      • 3.5 测试
    • 四、运行结果

一、问题描述

对个人信用的评估方法主要分为定性评估和定量评估两种,前者主要根据信贷人员的主观判断,后者则根据个人客户的资料,利用评分卡和信用评分模型等工具进行分析。
本文采用BP神经网络,以已知用户信息及信用情况为训练样本,学习得出一个抽象模型,然后对新样本进行评估 ,正确率稳定在70%以上。
对所有客户做二分类,只区分好和差两种情况。数据采用德国信用数据库。德国信用数据库由Hans Hofmann教授整理,包含1000份客户资料,每位客户包含20条属性,并给出了信用好或差的标注。
数据集下载地址如下:
http://ftp.ics.uci.edu/pub/machine-learning-databases/statlog/german。

原始数据保存在german.data文件中,包括:
经常账户状况 、账户持续时间 、贷款历史状况 、贷款用途 、贷款数额等。

二、BP神经网络实现个人信贷信用评估原理

数据集中每位客户包含20条属性,其中的数值属性可以直接使用,类别属性经过整数编码后可以使用。此外,该数据库还给出了另一个处理过的文件german.data-numeric,将原始文件的类别属性进行整数编码,形成24个数值属性,可以直接使用。本文主要使用原书数据进行评估,最后也给出结果。

使用MATLAB实现一个三层的BP神经网络。由于每个个人用户拥有24个属性,因此输入层包含24个神经元节点。该问题为针对信用好/差的二分类问题,因此输出层只包含一个神经元。隐含层的神经元个数与网络性能有关,需要通过实验确定。
流程如下:
在这里插入图片描述

三、算法步骤

3.1 读入数据

close all;
clear,clc

%% 读入数据
% 打开文件
fid = fopen('german.data', 'r');

% 按格式读取每一行
% 每行包括21项,包括字符串和数字
C = textscan(fid, '%s %d %s %s %d %s %s %d %s %s %d %s %d %s %s %d %s %d %s %s %d\n');

% 关闭文件
fclose(fid);

3.2 划分训练样本与测试样本

在全部1000份样本中,共有700份正例(信誉好),300份负例(信誉差)。划分时取前350份正例和前150份负例作为训练样本,后350份正例和后150份负例作为测试样本。

% 输入向量
x = C1(1:N, :);
% 目标输出
y = C1(N+1, :);

% 正例
posx = x(:,y==1);
% 负例
negx = x(:,y==2);

% 训练样本
trainx = [ posx(:,1:350), negx(:,1:150)];
trainy = [ones(1,350), ones(1,150)*2];

% 测试样本
testx = [ posx(:,351:700), negx(:,151:300)];
testy = trainy;

3.3 样本归一化

使用mapminmax函数对输入样本进行归一化:

% 训练样本归一化
[trainx, s1] = mapminmax(trainx);

% 测试样本归一化
testx = mapminmax('apply', testx, s1);

3.4 创建BP神经网络,并完成训练

代码如下:

% 创建BP网络
net = newff(trainx, trainy);
% 设置最大训练次数
net.trainParam.epochs = 1500;
% 目标误差
net.trainParam.goal = 1e-13;
% 显示级别
net.trainParam.show = 1;

% 训练
net = train(net,trainx, trainy);

3.5 测试

BP网络输出值并不限定为1或2,而是一个实数,因此还需要将输出转换为整数。取1.5为阈值,小于该阈值的输出判为1(信用好),否则判为2(信用差)

y0 = net(testx);

% y0为浮点数输出。将y0量化为1或2。
y00 = y0;
% 以1.5为临界点,小于1.5为1,大于1.5为2
y00(y00<1.5)=1;
y00(y00>1.5)=2;

% 显示正确率
fprintf('正确率: \n');
disp(sum(y00==testy)/length(y00));

四、运行结果

训练过程如下:
在这里插入图片描述
性能曲线:
在这里插入图片描述


如果需要源代码,可以参考资源:https://download.csdn.net/download/didi_ya/87734937。
制作不易,如果对你有所帮助,记得点个赞哟~


http://www.kler.cn/a/15735.html

相关文章:

  • MySQL技巧之跨服务器数据查询:基础篇-删除语句如何写
  • Qwen2.5-Coder-32B-Instruct Docker 部署openai接口
  • 深入解析 CentOS 7 上 MySQL 8.0 的最佳实践20241112
  • 一文3000字从0到1带你进行Mock测试(建议收藏)
  • CDH安装与配置及相关大数据组件实践
  • 用pandoc工具实现ipynb,md,word,pdf之间的转化
  • 零基础想成为黑客,只需要四步
  • CF662C Binary Table
  • nvm安装使用详解,附gnvm介绍
  • 史上最全的接口测试,吐血整理从零到接口自动化实战...
  • 1992-2022年31省人均gdp/各省人均地区生产总值
  • @PostConstruct注解和@PreDestroy注解
  • 【AI生产力工具】Upscale.media:用AI技术提升照片质量,让你的作品更出色
  • 【LeetCode股票买卖系列:121. 买卖股票的最佳时机 | 一次遍历 | 暴力递归=>记忆化搜索=>动态规划】
  • 系统集成项目管理工程师 笔记(第19章:项目收尾管理)
  • 【5G RRC】RSRP、RSRQ以及SINR含义、计算过程详细介绍
  • 如何在Linkedin领英上找客户
  • VsCode镜像下载(国内镜像源,高速秒下)
  • 博世中国创新软件开发中心 BCSC
  • vue生命周期代码示范--Vue基本介绍--MVVM-示意图--数据渲染--事件绑定--修饰符--组件化--和全部代码示范
  • Python高级函数1:使用 map()、reduce()、filter()、zip() 和 enumerate() 简化代码
  • 【云台】开源版本SimpleBGC的电机驱动与控制方式
  • iVX开发中整理的常见问题与回答(三)
  • 虹科案例 | 如何通过智能、非接触式测量解决方案,提高起重机的安全和效率?
  • ESET NOD32 互联网安全软件和防毒软件 -简单,可靠的防护。
  • 优思学院|做质量管理有七大工具,都是什么?