决策树模型的r实现

来源:互联网 发布:linux vi 进入编辑模式 编辑:程序博客网 时间:2024/05/22 00:40

决策树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_modelsummary(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 | #---------------|-----------|-----------|-----------|

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