더북(TheBook)

예측 결과가 담긴 predicted 벡터와 이들의 실제 분류가 담긴 actual 벡터를 정의하고 위에서 설명한 메트릭을 계산해보자.

> predicted <- c(1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1)
> actual <- c(1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1)

분할표를 사용해 그림 9-17과 같이 표현한다.

> xtabs( ~ predicted + actual)
         actual
predicted 0 1
        0 3 2
        1 1 6

이 표를 통해서 예측 결과와 실제 결과가 일치하는 경우와 그렇지 않은 경우를 쉽게 알 수 있다. Accuracy는 예측값 중 올바른 값의 비율로 다음과 같이 계산한다.

> sum(predicted == actual) / NROW(actual)
[1] 0.75

이렇게 모든 경우를 하나하나 코드를 작성해 계산할 수도 있겠지만 caret의 confusionMatrix( )를 사용하면 손쉽게 정리된 결과를 얻을 수 있다.

표 9-12 혼동 행렬

caret::confusionMatrix : 혼동 행렬과 관련된 메트릭을 계산한다.

caret::confusionMatrix(
  data,     # 예측값 또는 분할표
  reference # 실제 값
)

다음은 predicted와 actual에 대해 confusionMatrix( )를 호출한 결과다. 분할표뿐만 아니라 다양한 평가 메트릭이 한 번에 계산되는 것을 볼 수 있다.

> library(caret)
> confusionMatrix(predicted, actual)
Confusion Matrix and Statistics

          Reference
Prediction 0 1
         0 3 2
         1 1 6

              Accuracy : 0.75
                95% CI : (0.4281, 0.9451)
   No Information Rate : 0.6667
   P-Value [Acc > NIR] : 0.3931
                 Kappa : 0.4706
Mcnemar's Test P-Value : 1.0000

           Sensitivity : 0.7500
           Specificity : 0.7500
        Pos Pred Value : 0.6000
        Neg Pred Value : 0.8571
            Prevalence : 0.3333
        Detection Rate : 0.2500
  Detection Prevalence : 0.4167

'Positive' Class       : 0

위 결과에서 No Information Rate에 대해서만 추가로 살펴보자. No Information Rate는 가장 많은 값이 발견된 분류의 비율이다. 이 예의 Reference(실제 값)에는 0이 4개, 1이 8개 있었다. 이런 데이터가 주어졌을 때 가장 간단한 분류 알고리즘은 입력이 무엇이든 항상 1을 출력하는 것이다. 데이터에서 분류 1의 비율이 분류 0의 비율보다 높으므로 정확도가 50%는 넘을 것이기 때문이다. 항상 1을 결과로 출력하는 분류 알고리즘의 정확도는 8/(4+8)=0.6667이며 No Information Rate는 바로 이 값에 해당한다.

실제 분류 알고리즘은 피처를 들여다보고 예측을 수행하므로 분류의 비율만 보고 결과를 출력하는 단순한 분류 알고리즘보다 성능이 좋아야 한다. 따라서 0.6667은 모델을 만들었을 때 무조건 넘어야 하는 정확도다.

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