Learning & Reasoning/R

random forest

이현봉 2013. 1. 28. 23:30

random forest를 이용한 연습

참고 :

http://stat-www.berkeley.edu/users/breiman/RandomForests/

http://cran.r-project.org/web/packages/randomForest/randomForest.pdf

http://en.wikipedia.org/wiki/Random_forest

--------------------------------------------------------------------------------------------------

우선 random forest를 담을 environment 만듬

> weatherRF <- new.env()

> evalq({
+ data <- na.omit(weather)                  # weather dataset 중에 NA가 있는 observation/row 들을 제외시킴
+ nobs <- nrow(data)          
+ form <- formula(RainTomorrow ~ .)
+ target <- all.vars(form)[1]
+ vars <- -grep('^(Date|Location|RISK_)', names(data))
+ set.seed(42)
+ train <- sample(nobs, 0.7*nobs)        # 1부터 nobs 숫자 사이에서 임의로 70% 숫자를 train으로 샘플링         
+ validate = sample(setdiff(seq_len(nobs), train), 0.15*nobs)   # train에 속하지 않은 것 중에서 0.15*nobs 을 validate으로
+ test <- setdiff(setdiff(seq_len(nobs), train), validate)   # train과 validate에 속하지 않은 나머지를 test dataset으로 포함.
+ }, weatherRF)


> ls(weatherRF)
[1] "data"     "form"     "nobs"     "target"   "test"     "train"    "validate" "vars"   
> dim(weatherRF$data)
[1] 328  24

> length(weatherRF$train)              # 229개의 observation이 train dataset으로
[1] 229
> length(weatherRF$validate)         # 49개의 observation이 validate dataset으로
[1] 49
> length(weatherRF$test)               # 50개의 observation이 test dataset으로
[1] 50

> library(randomForest)

> evalq({
+ modelRF <- randomForest(formula=form,
+ data=data[train, vars],
+ ntree=500, mtry=4,      // 500개의 tree를 만들고, tree의 각 노드에서 4개의 variable만을 임의로 고려해서 그 중 하나 씀.
+ importance=TRUE,
+ localImp=TRUE,
+ na.action=na.roughfix,
+ replace=FALSE)
+ }, weatherRF)

> class(weatherRF$modelRF)
[1] "randomForest.formula" "randomForest"

> weatherRF$modelRF

Call:
 randomForest(formula = form, data = data[train, vars], ntree = 500,      mtry = 4, importance = TRUE, localImp = TRUE, replace = FALSE,      na.action = na.roughfix)
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 4

        OOB estimate of  error rate: 12.66%     //  (6 + 23) / 229 = 0.1266
Confusion matrix:
     No Yes class.error
No  183   6  0.03174603     //  실제 관측 중 189 건이 No 이었는데, 모델이 6개를 예측 오류.  오류 확률이 6/189
Yes  23  17  0.57500000    //  실제 관측에서 40 건이 Yes 이었는데, 모델이 23개를 예측 오류 (false negative). 

즉, 모델은 train set 에서 개별 decision tree를 만들 때 사용하지 않은 Out of Bag 샘플을 이용해 예측한 에러율이 12.66% 정도 될 것이라 예측.  test set 이나 deploy 한 후 실제 얼마나 비슷할 지는 그 때 보아야 함.

- false negative : 실제로는 비가 다음날 왔는데 (Yes), 모델은 비가 오지 않을 것이라 예측 (No) .  에러율 : 0.575.   false negative 가능성이 상당히 높음.

- false positive :  실제로는 다음날 비가 오지 않았는데 (No) 모델은 비가 올 것이라 예측( Yes).  0.031

random Forest를 만들 때 어떤 variable들이 중요했는지 중요 순서대로 나열;

> impRank <- weatherRF$modelRF$importance   // modelRF의 importance 변수에 정보가 있음.
> impRank[order(impRank[,3], decreasing=TRUE),]   // 3번째 variable인 MeanDecreaseAccuracy 를 기준으로 정렬


위를 보면 Sunshine, Pressure3pm, Humidity3pm이 다른 변수보다 중요한 것을 알 수 있음.

모델이 observation들에 대해 어떻게 판단을 할 까 몇개를 보면;

> head(weatherRF$modelRF$predicted)
336 342   94 304 227  173                # 6개 모든 observation에 대해 No 라고 함
 No  No  No  No  No  No
Levels: No Yes
head(weatherRF$modelRF$predicted)

> head(weatherRF$modelRF$votes)    # random forest의 개별 tree들의 voting 결과. 
                   No            Yes
336     0.9591837  0.040816327
342     0.9943503  0.005649718
94      0.8415301   0.158469945
304     0.8308458  0.169154229            // 모델은 No라고 하지만, 그래도 17%는 비가 올 것이라 했음.
227     0.9946809  0.005319149            // 거의 확실히 비가 올 것 같지 않음. 
173     1.0000000  0.000000000            // 단 하나의 tree도 Yes 한 녀석이 없네. 

간단하게 이 모델 (weatherRF$modelRF)을 test set에 적용 시 어떻게 될까 보려면;

> predict(weatherRF$modelRF, weather[weatherRF$test , ])


Confusion Matrix를 만들어 test dataset에 대한 random forest의 performance를 보면;

> cm = table(Observation = weather[weatherRF$test , "RainTomorrow"], Prediction = weatherRFModel.prediction)
> cm
                   Prediction
Observation     No Yes
        No          36     2                # classfication error ; 0.0526
        Yes          5     5                # classfication error ; 0.5

** 참고로 앞의 training set 에서의 성능은 ;

Confusion matrix:
     No Yes class.error
No  183   6  0.03174603     //  실제 관측 중 189 건이 No 이었는데, 모델이 6개를 예측 오류.  오류 확률이 6/189
Yes  23  17  0.57500000


'Learning & Reasoning > R ' 카테고리의 다른 글

vector라 불리는 R 자료구조  (0) 2013.02.06
AdaBoost  (0) 2013.02.01
rpart 패키지를 이용해 decision tree 만들기  (0) 2013.01.25
R 데이터 cleaning  (0) 2013.01.21
연습할 데이터 만들기  (0) 2013.01.19