[ADP] R을 활용한 모형평가 방법(2) - Confusion matrix, ROC Curve, Gain chart

2020. 8. 2. 19:49ADP | ADsP with R/Knowledge

 

https://todayisbetterthanyesterday.tistory.com/5

 

헷갈리는 통계기본 - 정확도, 정밀도, 재현율, 특이도, G-mean, F1 measure, ROC curve&AUC, Gain Chart & Lift cur

추출한 훈련용 자료를 사용하여 분류 모형을 적합후 검증용 데이터를 사용하여 정확도를 평가할 때, 범주형 변수에 대해 사용되는 confusion matrix, ROC curve, gain chart, lift curve에 대해서 알아보자. 모

todayisbetterthanyesterday.tistory.com

 위의 링크에 Confusion matrix에 관한 주요 지표들의 정의와 ROC curve, Gain chart&Lift chart의 설명이 모두 포함되어 있다. 개념에 대한 학습은 위의 링크를 통해서 하길 바란다. 

 아래서는 R을 활용하여 진행하는 간단한 실습 과정을 서술할 것이다. 

1. Confusion matrix

 iris 자료에 대해서 범주가 2개인 분류모형을 구축하기 위해서 Species를 setosa와 versicolor로 한정하여 100개의 자료만 이용한다. 그리고 train/test를 70:30으로 나눈다.

# 두 변수만 추출하여 저장
iris <- subset(iris,Species == "setosa"| Species == "versicolor")
iris$Species <- factor(iris$Species)

# 데이터 섞기
set.seed(1234)
iris <- iris[sample(nrow(iris)),]  # Random suffle

# 데이터 분리
trainData <- iris[1:(nrow(iris)*0.7),]
testData <- iris[((nrow(iris)*0.7)+1):nrow(iris),]
nrow(trainData)

 신경망 모형과 의사결정나무모델 두 가지 모델을 통하여 오분류표를 확인해보겠다. 

# Neural Network model
library(nnet)
nn.iris <- nnet(Species~., data=trainData, size=2, rang=0.1, decay=5e-4,maxit=200)

# Decision Tree
library(rpart)
dt.iris <- rpart(Species~., data=trainData)

# test데이터 적용 예측값 도출
nn_pred <- predict(nn.iris, testData, type = "class")
nn_pred <- as.factor(nn.iris)
dt_pred <- predict(dt.iris, testData, type = "class")

# confusion matrix
library(caret)
nn_con = confusionMatrix(nn_pred,testData$Species)
dt_con = confusionMatrix(dt_pred,testData$Species)

nn_con$table
dt_con$table

 nn_pred를 바로 confusion matrix에 대입하면 " 에러: `data` and `reference` should be factors with the same levels."이라는 문구와 함께 error가 발생한다. 그렇기에 as.factor()를 통해 factor로 형변환을 해주었다. 

 그렇게 한 confusion matrix의 결과는 위와 같다.

 

# 정분류율
accuracy <- c(nn_con$overall['Accuracy'], dt_con$overall['Accuracy'])
# 정확도
precision <- c(nn_con$byClass['Pos Pred Value'], dt_con$byClass['Pos Pred Value'])
# 재현율
recall <- c(nn_con$byClass['Sensitivity'], dt_con$byClass['Sensitivity'])
# f1 score
f1 <- 2*((precision*recall)) / (precision + recall)

# summary
result <- data.frame(rbind(accuracy,precision,recall,f1))
names(result) <- c("Neural Network", "Decision Tree")
result

 confusion matrix에서 구해낸 정분류율, 정확도, 재현율, f1 score은 위와 같다. 두 모델 모두 데이터 분류예측을 다 맞췄기 때문에 모든 지표가 1로 출력되었다.

2. ROC curve

 infert 자료에 대한 분류 분석 모형 평가를 비교하기 위해서 의사결정 나무 모형은 C50패키지의 C5.0()함수를 사용하고, 신경망 모형은 neuralnet패키지의 neuralnet()함수를 사용할 것이다. 모형 학습을 위해 70%의 train과 30%의 test를 구분할 것이다.

set.seed(1234)
infert <- infer[sample(nrow(infert)),] # random suffle 
infert <- infert[,c("age","parity","induced","spontaneous","case")]
trainData <- infert[1:(nrow(infert)*0.7),]
testData <- infert[((nrow(infert)*0.7)+1):nrow(infert),]

 

 ROC curve 또한 Neural Network와 Decision Tree 모형 두 가지를 모두 사용하여 확인하고자 한다. 

## 없는 packages는 install.packages("패키지명")을 통해 설치
# neural network

library(neuralnet)
net.infert <- neuralnet(case~age+parity+induced+spontaneous, data=trainData,hidden=3,
                        err.fct="ce",linear.output = FALSE,likelihood=TRUE)
n_test <- subset(testData,select=-case)
nn_pred<-compute(net.infert, n_test)
testData$net_pred <- nn_pred$net.result
head(testData)

# Decision Tree

library(C50)
trainData$case <- factor(trainData$case)
dt.infert <- C5.0(case~age+parity+induced+spontaneous, data=trainData)
testData$dt_pred <-predict(dt.infert, testData, type="prob")[,2]
head(testData)

 

# ROC curve packages
install.packages("Epi")
library(Epi)

# Neural Network ROC
neural_ROC <- ROC(form=case~net_pred, data=testData, plot="ROC")

# Decision Tree ROC
dtree_ROC <- ROC(form=case~dt_pred, data=testData, plot="ROC")

 위의 신경망모형과 의사결정나무의 AUC(Area under the curve)를 확인해보면, Neural Network 모형이 0.794로 Decision Tree의 0.759보다 높은 것을 확인할 수 있다. 그렇기에 NN모형의 분류 성능이 더 좋다고 판단할 수 있다. 

 

3. ROCR - ROC & Lift Chart

여기서는 앞의 infert 데이터에서 사용한 net_pred와 dt_pred를 다시 활용할 것이다. ROCR 패키지를 활용하여 ROC curve와 lift curve를 생성할 것이고, ROC curve는 performance()함수를 사용하여 신경망 모델과 의사결정나무 모델 두 모델을 동시에 나타내 비교할 것이다.

# ROCR packages
install.packages("ROCR")
library(ROCR)

# ROC curve 비교
n_r <- prediction(testData$net_pred, testData$case)
d_r <- prediction(testData$dt_pred, testData$case)
n_p <- performance(n_r, "tpr", "fpr")
d_p <- performance(d_r, "tpr", "fpr")
plot(n_p,col="red")
par(new=TRUE)
plot(d_p, col="blue")
abline(a=0,b=1)

 

 위에서 보면 파란색 선은 DecisionTree의 ROC curve이고 빨간 선은 Neural Network의 ROC curve이다. 이제 ROCR 패키지를 활용하여 신경망 모형의 향상도 곡선(Lift curve)를 확인해보자. 

 

# Lift curve 
n_lift <- performance(n_r, "lift","rpp")
plot(n_lift, col ="red")
abline(v=0.2)

 위의 결과를 볼 때, 상위 20% 집단에 대해서 랜덤 모델과 비교할때 약 2배의 성과 향상을 보이는 것을 확인할 수 있다.