안녕하세요 오늘은 데이터마이닝 분류분석의 2번째 파트를 알아보도록 하겠습니다.
오늘은 앙상블, 배깅, 부스팅, 랜덤포레스트 기법에 대해 알아보도록 하겠습니다. ^..^
1. 앙상블
앙상블이란 주어진 자료로부터 여러 개의 예측모형들을 만든 후 예측모형들을 조합하여 하나의 최종 예측모형을 만드는 방법입니다.
: 다중 모델 조합(combining multiple models, classifier combination)
- 배깅 : (bagging : bootstrap aggregating) - Breiman(1996)에 의해 처음으로 앙상블 알고리즘 제안
- 부스팅(boosting) - Adaboost(adaptive boosting)
- 랜덤 포레스트(random forest : 무작위 추출 randomization)
- 스태킹 (stacking : stacked generalization)
1) 학습방법의 불안정성
- 학습자료의 작은 변화에 의해 예측모형이 크게 변하는 경우, 그 학습방법은 불안정하다.
- 가장 안정적인 방법 : 1-nearest neighbor (가장 가까운 자료만 변하지 않으면 예측 모형이 변하지 않음), 선형회귀모형 (최소제곱추정법으로 모형 결정)
- 가장 불안정한 방법 : 의사결정나무
2) 배깅(bagging)
- 배깅(bagging : Bootstrap Aggregating) : 주어진 자료에서 여러 개의 붓스트랩(bootstrap) 자료를 생성하고, 각 붓스트랩 자료에 예측모형을 만든 후 결합하여 최종 예측모형을 만드는 방법
- 붓스트랩 (bootstrap) : 주어진 자료에서 동일한 크기의 표본을 랜덤 복원추출로 뽑은 자료.
- 보팅(voting) : 여러 개의 모형으로부터 산출된 결과를 다수결에 의해서 최종 결과를 선정하는 과정.
- 최적의 의사결정나무를 구축할 때 가장 어려운 부분이 가지치기(Pruning)이지만 배깅에서는 가지치기를 하지 않고 최대로 성장한 의사결정나무들을 활용.
- 훈련자료의 모집단의 분포를 모르기 때문에 실제 문제에서는 평균예측모형을 구할 수 없음
=> 배깅은 훈련자료를 모집단으로 생각하고 평균예측모형을 구한 것과 같아 분사늘 줄이고 예측력을 향상시킬 수 있다.
3) 부스팅(boosting)
- 부스팅(boosting) : 예측력이 약한 모형(weak learner)들을 결합하여 강한 예측모형을 만드는 방법.
- Adaboost(Freund & Schapire가 제안) : 이진분류 문제에서 랜덤 분류기보다 조금 더 좋은 분류기 n개에 각각 가중치를 설정하고 n개의 분류기를 결합하여
최종 분류기를 만드는 방법. (단, 가중치의 합은 1)
- 훈련오차를 빨리 그리고 쉽게 줄일 수 있다.
- 배깅에 비해 많은 경우 예측오차가 향상되어 Adaboost가 성능이 배깅보다 뛰어난 경우가 많다.
4) 랜덤 포레스트(Random Forest)
-Breiman(2001)에 의해 개발된 랜덤 포레스트는 의사결정나무의 특징인 분산이 크다는 점을 고려하여 배깅과 부스팅보다 더 많은 무작위성을 주어 약한 학습기들을
생성한 후 이를 선형 결합하여 최종 학습기를 만드는 방법이다.'
-randomForest패키지는 random input에 따른 forest of tree 를 이용한 분류를 이용한 방법이다.
-랜덤한 forest에는 많은 트리들이 생성된다.
-수천 개의 변수를 통해 변수제거 없이 실행되므로 정확도 측면에서 좋은 성과를 보인다.
-category variable의 value 종류가 32개를 넘을 수 없다.
-이론적 설명이나 최종 결과에 대한 해석이 어렵다는 단점이 있지만 예측력이 매우 높은 것으로 알려져있다. 특히 입력변수가 많은 경우, 배깅과 부스팅과 비슷하거나
좋은 예측력을 보인다.
-randomForest 패키지를 이용하여 iris data를 분석해보자.
(1) 모형만들기
install.packages("randomForest")
library(randomForest)
data(iris)
head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
idx<-sample(2, nrow(iris), replace = TRUE, prob = c(0.7, 0.3))
train.data<-iris[idx==2,]
test.data<-iris[idx==1,]
r.f<-randomForest(Species~., data=train.data, ntree=100, proximity=TRUE)
# randomForest 패키지를 설치합니다.
# idx 변수에 랜덤복원추출을 시행하여, iris의 행들을 2혹은 1로 바꾸어 추출합니다. 확률은 train셋은 0.7, 테스트 셋은 0.3입니다.
# r.f 변수에 종을 종속변수로 하고 모든 변수들을 추가합니다. data는 훈련데이터로 합니다.
(2) 오차율
table(predict(r.f), train.data$Species)
setosa versicolor virginica
setosa 16 0 0
versicolor 0 11 2
virginica 0 1 14
(3) 그래프 1
(4) 그래프 2
varImpPlot(r.f)
(5) test data 예측
pre.rf<-predict(r.f, newdata=test.data)
table(pre.rf, test.data$Species)
pre.rf setosa versicolor virginica
setosa 34 0 0
versicolor 0 35 1
virginica 0 3 33
(6) 그래프3
plot(margin(r.f, test.data$Species))
7. 성과분석
1) 오분류에 대한 추정치
| Condition |
| ||
Positive | Negative | |||
Prediction | Positive | True Positive (TP) = 10 | False Positive (FP=90) | Positive predictive value =TP/(TP+FP) =10/(10+90) =10% |
Negative | False Negative (FN) = 5 | True Negative (TN) = 895 | Negative predictive value =TN/(FN+TN) =895/(5+895) =99.4% | |
| Sensitivity =TP/(TP+FN) =10/(10+5) =67% | Specificity =TN/(FP+TN) =895/(90+895) =90.9% |
|
2) ROCR 패키지로 성과분석
*TPR(True Positive Rate, 민감도) : 1인 케이스에 대한 1로 예측한 비율
*FPR(False Positive Rate, 1-특이도) : 0인 케이스에 대한 1로 잘못 예측한 비율
*AUROC(Area under ROC) : 정확도의 측정 기준.
0.9-1.0 = excellent (A)
0.8-0.9 = good (B)
0.7-0.8 = fair (C)
0.6-0.7 = poor(D)
0.5-0.6 = fail (F)
# 즉 ROC커브를 활용한 모형 평가의사결정나무 분석은
1) 민감도와 1-특이도를 활용하여 모형을 평가한다.
2) AUROC(ROC 커브 밑부분의 넓이)
*AUROC=(AR+1)/2
*즉 밑부분의 넓이가 넓을 수록 좋은 거라고 보시면됩니다. 커브가 좌상단에 붙어있으면 정말 좋겠죠.
#ROCR패키지는 binary classification만 지원 가능
install.packages("rpart")
install.packages("party")
install.packages("ROCR")
library(raprt)
library(party)
library(ROCR)
# 하나의 예시입니다.. 그냥 아 이런식으로 구하는거구나..라고 보기만 하시면...될거같네요..
x<-kyphosis[sample(1:nrow(kyphosis), nrow(kyphosis), replace=F),]
x.train<-kyphosis[1:floor(nrow(x)*0.75),]
x.evaluate<-kyphosis[floor(nrow(x)*0.75):nrow(x),]
x.model<-cforest(Kyphosis~Age+Number+Start, data=x.train)
x.evaluate$prediction<-predict(x.model, newdata=x.evaluate)
x.evaluate$correct<-x.evaluate$prediction == x.evaluate$Kyphosis
print(paste("% of predicted classification correct", mean(x.evaluate$correct)))
x.evaluate$probabilities<- 1-unlist(treeresponse(x.model, newdata=x.evaluate), use.name=F)[seq(1,nrow(x.evaluate)*2,2)]
pred<-prediction(x.evaluate$probabilities, x.evaluate$Kyphosis)
perf<-performance(pred, "tpr", "fpr")
plot(perf, main="ROC curve", colorize=T)
perf<-performance(pred, "lift", "rpp")
plot(perf, main="lift curve", colorize=T)
(3) 이익 도표(Lift Chart)
# 이부분에 대해서는 자세한 예시는 없으므로 이익 도표란 게 있구나. 라고만 짚고 넘어갈께요~
#오늘은 여기까지 알아보겠습니다. 다음엔 인공신경망에 대해 알아보도록 할게요.
'## 오래된 게시글 (미관리) ## > R' 카테고리의 다른 글
45. 데이터마이닝-군집분석 (0) | 2018.11.22 |
---|---|
44. 데이터마이닝-분류분석 3 (0) | 2018.11.22 |
42. 데이터마이닝-분류 분석 (0) | 2018.11.22 |
41. 데이터마이닝 개요 (0) | 2018.11.22 |
40. 다차원척도법 , 주성분분석 (4) | 2018.11.22 |