用R語言構建神經網路模型評估銀行客戶信用的好壞
隨著銀行業務的擴充套件、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,效果還不錯!