最近我們被客戶要求撰寫關于信貸資料的研究報告,包括一些圖形和統計輸出。在本文中,我們使用了邏輯回歸、決策樹和随機森林模型來對信用資料集進行分類預測并比較了它們的性能
資料集是
credit=read.csv("gecredit.csv", header = TRUE, sep = ",")
看起來所有變量都是數字變量,但實際上,大多數都是因子變量,
> str(credit)
'data.frame': 1000 obs. of 21 variables:
$ Creditability : int 1 1 1 1 1 1 1 1 1 1 ...
$ Account.Balance : int 1 1 2 1 1 1 1 1 4 2 ...
$ Duration : int 18 9 12 12 12 10 8 ...
$ Purpose : int 2 0 9 0 0 0 0 0 3 3 ...
讓我們将分類變量轉換為因子變量,
> F=c(1,2,4,5,7,8,9,10,11,12,13,15,16,17,18,19,20)
> for(i in F) credit[,i]=as.factor(credit[,i])
現在讓我們建立比例為1:2 的訓練和測試資料集
> i_test=sample(1:nrow(credit),size=333)
> i_calibration=(1:nrow(credit))[-i_test]
我們可以拟合的第一個模型是對標明協變量的邏輯回歸
> LogisticModel <- glm(Creditability ~ Account.Balance + Payment.Status.of.Previous.Credit + Purpose +
Length.of.current.employment +
Sex...Marital.Status, family=binomia
基于該模型,可以繪制ROC曲線并計算AUC(在新的驗證資料集上)
> AUCLog1=performance(pred, measure = "auc")@y.values[[1]]
> cat("AUC: ",AUCLog1,"\n")
AUC: 0.7340997
一種替代方法是考慮所有解釋變量的邏輯回歸
glm(Creditability ~ .,
+ family=binomial,
+ data = credit[i_calibrat
02
03
04
我們可能在這裡過拟合,可以在ROC曲線上觀察到
> perf <- performance(pred, "tpr", "fpr
> AUCLog2=performance(pred, measure = "auc")@y.values[[1]]
> cat("AUC: ",AUCLog2,"\n")
AUC: 0.7609792
與以前的模型相比,此處略有改善,後者僅考慮了五個解釋變量。
現在考慮回歸樹模型(在所有協變量上)
我們可以使用
> prp(ArbreModel,type=2,extra=1)
模型的ROC曲線為
(pred, "tpr", "fpr")
> plot(perf)
> cat("AUC: ",AUCArbre,"\n")
AUC: 0.7100323
不出所料,與邏輯回歸相比,模型性能較低。一個自然的想法是使用随機森林優化。
> library(randomForest)
> RF <- randomForest(Creditability ~ .,
+ data = credit[i_calibration,])
> fitForet <- predict(RF,
> cat("AUC: ",AUCRF,"\n")
AUC: 0.7682367
在這裡,該模型(略)優于邏輯回歸。實際上,如果我們建立很多訓練/驗證樣本并比較AUC,平均而言,随機森林的表現要比邏輯回歸好,
> AUCfun=function(i){
+ set.seed(i)
+ i_test=sample(1:nrow(credit),size=333)
+ i_calibration=(1:nrow(credit))[-i_test]
+ summary(LogisticModel)
+ fitLog <- predict(LogisticModel,type="response",
+ newdata=credit[i_test,])
+ library(ROCR)
+ pred = prediction( fitLog, credit$Creditability[i_test])
+ RF <- randomForest(Creditability ~ .,
+ data = credit[i_calibration,])
+ pred = prediction( fitForet, credit$Creditability[i_test])
+ return(c(AUCLog2,AUCRF))
+ }
> plot(t(A))