Bagging은 Bootstrap aggregating으로 Breiman (1996)에 의해 소개된 방법으로 Tree model을 결합하여 최종 예측 결과를 추정하는 앙상블 기법중 하나이다.
Noise가 심한 데이터의 경우 유용하다.
한 개의 Tree만을 사용하는것보다 분류에서의 성능이 좋다.
예측력이 좋다.
Step1. 표본의 크기가 N개인 자료에서 B개의 bootstrap을 추출하고 각 bootstrap 표본에 대하여 Tree model을 적합한다.
Step2. Step1 에서 도출한 B개의 Tree model들을 결합한다.
Step3. Step2 에서 산출된 값들에서 가장 많이 선택된 클래스나 그 평균값을 이용하여 배정한다.
## ipred package를 이용하여 iris 데이터를 Bagging 분석기법으로 분류해
## 본다.
library(ipred)
## 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, ]
## Bagging 알고리즘을 이용하여 trainData를 분류한다.
iris.ba <- bagging(as.factor(Species) ~ ., data = trainData, nbag = 10, coob = TRUE)
iris.ba
##
## Bagging classification trees with 10 bootstrap replications
##
## Call: bagging.data.frame(formula = as.factor(Species) ~ ., data = trainData,
## nbag = 10, coob = TRUE)
##
## Out-of-bag estimate of misclassification error: 0.0625
## trainData에 대하여 설정한 Bagging을 이용하여 예측한 값을 출력한다.
trainPred <- predict(iris.ba, newdata = trainData, type = "class")
trainPred
## [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] versicolor 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 virginica
## [103] virginica virginica virginica virginica virginica virginica
## [109] virginica virginica virginica virginica
## Levels: setosa versicolor virginica
## 실제 trainData값과 예측값을 비교하는 교차표를 출력한다.
table(trainPred, trainData$Species)
##
## trainPred setosa versicolor virginica
## setosa 40 0 0
## versicolor 0 37 1
## virginica 0 1 33
## testData에 대하여 설정한 Bagging을 이용하여 예측한 값을 출력한다.
testPred <- predict(iris.ba, newdata = testData, type = "class")
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