决策树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 |
#---------------|-----------|-----------|-----------|
由混淆矩阵可见,总体准确率下降,但把违约客户预测为非违约客户的错误也大为减少,这意味着代价矩阵可能要进一步调整。