1 数据
我们以bankloan.sav的数据为例进行演示,根据信用卡用户的行为来判断其是否会违约,如下图所示,其中1代表违约,0代表未违约。
2 读取数据并划分训练集和测试集
> library(haven)
> bankData=read_sav("D:/Desktop/bankloan.sav")
> bankData=data.frame(bankData)[,1:9]
> bankData=na.omit(bankData)
> bankData$违约=as.factor(bankData$违约)
> n=dim(bankData)[1]
> sp=sample(1:n,size=round(n*0.3),replace=FALSE) # 随机抽取30%的数据
> bankData_train=bankData[-sp,] # 70%作为训练集
> bankData_test=bankData[sp,] # 30%作为测试集
3 决策树模型
模型训练:
> library(rpart)
> library(rpart.plot)
> fit_rpart=rpart(违约~.,data=bankData_train)
> prp(fit_rpart,extra=2)
预测:
> pdt=predict(fit_rpart,bankData_test,type='class')
> sum(as.vector(pdt)==bankData_test$违约)/dim(bankData_test)[1]
[1] 0.7380952
> table(as.vector(pdt),bankData_test$违约)
0 1
0 132 37
1 18 23
4 随机森林模型
模型训练:
> install.packages("randomForest")
> library(randomForest)
> fit_randomForest=randomForest(违约~.,data=bankData_train)
> fit_randomForest$importance
MeanDecreaseGini
年龄 18.083278
教育 6.747278
工龄 26.289732
地址 18.003826
收入 20.430166
负债率 38.313224
信用卡负债 32.145909
其他负债 24.080130
> varImpPlot(fit_randomForest)
预测:
> pdt=predict(fit_randomForest,bankData_test,type='class')
> sum(as.vector(pdt)==bankData_test$违约)/dim(bankData_test)[1]
[1] 0.7619048
说明:预测精度为76.19%,比决策树模型略高。
> table(as.vector(pdt),bankData_test$违约)
0 1
0 138 38
1 12 22
说明:对于违约为0的样本,预测对138个,预测错误12个;对于违约为1的样本,预测对22个,预测错误38个。违约为1的样本明显不准确,这是由于训练数据集中违约为0和1的样本不均衡造成的,违约为0的样本更多,所以分类时更倾向于划分到0的类别。