RandomForest

RandomForest은 breiman (2001)에 의해 제안된 분석방법으로 Bagging과 유사하지만 최적의 기준 변수를 랜덤하게 선택된 변수들 중에서 찾는다는 차이점이 있다.

1. 특징

1.1. 장점

1.2. 단점

2. 단계

3. 예제

Example - R and Data Mining by Zhao

## randomForest package를 이용하여 iris 데이터를 randomForest 분석기법으로
## 분류해 본다.
library(randomForest)
## iris 데이터에 대하여 알아본다.
data(iris)
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
## iris 데이터를 7:3의 비율로 trainData와 testData로 샘플링한다.
set.seed(1234)
ind <- sample(2, nrow(iris), replace = TRUE, prob = c(0.7, 0.3))
trainData <- iris[ind == 1, ]
testData <- iris[ind == 2, ]
## randomForest 분석결과 100개의 tree가 생성되었고 랜덤하게 두개의 변수를
## 선택하여 가지의 분류기준을 정하였다.  Out-of-bag sample의 오차율과
## 교차표를 확인할 수 있다.
rf <- randomForest(as.factor(Species) ~ ., data = trainData, ntree = 100, proximity = TRUE, 
    importance = TRUE)
print(rf)
## 
## Call:
##  randomForest(formula = as.factor(Species) ~ ., data = trainData,      ntree = 100, proximity = TRUE, importance = TRUE) 
##                Type of random forest: classification
##                      Number of trees: 100
## No. of variables tried at each split: 2
## 
##         OOB estimate of  error rate: 4.46%
## Confusion matrix:
##            setosa versicolor virginica class.error
## setosa         40          0         0     0.00000
## versicolor      0         35         3     0.07895
## virginica       0          2        32     0.05882
## trainData에 대하여 randomForest model을 이용하여 예측한 값을 출력한다.
predict(rf)
##          1          2          3          4          6          7 
##     setosa     setosa     setosa     setosa     setosa     setosa 
##          8          9         10         11         12         13 
##     setosa     setosa     setosa     setosa     setosa     setosa 
##         15         17         18         19         20         21 
##     setosa     setosa     setosa     setosa     setosa     setosa 
##         22         23         24         25         27         30 
##     setosa     setosa     setosa     setosa     setosa     setosa 
##         31         32         33         34         35         37 
##     setosa     setosa     setosa     setosa     setosa     setosa 
##         38         41         42         43         44         45 
##     setosa     setosa     setosa     setosa     setosa     setosa 
##         46         47         48         49         51         52 
##     setosa     setosa     setosa     setosa versicolor versicolor 
##         54         55         56         57         59         62 
## versicolor versicolor versicolor versicolor versicolor versicolor 
##         63         64         65         67         68         69 
## versicolor versicolor versicolor versicolor versicolor versicolor 
##         70         71         73         75         76         77 
## versicolor  virginica versicolor versicolor versicolor versicolor 
##         78         79         80         82         83         84 
##  virginica versicolor versicolor versicolor versicolor  virginica 
##         85         87         88         89         91         93 
## versicolor versicolor versicolor versicolor versicolor versicolor 
##         94         95         96         97         98         99 
## versicolor versicolor versicolor versicolor versicolor versicolor 
##        101        102        103        104        105        106 
##  virginica  virginica  virginica  virginica  virginica  virginica 
##        107        108        109        110        112        114 
## versicolor  virginica  virginica  virginica  virginica  virginica 
##        115        118        119        125        126        127 
##  virginica  virginica  virginica  virginica  virginica  virginica 
##        128        129        130        132        133        134 
##  virginica  virginica  virginica  virginica  virginica versicolor 
##        136        138        139        141        143        144 
##  virginica  virginica  virginica  virginica  virginica  virginica 
##        145        146        148        150 
##  virginica  virginica  virginica  virginica 
## Levels: setosa versicolor virginica
## 실제 trainData값과 예측값을 비교하는 교차표를 출력한다.
table(predict(rf), trainData$Species)
##             
##              setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         35         2
##   virginica       0          3        32
## trainData에 대하여 설정한 randomForest model을 이용하여 testData에
## 적합한 예측값을 출력한다.
irisPred <- predict(rf, newdata = testData)
irisPred
##          5         14         16         26         28         29 
##     setosa     setosa     setosa     setosa     setosa     setosa 
##         36         39         40         50         53         58 
##     setosa     setosa     setosa     setosa versicolor versicolor 
##         60         61         66         72         74         81 
## versicolor versicolor versicolor versicolor versicolor versicolor 
##         86         90         92        100        111        113 
## versicolor versicolor versicolor versicolor  virginica  virginica 
##        116        117        120        121        122        123 
##  virginica  virginica versicolor  virginica  virginica  virginica 
##        124        131        135        137        140        142 
##  virginica  virginica versicolor  virginica  virginica  virginica 
##        147        149 
##  virginica  virginica 
## Levels: setosa versicolor virginica
## 실제 testData값과 예측값을 비교하는 교차표를 출력한다.
table(irisPred, testData$Species)
##             
## irisPred     setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         12         2
##   virginica       0          0        14
## 각 Species의 error값을 plot한다.
plot(rf)

