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 |