我们选取的数据时1994年德国的一家银行在平定客户信用风险好坏的时候用到的一组变量,共有1000组数据。由于年代久远可能和实际有些出入。数据可以在下面的网址下载。 http://archive.ics.uci.edu/ml/datasets/Statlog+(German+Credit+Data)
主要提供了两组数据,一份是原始数据总共有20个变量,另一分时处理过的数值数据,为了寻求更深层次的数据挖掘我们将分别利用者两组数据。
我们首先简单介绍一下变量
变量1
Status of existing checking account 现有的支票账户状态
A11 : … < 0 DM
A12 : 0 <= … < 200 DM
A13 : … >= 200 DM / salary assignments for at least 1 year
A14 : no checking account
变量2: (numerical) 数值变量(这里应该表示的是贷款期限)
Duration in month 月持续时间
变量3: (qualitative) 质量变量信用历史
Credit history 信用记录
A30 : no credits taken/ all credits paid back duly 无信用记录或所有信用都及时偿还
A31 : all credits at this bank paid back duly 这家银行的所有信用都及时偿还
A32 : existing credits paid back duly till now 直到现在有信用及时偿还
A33 : delay in paying off in the past 过去存在延迟支付
A34 : critical account/ other credits existing (not at this bank) 关键账户/在其他银行存在信用记录
变量4: (qualitative) 质量变量
Purpose 贷款目的
A40 : car (new) 新车
A41 : car (used) 旧车
A42 : furniture/equipment 家具/设备
A43 : radio/television 收音机/电视
A44 : domestic appliances 家用电器
A45 : repairs 维修
A46 : education 教育
A47 : (vacation - does not exist ) 空白—不存在
A48 : retraining 再教育
A49 : business 商业
A410 : others 其他
变量5: (numerical) 数值变量
Credit amount 信贷额度
Attibute 6: (qualitative) 质量变量
Savings account/bonds 存款
A61 : … < 100 DM
A62 : 100 <= … < 500 DM
A63 : 500 <= … < 1000 DM
A64 : .. >= 1000 DM
A65 : unknown/ no savings account 未知/无存款
变量7: (qualitative) 质量变量
Present employment since 就业状态
A71 : unemployed 失业
A72 : … < 1 year
A73 : 1 <= … < 4 years
A74 : 4 <= … < 7 years
A75 : .. >= 7 years
变量8: (numerical) 数值变量
Installment rate in percentage of disposable income 分期费率在可支配收入的百分比
变量9: (qualitative)
Personal status and sex 个人状态和性别
A91 : male : divorced/separated 男/离异/分居
A92 : female : divorced/separated/married 女/离异/分居/已婚
A93 : male : single 男/单身
A94 : male : married/widowed 男/已婚/丧偶
A95 : female : single 女/单身
变量10: (qualitative) 质量变量
Other debtors / guarantors 其他债务/担保
A101 : none 无
A102 : co-applicant 共同申请人
A103 : guarantor 担保人
变量11: (numerical)
Present residence since 目前自住宅
变量12: (qualitative)
Property 财产
A121 : real estate 房产
A122 : if not A121 : building society savings agreement/ life insurance 储蓄/寿险
A123 : if not A121/A122 : car or other, not in 变量6 汽车或其他不在6之内
A124 : unknown / no property 未知/无财产
变量13: (numerical)
Age in years 足岁年龄
变量14: (qualitative)
Other installment plans 其他分期付款计划
A141 : bank 银行
A142 : stores 商店
A143 : none 无
变量15: (qualitative)
Housing
A151 : rent 租房
A152 : own 自有
A153 : for free 免租
变量16: (numerical)
Number of existing credits at this bank 在本银行现有的信贷数量
变量17: (qualitative)
Job 工作
A171 : unemployed/ unskilled - non-resident 失业/无技能—非定居者
A172 : unskilled - resident 无技能/定居者
A173 : skilled employee / official 有技能的员工/公务员
A174 : management/ self-employed/ 管理者/个体
highly qualified employee/ officer 有经验的员工/高级职员
变量18: (numerical)
Number of people being liable to provide maintenance for 供养人数
变量19: (qualitative)
Telephone 手机
A191 : none
A192 : yes, registered under the customers name
变量20: (qualitative)
foreign worker 外籍劳工
A201 : yes
A202 : no
最后一个变量ctedit是判断客户的信用优劣,1代表good,2代表bad
> germen<- read.table("C:\\Users\\Administrator\\Desktop\\german.data",header=F)
> germen@names<-c('Status','Duration','history','Purpose','Creditamount','bonds','employment','Installmentrate','Personal','guarantors','residence','Property','Age','plans','Housing','existing','Job','provide','Telephone','foreignworker','credit')
> germen$credit<-as.factor(germen$credit)##注意要做分类是一定要把因变量变成因子类型的,否则会自动变成回归
> head(germen)
>str(germen)
我们可以很清楚的看到所有的数值变量都被读取为数值类型,所有的质量变量都被读取为因子类型,这就是R语言的强大之处,但是这个功能也有一个弊端,比如有时一个全是数值类型的变量中不小心混入一个质量变量,R读取时会自动认为是因子类型,为处理数据带来麻烦。
> library(randomForest)
> set.seed(111)
> ntest<-sample(1:nrow(germen),300,replace=F)
> train<-germen[-ntest,]
> test<-germen[ntest,]
> model.forest <-randomForest(credit ~ ., data = train,importance=TRUE,proximity=TRUE)
> pre.forest=predict(model.forest, test)
> table(pre.forest,test$credit)
pre.forest 1 2
1 184 65
2 14 37
> table<-table(pre.forest,test$credit)
> sum(diag(table))/sum(table)
[1] 0.736
我们可以看到随机森林模型可以识别出73.6%的客户的信用
下面我们处理这组数据,看看每个变量在建模时的重要性,以下结果仅供参考
> model.forest.all <-randomForest(credit ~ ., data =germen,importance=TRUE,proximity=TRUE)
> importance(model.forest.all)
> varImpPlot(model.forest.all)
MeanDecreaseAccuracy描述的是当把一个变量变成随机数时,随机森林预测准确度的降低程度,该值越大表示该变量的重要性越大。MeanDecreaseGini通过基尼指数计算每个变量对分类树上每个节点的观测值的异质性影响。该值越大表示该变量的重要性越大。
结果表明:个人账户状态、贷款期限和信用历史对客户信用的优劣评判有显著性影响。
> print(model.forest)
Call:
randomForest(formula = credit ~ ., data = train, importance = TRUE, proximity = TRUE)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 4
OOB estimate of error rate: 25.29%
Confusion matrix:
1 2 class.error
1 433 43 0.09033613
构建随机森林时,影响随机森林模型的两个主要因素,第一个是决策树节点分支所选择的变量个数,第二个是随机森林模型中的决策数的数量,使用函数randomForest()时,函数会默认节点所选变量个数以及决策树的数量,但是这些默认值不一定是最优的,从以上结果我们看到默认节点个数为4,决策树的数量为500.根据这个理论。下面我们寻找最优的随机森林模型
首先我们可视化分析构建随机森林模型过程中应该使用的决策树的数量
set.seed(113)
plot(model.forest)
我们看到模型中的决策树数量在200之上时都会趋于稳定,很少会有变化
接下来确定节点的个数
> for(i in 1:ncol(germen)/2)
+ {
+ set.seed(112)
+ model.forest <-randomForest(credit ~ ., data = train,mtry=i,importance=TRUE,ntree=500)
+ rate[i]=mean(model.forest$err.rate)#计算基于OOB数据的模型误判率均值
+ }
> rate
[1] 0.3499489 0.3499489 0.3291650 0.3291650 0.2997151 0.2997151 0.3032256 0.3032256 0.3073632
[10] 0.3073632
plot(rate)
我们看到当节点为5的时候达到最小值
我们利用优化后的模型再次测试测试集,看看效果
> set.seed(114)
> model.forest1 <-randomForest(credit ~ ., data = train,mtry=5,ntree=200,importance=TRUE)
> print(model.forest1)
Call:
randomForest(formula = credit ~ ., data = train, mtry = 5, ntree = 200, importance = TRUE)
Type of random forest: classification
Number of trees: 200
No. of variables tried at each split: 5
OOB estimate of error rate: 25.86%
Confusion matrix:
1 2 class.error
1 419 57 0.1197479
2 124 100 0.5535714
> pre.forest=predict(model.forest1, test)
> table(pre.forest,test$credit)
pre.forest 1 2
1 201 41
2 23 35
> table<-table(pre.forest,test$credit)
> sum(diag(table))/sum(table)
[1] 0.7866667
效果还是有的由原先的0.736提高到现在的0.786.
这篇博文讨论了用神经网络的方法解决银行信用评估问题,基本思想也是将数据的70%作为一个训练集训练出一个神经元,之后再测试模型的好坏,正确率大约是76%。个人觉得随机森林的最大优点是不仅能预测还可以得出每个变量的重要性,这对于建模者来说是很有意义的,尤其在商业数据挖掘时,找出最重要的变量就可以为企业创造无限价值。