plot of chunk unnamed-chunk-6

## randomForest 분석결과 변수별 중요도를 확인해 본다.
importance(rf)
##              setosa versicolor virginica MeanDecreaseAccuracy
## Sepal.Length  2.849      1.047     3.254                4.186
## Sepal.Width   1.493      1.867     4.003                3.319
## Petal.Length  8.991     11.756    11.710               13.754
## Petal.Width  10.708     13.965    15.985               15.811
##              MeanDecreaseGini
## Sepal.Length            6.744
## Sepal.Width             1.802
## Petal.Length           28.979
## Petal.Width            36.159
## 변수의 중요도를 dot 형식의 plot으로 확인한다.
varImpPlot(rf)

plot of chunk unnamed-chunk-7

## party package를 이용하여 iris 데이터를 randomForest 분석기법으로 분류해
## 본다.
library(party)
## randomForest 분석결과 1000개의 tree가 생성되었고 랜덤하게 3개의 변수를
## 선택하여 가지의 분류기준을 정하였다.
data.controls <- cforest_unbiased(ntree = 1000, mtry = 3)
data.cforest <- cforest(Species ~ ., data = trainData, controls = data.controls)
data.cforest
## 
##   Random Forest using Conditional Inference Trees
## 
## Number of trees:  1000 
## 
## Response:  Species 
## Inputs:  Sepal.Length, Sepal.Width, Petal.Length, Petal.Width 
## Number of observations:  112
## trainData에 대하여 설정한 randomForest model을 이용하여 예측한 값을
## 출력한다.
data.cforest.pred <- predict(data.cforest)
data.cforest.pred
##   [1] setosa     setosa     setosa     setosa     setosa     setosa    
##   [7] setosa     setosa     setosa     setosa     setosa     setosa    
##  [13] setosa     setosa     setosa     setosa     setosa     setosa    
##  [19] setosa     setosa     setosa     setosa     setosa     setosa    
##  [25] setosa     setosa     setosa     setosa     setosa     setosa    
##  [31] setosa     setosa     setosa     setosa     setosa     setosa    
##  [37] setosa     setosa     setosa     setosa     versicolor versicolor
##  [43] versicolor versicolor versicolor versicolor versicolor versicolor
##  [49] versicolor versicolor versicolor versicolor versicolor versicolor
##  [55] versicolor virginica  versicolor versicolor versicolor versicolor
##  [61] virginica  versicolor versicolor versicolor versicolor versicolor
##  [67] versicolor versicolor versicolor versicolor versicolor versicolor
##  [73] versicolor versicolor versicolor versicolor versicolor versicolor
##  [79] virginica  virginica  virginica  virginica  virginica  virginica 
##  [85] versicolor virginica  virginica  virginica  virginica  virginica 
##  [91] virginica  virginica  virginica  virginica  virginica  virginica 
##  [97] virginica  virginica  virginica  virginica  virginica  versicolor
## [103] virginica  virginica  virginica  virginica  virginica  virginica 
## [109] virginica  virginica  virginica  virginica 
## Levels: setosa versicolor virginica
## 실제 trainData값과 예측값을 비교하는 교차표를 출력한다.
table(trainData$Species, data.cforest.pred)
##             data.cforest.pred
##              setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         36         2
##   virginica       0          2        32
## trainData에 대하여 설정한 randomForest model을 이용하여 testData에
## 적합한 예측값을 출력한다.
testPred <- predict(data.cforest, newdata = testData)
testPred
##  [1] setosa     setosa     setosa     setosa     setosa     setosa    
##  [7] setosa     setosa     setosa     setosa     versicolor versicolor
## [13] versicolor versicolor versicolor versicolor versicolor versicolor
## [19] versicolor versicolor versicolor versicolor virginica  virginica 
## [25] virginica  virginica  versicolor virginica  virginica  virginica 
## [31] virginica  virginica  versicolor virginica  virginica  virginica 
## [37] virginica  virginica 
## Levels: setosa versicolor virginica
## 실제 testData값과 예측값을 비교하는 교차표를 출력한다.
table(testPred, testData$Species)
##             
## testPred     setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         12         2
##   virginica       0          0        14