더북(TheBook)

설명을 위해 다음과 같이 예측값과 실제 분류가 주어졌다고 가정해보자. probs는 분류 알고리즘이 예측한 점수고, labels는 실제 분류true class가 저장된 벡터다. labels 내의 ifelse는 약간의 분류 실패를 시뮬레이션해본 것이다. set.seed( )는 난수 생성기의 시드seed를 지정하기 위해 사용했다. 난수 생성기가 생성하는 난수는 시드에 의해 좌우되므로 예제 코드와 같은 시드를 지정하면 독자들도 이 책에서 보인 것과 동일한 결과를 얻을 수 있다.

> set.seed(137)
> probs <- runif(100)
> labels <- as.factor(ifelse(probs > .5 & runif(100) < .4, "A", "B"))

ROCR을 사용하기 위해 prediction 객체를 만든다.

> install.packages("ROCR")
> library(ROCR)
> pred <- prediction(probs, labels)

prediction 객체를 performance( ) 함수에 넘겨 tpr, fpr을 구하고 ROC 커브를 그려보도록 하자.

> plot(performance(pred, "tpr", "fpr"))
그림 9-22 ROCR 패키지를 사용해 그린 ROC 커브
그림 9-22 ROCR 패키지를 사용해 그린 ROC 커브

마찬가지로 acc, cutoff를 인자로 지정하면 cutoff 값(표 9-15에서 설명한 기준값)에 따른 Accuracy의 변화를 볼 수 있다.

> # x.measure의 기본값이 cutoff므로 plot(performance(pred, "acc"))로 해도 결과는 같다.
> plot(performance(pred, "acc", "cutoff"))
그림 9-23 ROCR 패키지를 사용한 Accuracy/Cutoff 그래프
그림 9-23 ROCR 패키지를 사용한 Accuracy/Cutoff 그래프

AUCArea Under the Curve는 auc 인자를 지정하고 y.values를 보면 된다.

> performance(pred, "auc")
An object of class "performance"
Slot "x.name":
[1] "None"

Slot "y.name":
[1] "Area under the ROC curve"

Slot "alpha.name":
[1] "none"

Slot "x.values":
list()

Slot "y.values":
[[1]]
[1] 0.2579867

Slot "alpha.values":
list()

위 코드의 실행 결과 AUC는 0.2579867로 나타났다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.