예측 결과가 담긴 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( )를 사용하면 손쉽게 정리된 결과를 얻을 수 있다.
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은 모델을 만들었을 때 무조건 넘어야 하는 정확도다.