- A+
随着银行业务的扩展、P2P的出现、第三方支付提供个人贷、以及X宝等借贷平台的出现,使得个人信用评估在银行、第三方支付、商业借贷平台等上的应用越来越重要。本文利用BP人工神经网络对商业银行针对个人的信用等级评价进行了探讨,建立了神经网络的评价模型,对此做出了实例分析。
个人信用等级评估指标体系
商业银行个人信用等级评估指标体系设立的目的简述为银行通过评估借款人的“3C”,即品德(Character)、能力(Capacity)以及抵押(Collateral),对借款人在债务期满时偿债能力(Ability to pay)和还款意愿(Willingness to pay)等进行预测。根据指标体系设立原则,参照国际标准、国内外银行经验和企业信用等级评估方法,综合考虑商业银行特点及所在地区情况,通过对以往借款人群的考察,以专家判断为基础,可选择4大类21个指标全面评价个人信用等级。
可行性分析
我国个人信用等级评估起步较晚,相关信息残缺,而BP人工神经网络具有强大并行处理机制,高度自学习、自适应能力,内部有大量可调参数,因而使系统灵活性更强。
进行个人信用等级评估与预测时,有些因素带有模糊性,而BP人工神经网络的后天学习能力使之能够随环境的变化而不断学习,能够从未知模式的大量复杂数据中发现规律,与传统的评价方法相比,表现出更强的功能。
BP人工神经网络方法克服了传统分析过程的复杂性及选择适当模型函数形式的困难,它是一种自然的非线性建模过程,无需分清存在何种非线性关系,给建模与分析带来极大的方便。
BP人工神经网络可以再现专家的经验、知识和直觉思维,较好地保证了评估与预测结果的客观性。
模型建立
R语言AMORE包是个前馈神经网络工具包,类似的还有nnet,RSNNS等。AMORE比nnet参数要丰富一些。AMORE用来构建前馈神经网络的函数是newff()。
- newff(n.neurons,
- learning.rate.global,
- momentum.global,
- error.criterium,
- Stao,
- hidden.layer,
- output.layer,
- method)
其中。n.neurons是个数值向量,包含在每个层的神经元的数目。第一个数是输入神经元的数量,最后是输出神经元的数量,其余的都是隐藏层神经元的数量。
learning.rate.global全局的学习率。
momentum.global全局的动量值(貌似是步长)。
error.criterium误差衡量算法,如用误差平方和,选“LMS”。
hidden.layer隐藏层激活函数。
output.layer输出层激活函数。
method 学习方法,如梯度下降。
数据准备
本文数据下载:见文末
german.data-numeric是德国一家银行的数据集,共1000行,前24个变量是用户的各种存款贷款记录,最后一个变量是信用好坏,只有1和2两种情况。
- #加载包
- library("AMORE")
- #读入数据,因为分隔符不确定,所以不写,空格和制表符都行
- x <- read.table("D:/data/german.data-numeric",header=F)
- #数据最后一行为1和2表示信用好和信用不好,对其进行归一化
- x$V25[x$V25 == 1] <- 0
- x$V25[x$V25 == 2] <- 1
- #把训练数据和测试数据拆开
- T <- x$V25
- P <- x[,1:24]
- #把输入样本归一化 这里使用y=(x-MinValue)/(MaxValue-MinValue)来处理
- maxP <- apply(P,2,"max")
- minP <- apply(P,2,"min")
- P <- t(P)
- mm <- maxP-minP
- mm[mm ==0] <- 1 #避免除0
- P <- (P-minP)/mm
- P <- t(P)
- #抽样300作为测试集
- testc <- sample(1:nrow(x),300,replace=F)
- trainP <- P[-testc,]
- trainT <- T[-testc]
- testP <- P[testc,]
- testT <- T[testc]
- #创建网络
- net <- newff(n.neurons=c(24,24,1), learning.rate.global=1e-4, momentum.global=0.01,error.criterium="LMS", Stao=NA, hidden.layer="tansig", output.layer="purelin", method="ADAPTgdwm")
- #训练
- model <- train(net, trainP, trainT, error.criterium="LMS",
- report=TRUE, show.step=100, n.shows=10 )
- #测试testO <- sim(model$net, testP)testO[testO <0.5] <- 0testO[testO >= 0.5] <- 1table(testO,testT)
正确率:(187+42)/(187+42+24+47)=0.76,效果还不错!
支付宝打赏
微信打赏
赏