决策树模型的r实现

决策树r实现:使用信贷机构数据

数据准备:

#数据有17个属性,其中default属性为类别标签,yes表示违约
#数据准备
credit<-read.csv("credit.csv")
str(credit)
table(credit$checking_balance) #考察支票账户余额
table(credit$savings_balance) #储蓄账户余额
summary(credit$months_loan_duration) 
summary(credit$amount) 
head(credit) #观察数据前6行
table(credit$default)
set.seed(100) #为了确保实验可重复
train_sample<-sample(1000,900) #从1-1000的整数序列中选择900个值
credit_train<-credit[train_sample,] 
credit_test<-credit[-train_sample,] #把数据划分为训练集和测试集
prop.table(table(credit_train$default)) 
prop.table(table(credit_test$default))

使用C5.0算法建立决策树:

#使用C5.0算法训练决策树要安装C50包 install.packages("C50") 
library(C50)
credit_model<-C5.0(credit_train[-17],credit_train$default) #default作为分类的目标向量要从训练数据中排除
credit_model
summary(credit_model) #输出决策树和混淆矩阵

评估模型性能:

credit_pred<-predict(credit_model,credit_test) 
#predict函数将决策树应用于测试集
#创建一个预测分类值向量
library(gmodels)
CrossTable(credit_test$default,credit_pred,prop.chisq = F,prop.c = F,prop.r = F,
           dnn=c('actual default','predicted default')) 
#构造列联表来比较模型在测试集上的预测结果与实际结果
#dnn参数指定列联表行名和列名
#               | predicted default 
#actual default |        no |       yes | Row Total | 
#---------------|-----------|-----------|-----------|
#            no |        72 |        10 |        82 | 
#               |     0.720 |     0.100 |           | 
#---------------|-----------|-----------|-----------|
#           yes |        12 |         6 |        18 | 
#               |     0.120 |     0.060 |           | 
#---------------|-----------|-----------|-----------|
#  Column Total |        84 |        16 |       100 | 
#---------------|-----------|-----------|-----------|

提高模型性能:

由以上混淆矩阵可见,虽然总体准确率为78%,但将违约客户误分为不会违约的客户显然是严重的错误。在假阳性与假阴性错误代价不等的情况下,可以将不同的惩罚因子分配到不同的错误上,从而生成代价矩阵:

#为不同的错误分配惩罚因子:
matrix_dimensions<-list(c("no","yes"),c("no","yes"))
names(matrix_dimensions)<-c("predicted","autual")
matrix_dimensions
#因为预测值和实际值都有两个可能取值,所以要描述一个2*2矩阵
#使用由两个向量组成的列表并为每个向量分别命名
error_cost<-matrix(c(0,1,4,0),nrow=2,dimnames = matrix_dimensions)
#该矩阵表明假阴性错误的代价是假阳性错误的4倍
error_cost
#代价矩阵结果为:
#         autual
#predicted no yes
#      no   0   4
#      yes  1   0
#在C5.0函数后加上costs参数并把代价矩阵传递到其中
credit_cost<-C5.0(credit_train[-17],credit_train$default,costs=error_cost)
credit_cost_pred<-predict(credit_cost,credit_test)
CrossTable(credit_test$default,credit_cost_pred,prop.chisq = F,prop.c = F,prop.r = F,
           dnn=c('actual default','predicted default'))
#               | predicted default 
#actual default |        no |       yes | Row Total | 
#---------------|-----------|-----------|-----------|
#            no |        34 |        48 |        82 | 
#               |     0.340 |     0.480 |           | 
#---------------|-----------|-----------|-----------|
#           yes |         1 |        17 |        18 | 
#               |     0.010 |     0.170 |           | 
#---------------|-----------|-----------|-----------|
#  Column Total |        35 |        65 |       100 | 
#---------------|-----------|-----------|-----------|

由混淆矩阵可见,总体准确率下降,但把违约客户预测为非违约客户的错误也大为减少,这意味着代价矩阵可能要进一步调整。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值