본문 바로가기
## 오래된 게시글 (미관리) ##/R

43. 데이터마이닝 - 분류분석 2

by #Glacier 2018. 11. 22.
반응형

안녕하세요 오늘은 데이터마이닝 분류분석의 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)

# 이부분에 대해서는 자세한 예시는 없으므로 이익 도표란 게 있구나. 라고만 짚고 넘어갈께요~


#오늘은 여기까지 알아보겠습니다. 다음엔 인공신경망에 대해 알아보도록 할게요.

반응형