프로그래밍

[R] Confusion Matrix를 통한 분류 모델 성능 평가

RainIron 2021. 6. 5. 15:48
반응형

1. 컨퓨전 매트릭스의 개념

1) 컨퓨전 매트릭스(Confusion Matrix, 혼동 행렬)

- 머신러닝 혹은 통계학적 방법이 사용된 분류 모델에서, 알고리즘의 성능을 보기 쉽게 시각화하는 테이블 형태의 레이아웃

- 타당성 검증: 모델을 만들 때 모델이 얼마나 정확한 결과를 계산하는지 객관적으로 측정하는 것

 

2) ROC 곡선(Receiver Operating Characteristic curve)

- 특정 진단 방법의 민감도와 특이도가 어떤 관계를 갖고 있는지를 표현한 그래프

- 데이터의 정답 결과 세트를 제작 -> 데이터의 식별 결과 세트 제작 -> 2*2 컨퓨전 매트릭스 제작

 

3) 컨퓨전 매트릭스 형태

컴퓨전 매트릭스
(Confusion Matrix)
실제(True Condition)
Positive Negative
예측(Predicted) Positive(1) True Positive
(민감도)
False Positive
Negative(0) False Negative True Negative
(특이도)

* True: 실제와 예측이 일치하는 경우

* False: 실제와 예측이 일치하지 않는 경우

 

- 예: 진단검사의학, 예방의학에서 사용되는 표

- 민감도: 어떤 진단법을 사용했을 때 실제로 이에 해당하는 사람들을 얼마나 잘 찾아내는가 하는 기준

- 특이도: 어떤 진단법을 사용했을 때 실제로 이에 해당되지 않는 사람들을 얼마나 잘 분류하는가 하는 기준

 

4) 주요 성능 지표

용어 산출식 설명
Accuracy (TP+TN)/(TP+TN+FP+FN) 탐지율, 정확도
(맞게 검출한 비율)
실제 악성/정상인지 맞게 에측한 비율
Precision Tp/(TP+FP) 정밀도
(P로 검출한 것 중 실제 P의 비율)
악성으로 예측한 것 중 실제 악성인 샘플의 비율
Recall TP/(TP+FN) 재현율
(실제 P를 P로 예측한 비율)
실제 악성 샘플 중 악성으로 예측한 비율
False Alarm
(Fall-out)
FP/(FP+TN) 오검출율
(실제 N을 P로 예측한 비율)
실제 정상 샘플을 악성으로 예측한 비율
용어 산출식 설명
TPR
(True Positive Rate)
= Recall
TP/(TP+FN) 예측과 실제 모두 P 실제 악성 샘플을 악성으로 예측한 비율
TNR
(True Negative Rate)
TN/(TN+FP) 예측과 실제 모두 N 실제 정상 샘플을 정상으로 에측한 비율
FPR
(False Positive Rate)
= False Alarm
FP/(FP+TN) 실제 N인데 P로 검출 실제 정상 샘플을 악성으로 예측한 비율
FNR
(False Negative Rate)
FN/(TP+FN) 실제 P인데 N으로 검출 실제 악성 샘플을 정상으로 예측한 비율

- 민감도: 1인 케이스에 대해 1이라고 예측한 것

- 특이도: 0인 케이스에 대해 0이라고 예측한 것

- 정확도(Accuracy): 전체 중에서 올바르게 예측한 정도, TP(True Positive)와 TN(True Negative)을 더하여, 전체의 합계로 나눈 값

- 정밀도(Precision): 예측한 데이터가 실제와 얼마나 적합한지를 표현한 비율, 양성인 것으로 예측된 샘플에서, 실제로 양성인 샘플의 비율, 적합율

- 민감도: 실제 양성의 수에서 예측 양성이 어느 정도 적합했는가를 보는 비율, 실제 양성인 샘플에서 양성이라고 판정된 샘플의 비율(검출률(Recall), 감도(Sensitivity), 히트율(Hit Rate), 재현률 등)

- 특이도: 실제에는 음성인 샘플에서, 음성인 것으로 판정된 샘플의 비율

- 위음성율(False Negative Rate): 실제로는 양성인 샘플에서, 음성으로 판정된 샘플의 비율

- 위양성률(False Positive Rate): 실제에는 음성인 샘플에서, 양성으로 판정된 샘플의 비율

 

2. 컨퓨전 매트릭스의 이용

* (예시) 스팸 메일 여부 분류 모델 컨퓨전 매트릭스

  메일이 왔을 때, 스팸 메일인지 아닌지를 분류하는 모델에서 스팸 메일인 경우는 1로 일반 메일은 0으로 표현했을 때, 상태에 따른 예측값과 실제값 구하기

데이터 실제값 예측값 상태
A ? <- ( 1 ) 0 FN
B 0 ? <- ( 1 ) FP
C ? <- ( 0 ) ? <- ( 0 ) TN
D ? <- ( 0 ) FN
E ? <-( 1 ) 1 TP
F 0 1 ? <- (FP)

 

* 진단의 정확도는 ROC curve 아래의 면적(AUC: Area Under the ROC Curve)에 의해 측정됨

  - 면적이 1인 경우: 완벽한 진단 검사

  - 면적이 0.5인 경우: 쓸모 없는 검사

 

3. R을 이용한 컨퓨전 매트릭스 분류 모델 성능 평가

# R제공 데이터 iris 이용, iris 데이터 10개 추출
head(iris, 10)

# iris 데이터 특성치 확인
summary(iris)

* Import

# 분류와 컨퓨전 매트릭스 수행
install.packages('party')
install.packages('caret')
install.packages('e1071')

library(party) # 의사결정나무 시행
library(caret) # 교차분석 패키지
library(e1071) # 컨퓨전 매트릭스 패키지

 

* data 구분

# sample data
sp = sample(2, nrow(iris), replace = TRUE, prob=c(0.7, 0.3))

# 70%, 30% 학습 데이터와 테스트 데이터 set 생성
trainData = iris[sp==1, ]
testData = iris[sp==2, ]

 

* 분류 알고리즘 생성

# 크기와 종에 따른 분류 알고리즘 생성
myFomula = Species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width

# 알고리즘을 이용한 학습 데이터 셋 ctree(분류나무) 생성
iris_ctree = ctree(myFomula, data = trainData)
iris_ctree

 

* 컨퓨전 매트릭스 생성

# 예측 정도와 학습 데이터 셋의 컨퓨전 매트릭스 생성
table(predict(iris_ctree), trainData$Species)

# 컨퓨전 매트릭스 함수를 이용한 혼동행렬 생성
confusionMatrix(predict(iris_ctree), trainData$Species)

# ctree 도표 생성
plot(iris_ctree)

* Test Data 적용

# 테스트셋 데이터 예측분류 모델
testPred = predict(iris_ctree, newdata = testData)

# 테스트셋 분류 데이터 컨퓨전 매트릭스
table(testPred, testData$Species)

# 컨퓨전 매트릭스 생성 함수 이용
confusionMatrix(testPred, testData$Species)

 

반응형