RandomForest은 breiman (2001)에 의해 제안된 분석방법으로 Bagging과 유사하지만 최적의 기준 변수를 랜덤하게 선택된 변수들 중에서 찾는다는 차이점이 있다.
많은 data set을 다룰때 정확한 분류를 한다.
큰 database를 효과적으로 처리한다.
Variable 제거 없이 수천개의 입력 variable을 다룰 수 있다.
Classification에서 variable importance를 추정한다.
Missing value를 효과적으로 다루어 정확도를 유지 한다.
Noisy가 많은경우 과적합 될 수 있다.
해석상의 어려움이 있다.
Step1. training data로부터 표본의 크기가 N인 bootstrap sample을 추출한다.
Step2. bootstrap sample에 대해서 randomForest Tree 모형을 다음의 과정으로 적합한다.
Step3. Tree들의 앙상블 결과를 출력한다.
## 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)
## 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)
## 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