logo

ROC 곡선의 AUC 를 이용해 모형 비교하는 법 📂머신러닝

ROC 곡선의 AUC 를 이용해 모형 비교하는 법

요약

ROC 곡선은 기본적으로 사각형 $[0,1]^2$ 을 가득 채울수록 좋고, 곡선의 왼쪽 상단의 꺾이는 점이 $(0,1)$ 에 가까울 수록 좋다.

설명

20190210\_232535.png

위의 두 ROC 곡선이 있다고 한다면 마음 편하게 ‘좋다’라고 할 수 있는 쪽은 오른쪽이다. 이 ‘좋다’는 말이 의미하는 것은 ROC 곡선을 그려내는 모형이 더 낫다는 뜻이다. 당연히 비교되는 두 모형은 같은 트레이닝 데이터에서 얻은 것이고 이 주어진 상황에서 어느 모형이 더 나은지를 비교하는 것이므로 테스트 데이터나 최적의 컷오프와 같은 요소들은 신경쓰지 않는다.

다만 문제는 통계학의 고질적인 문제점이라고 할 수 있는 ‘눈대중’이 개입된다는 것이다.

다음 세 가지 모형으로 그려낸 세 가지 ROC 곡선이 있다고 생각해보자.

20190210\_234007.png 깊게 고민해보지 않아도 적색청색이나 녹색보다 안 좋다는 것을 쉽게 알 수 있다. 그러나 청색녹색 중 하나를 선택해야한다면 문제가 애매해진다.

이를 위해 계산하는 것이 곡선 아래의 면적aUC 이다. 사각형의 넓이는 반드시 $1$ 이므로, AUC는 반드시 $0$ 부터 $1$ 사이의 어떤 값으로 떨어진다. 이것을 사용하면 어떤 모형이 더 좋은지 쉽게 비교할 수 있다.

다행스럽게도 R 에서 이 AUC를 계산하는것은 아주 쉬운 일이다.

실습

(ROC 곡선 그리는 법에 이어서)

cxv.png

prf <- performance(pr, measure = "tpr", x.measure = "fpr")
auc <- performance(pr, measure = "auc")
auc <- auc@y.values[[1]]; auc

위 코드를 실행시키면 다음과 같이 AUC를 구해준다.

20190210\_235303.png AUC를 변수선택기준의 일종으로 본다면 $R^2$ 와 비슷하게 절대적인 수치도 의미 있는 척도다. 다시 말해, 다른 모형과의 비교에만 쓰이는 것이 아니라 그냥 모형의 퍼포먼스 자체를 평가할 때도 참고해봄직하다.

코드

아래는 예제 코드다.

install.packages("car")
install.packages("ResourceSelection")
install.packages("ROCR")
 
library(car)
library(ResourceSelection)
library(ROCR)
 
set.seed(150421)
 
?Chile
str(Chile)
nrow(Chile)
head(Chile); tail(Chile)
 
DATA<-na.omit(Chile)
DATA$vote[DATA
          $vote!='Y']<-'N'
DATA$vote<-factor(DATA$vote)
head(DATA); tail(DATA)
 
DATANUM<-nrow(DATA)
train<-sample(1:DATANUM)<(DATANUM*0.8)
test<-DATA[!train,]; head(test)
train<-DATA[train,]; head(train)
 
out0<-glm(vote~.,family=binomial(),data=train); summary(out0)
p <- predict(out0, newdata=test, type="response"); p
 
pr <- prediction(p, test$vote)
win.graph(5,5); plot(prf, main='ROC')
 
prf <- performance(pr, measure = "tpr", x.measure = "fpr")
auc <- performance(pr, measure = "auc")
auc <- auc@y.values[[1]]; auc