决策树与随机森林模型

Reads: 2050 Edit

1 数据

我们以bankloan.sav的数据为例进行演示,根据信用卡用户的行为来判断其是否会违约,如下图所示,其中1代表违约,0代表未违约。

spss-269

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)

r-90

预测:

> 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)  

r-91

预测:

> 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的类别。



获取案例数据,请关注微信公众号并回复:R_dt9


Comments

Make a comment