随机森林分析金融数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


随机森林模型

首先:安装需要的几个R语言包:ggplot2,VIM,ggrepel
数据说明:

名称类型描述
accountstring现有支票帐户的状态(A11:<0 DM,A12:0 <= x <200 DM,A13:> = 200 DM /至少一年的薪水分配,A14:无支票帐户)
durationinteger D持续时间(月)
credit_historystringA30:未提取任何信用/已全额偿还所有信用额,A31:已偿还该银行的所有信用额,A32:已到期已偿还的现有信用额,A33:过去的还款延迟,A34:关键帐户/其他信用额现有(不在此银行)
purposestringA40 : car (new) A41 : car (used),A42 : furniture/equipment,A43 : radio/television,A44 : domestic appliances,A45 : repairs,A46 : educationA47 : (vacation - does not exist?),A48 : retraining,A49 : business,A410 : others
credit_amountfloat
savingsstring账户/债券储蓄(A61:<100 DM,A62:100 <= x <500 DM,A63:500 <= x <1000 DM,A64:> = 1000 DM,A65:未知/无储蓄账户
present_employmentstring71:待业,A72:<1年,A73:1 <= x <4年,A74:4 <= x <7年,A75:…> = 7年
installment_ratefloat分期付款率占可支配收入的百分比
personalstring个人婚姻状况和性别(A91:男性:离婚/分居,A92:女性:离婚/分居/已婚,A93:男性:单身,A94:男性:已婚/丧偶,A95:女性:单身)
other_debtorsstringA101:无,A102:共同申请人,A103:担保人
present_residencefloat至今居住
propertystringA121:不动产,A122:如果不是,那么A121:建筑协会储蓄协议/人寿保险,A123:如果不是,则A121 / A122:不是属性6的汽车或其他,A124:未知/没有财产
agefloat年岁
other_installment_plansstringA141:银行,A142:商店,A143:无
housingstringA151:租房,A152:自有,A153:免费
existing_creditsfloat该银行现有信贷的数量
jobstring1:失业/A171 : 非技术人员-非居民,A172:非技术人员-居民,A173:技术人员/官员,A174:管理/个体经营/高度合格的员工/官员
dependentsinteger承担赡养费的人数
telephonestringA191:无,A192:有,登记在客户名下
foreign_workerstringA201: 有, A202: 无
customerinteger预测类别:1 =良好,2 =不良

本文利用R语言的广义线性模型和随机森林模型分析网上比较流行的德国信用卡数据,下面的代码可以用来确定申请人是否有信用,以及他(或她)是否对贷款人有良好的信用风险。


提示:以下是本篇文章正文内容,下面案例可供参考

一、随机森林模型

1.数据加载

1.1加载分析包和数据集,数据文件位置在D盘根目录。

library(ggplot2)
library(VIM)
library(ggrepel)
library(randomForest)
library(varSelRF)
library(pROC)
setwd('D:')
data <- read.csv('German Credit.csv')

1.2快速浏览一下数据,了解一下我们的工作内容。可以看到该数据集有1000行,21列数据

dim(data)
[1] 1000   21
str(data)

数据集的内容
我们在这个模型中试图把重点放在作为信用价值指标的数据分类或类别上。这些是分类变量,而不是数字变量。申请人有电话吗?申请人是否已婚?是否有共同签署人?申请人在同一地址住了多长时间?等等。
我们需要知道它们与贷款决定的关系。良好的信用与某些因素的组合有关,从而使我们可以用概率将新的申请人按其特征进行分类。

二、数据清洗

2.1.删除变量

你可能会立即注意到有几个变量很显眼。我们要排除"duration",“credit_amount”,"age"这些变量,保留分类因素。

代码如下(示例):

data1 <- subset(data,select=-c(duration,credit_amount,age))
dim(data1)
[1] 1000   18

2.2变量数据类型转换

然后我们将整数转换成因子。
代码如下(示例):

data1$account <- as.factor(data1$account)
data1$credit_history <- as.factor(data1$credit_history)
data1$purpose <- as.factor(data1$purpose)
data1$savings <- as.factor(data1$savings)
data1$present_employment <- as.factor(data1$present_employment)
data1$installment_rate <- as.factor(data1$installment_rate)
data1$personal <- as.factor(data1$personal)
data1$other_debtors <- as.factor(data1$other_debtors)
data1$present_residence <- as.factor(data1$present_residence)
data1$property <- as.factor(data1$property)
data1$other_installment_plans <- as.factor(data1$other_installment_plans)
data1$housing <- as.factor(data1$housing)
data1$existing_credits <- as.factor(data1$existing_credits)
data1$job <- as.factor(data1$job)
data1$dependents <- as.factor(data1$dependents)
data1$telephone <- as.factor(data1$telephone)
data1$foreign_worker <- as.factor(data1$foreign_worker)
data1$customer <- as.factor(data1$customer)

2.3划分训练集和测试集

我们把数据集分成训练集(80%)和测试集(20%)。

set.seed(1234)
nn=0.8
sub<-sample(1:nrow(data1),round(nrow(data1)*nn))
length(sub)
data_train <- data1[sub,]#取0.8的数据做训练集
data_test <- data1[-sub,]#取0.2的数据做测试集
dim(data_train)#训练集行数和列数
dim(data_test) #测试集的行数和列数


三、随机森林分析

3.1建模分析

model.forest <-randomForest(customer ~ ., data = data_train,importance=TRUE,proximity=TRUE)

pre.forest=predict(model.forest, data_test)
pre.forest   1   2
         1 130  37
         2  11  22
table<-table(pre.forest,data_test$customer)

sum(diag(table))/sum(table)
[1] 0.76

我们可以看到随机森林模型可以识别出76%的客户的信用
下面我们处理这组数据,看看每个变量在建模时的重要性,以下结果仅供参考

model.forest.all <-randomForest(customer ~ ., data =data1,importance=TRUE,proximity=TRUE)
importance(model.forest.all)
varImpPlot(model.forest.all)

在这里插入图片描述
MeanDecreaseAccuracy描述的是当把一个变量变成随机数时,随机森林预测准确度的降低程度,该值越大表示该变量的重要性越大。
MeanDecreaseGini通过基尼指数计算每个变量对分类树上每个节点的观测值的异质性影响。该值越大表示该变量的重要性越大。

3.2模型优化

print(model.forest)

Call:
 randomForest(formula = customer ~ ., data = 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.5%
Confusion matrix:
    1  2 class.error
1 502 57   0.1019678
2 147 94   0.6099585

构建随机森林时,影响随机森林模型的两个主要因素,第一个是决策树节点分支所选择的变量个数,第二个是随机森林模型中的决策数的数量,使用函数randomForest()时,函数会默认节点所选变量个数以及决策树的数量,但是这些默认值不一定是最优的,从以上结果我们看到默认节点个数为4,决策树的数量为500.根据这个理论。下面我们寻找最优的随机森林模型
首先我们可视化分析构建随机森林模型过程中应该使用的决策树的数量

set.seed(113)
plot(model.forest)

在这里插入图片描述
我们看到模型中的决策树数量在200之上时都会趋于稳定,很少会有变化
接下来确定节点的个数

rate = list()
for(i in 1:ncol(data1)/2)
{
    set.seed(123)
    model.forest <- randomForest(customer ~ ., data = data_train,mtry=i,importance=TRUE,ntree=500)
    rate[i] <- mean(model.forest$err.rate)#计算基于OOB数据的模型误判率均值 
}

rate = unlist(rate)
plot(rate)

在这里插入图片描述
我们看到当节点为11的时候达到最小值
我们利用优化后的模型再次测试测试集,看看效果

set.seed(114)
model.forest1 <-randomForest(customer ~ ., data = data_train,mtry=11,ntree=200,importance=TRUE)
print(model.forest1)
Call:
 randomForest(formula = customer ~ ., data = data_train, mtry = 11,      ntree = 200, importance = TRUE) 
               Type of random forest: classification
                     Number of trees: 200
No. of variables tried at each split: 11

        OOB estimate of  error rate: 27.62%
Confusion matrix:
    1   2 class.error
1 476  83   0.1484794
2 138 103   0.5726141

pre.forest=predict(model.forest1, data_test)
table(pre.forest,data_test$customer)
pre.forest   1   2
         1 124  33
         2  17  26

table<-table(pre.forest,data_test$customer)
sum(diag(table))/sum(table)
[1] 0.75

总结

效果还是有的由原先的0.76降低到现在的0.75。效果不行,待继续优化。

讨论了用神经网络的方法解决银行信用评估问题,基本思想也是将数据的70%作为一个训练集训练出一个神经元,之后再测试模型的好坏,正确率大约是76%。个人觉得随机森林的最大优点是不仅能预测还可以得出每个变量的重要性,这对于建模者来说是很有意义的,尤其在商业数据挖掘时,找出最重要的变量就可以为企业创造无限价值。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值