Random Forest

random forest는 Bagging을 이용한 ensemble 기법 중 하나다. 변수의 임의추출을 통해 ensemble의 다양성을 확보한다. 즉 Bootstrap Bagging과 변수 임의추출을 조합한 기법이다. tree개수가 많아 해석보다는 예측에 중점을 둔 기법이며, regression과 classification 모두 가능하다. 본 포스팅에서는 classification을 진행해보도록 한다.



data불러오기

data$y<-as.factor(data$y)
nrow(data)
## [1] 2000
table(is.na(data))
## 
## FALSE 
## 22000
table(data$y)
## 
##    0    1 
##  997 1003

총 2000개의 데이터를 사용한다. 결측치는 없으며, y변수의 개수는 위와 같다.

train data, test data분할

set.seed(99)
nobs=nrow(data)
i=sample(1:nobs,round(nobs*0.5))
train=data[i,]
test=data[-i,]
nrow(train);nrow(test)
## [1] 1000
## [1] 1000

data를 train과 test data로 각 50%의 비율로 분할한다.

모델작성

library(randomForest)
set.seed(99)
rf.model=randomForest(y~.,data=train,ntree=100,mtry=5,importance=T,na.action=na.omit)
  • ntree : 앙상블할 tree 개수
  • mtry : 임의추출할 변수개수 m
    • m값이 너무 작으면, 각 tree간 상관관계가 감소
    • 통상 m=√p(classification), m=p/3(regression)
  • importance=T : importance값 포함
  • na.action=na.omit : NA값 있는 경우 삭제


show(rf.model)
## 
## Call:
##  randomForest(formula = y ~ ., data = train, ntree = 100, mtry = 5,      importance = T, na.action = na.omit) 
##                Type of random forest: classification
##                      Number of trees: 100
## No. of variables tried at each split: 5
## 
##         OOB estimate of  error rate: 40.1%
## Confusion matrix:
##     0   1 class.error
## 0 302 197   0.3947896
## 1 204 297   0.4071856

Out of Bag(OOB)오차 : 40.1%
OOB error rate : Bagging의 Bootstrap 복원추출 시 뽑히지 않은 데이터로 계산한 error rate

importance(rf.model,type=1)
##     MeanDecreaseAccuracy
## x1           -1.56622393
## x2           -0.47137281
## x3            0.33615124
## x4            3.39620188
## x5            0.92841275
## x6            1.35980116
## x7           11.53376356
## x8           -0.89457424
## x9            0.08658349
## x10          -0.11013834
varImpPlot(rf.model)

MDA(Mean Decrease Accuracy) : 관련 변수 값을 다른 값으로 대체했을 때 정확도가 감소하는 정도
X7의 MDA가 가장 높다. 즉 해당 변수가 변수들 중 가장 중요한 변수다.

모델을 이용한 예측

pred.rf.model=predict(rf.model,newdata=test)
head(pred.rf.model,10)
##  1  2  3  5 11 13 14 17 21 22 
##  1  0  1  0  1  1  0  0  0  0 
## Levels: 0 1



tab=table(test$y,pred.rf.model,dnn=c('Actual','Predicted'))
print(tab)
##       Predicted
## Actual   0   1
##      0 320 178
##      1 193 309
1-sum(diag(tab))/sum(tab)
## [1] 0.371
plot(rf.model)

green : ‘1’ class error
black : Overall OOB error
red : ‘0’ class error


각 error는 아래와 같은 방법으로 확인이 가능하다.

head(rf.model$err.rate)
##            OOB         0         1
## [1,] 0.4582210 0.4076087 0.5080214
## [2,] 0.4519868 0.4234528 0.4814815
## [3,] 0.4469496 0.4482759 0.4456233
## [4,] 0.4559524 0.4358354 0.4754098
## [5,] 0.4478114 0.4149660 0.4800000
## [6,] 0.4371643 0.4177489 0.4562900
library(pROC)
prob.rf.model=predict(rf.model,newdata=test,type='prob')
roccurve=roc(test$y~prob.rf.model[,1])
plot(roccurve,col='red',print.auc=T,auc.polygon=T)