프로그래밍

[R] ROC 곡선 기법을 통한 분류 모델 성능 평가

RainIron 2021. 6. 5. 21:12
반응형

1. ROC 곡선의 개념

1) ROC 곡선

- 정의: 식별 모델의 성능 평가 방법

- 유래: 제 2차 세계대전 때 수신된 레이더 신호에서 적 전투기를 찾으려는 미국의 레이더 연구에서 탄생한 개념으로 글자가 구성되어 수신자 조작 특성을 의미함

- 두 개의 범주를 가지고 있는 분류 모형의 성능을 평가하기 위해 쓰는 그래프

- 민감도(Sensitivity)와 특이도(Specificity)를 알아보는데 주로 사용

 

* 특징

  - 신호감시이론의 한 분야

  - 세계 2차 대전 당시, 레이더가 감지한 신호를 통해 적함/아군함/단순 잡음인지를 판별하는데 사용

  - 레이더를 수신하는 수신기의 특성을 요약하여 보여준다는 점에서 착안하여 이름이 정해짐

  - 1970년 이후, 의료와 금융 등 분류가 필요한 분야에 유용하게 사용

 

2) 민감도(Sensitivity)와 특이도(Specificity)

* 민감도

  - 진양성율(True Positive Rate)

  - 실제 양성의 수에서 예측 양성이 어느 정도 적합했는지를 보는 비율

  - 실제로 양성인 샘플에서 양성이라고 판정된 샘플의 비율

 

* 특이도

  - 진음성율(True Negative Rate)

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

 

  예측값
Positive Negative
실제값 Positive a b
Negative c d

민감도: a / (a + b)

a b
   

특이도: d / (c + d)

   
c d

 

 

 

2. ROC 곡선의 사례와 활용

1) ROC 곡선 활용 및 적합도 판단 기준

* ROC 곡선의 활용

  - 민감도와 특이도를 활용하여 그려짐

  - 분류 모형의 적합도를 알 수 있음

    -> 적합도는 곡선 아래의 면적(AUC: Area Under Curve)으로 판단

    -> 1에 가까울수록 좋은 모형

  - 여러 개의 분류 모형 중 가장 좋은 모형을 선택하는 기준으로 활용됨

    -> 곡선 아래의 면적을 선택 기준으로, 면적이 가장 넓은 모형을 채택하는 것이 바람직함.

 

* 적합도 판단 기준

- 곡선이 Y축(민감도) = 1.0 부분에서 직각으로 꺾이는 형태가 면적이 1에 가까울수록 적합도가 좋다고 판단

- AUC 판단 기준

AUC 판단 기준
0.9 ~ 1 Excellent(A)
0.8 ~ 0.9 Good(B)
0.7 ~ 0.8 Fair(C)
0.6 ~ 0.7 Poor(D)
0.5 ~ 0.6 Fail(F)

- ROC 곡선은 Cut-off Point(곡선의 증가율이 가장 큰 지점, 조사목적을 위하여 데이터가 충분히 얻어졌을 때, 어떤 점에서 추출 과정을 인위적으로 절단하는 지점)를 찾는 데에도 활용이 가능함

 

2) ROC 곡선의 활용 사례

* (예시) 신용등급 분류 모델 성능 평가

신용등급 정상 부도
4등급 이하 22 3
5 ~ 6등급 8 14
7 ~ 8등급 5 28
9등급 이상 4 32
전체 39 77

=> 대출 대상을 5등급 이하의 고객으로 제한할 경우, 전체 정상 고객 중 4등급 이상 고객의 비율

    True Positive = 0.56 (22/39)

같은 방식으로 Cut-Off Point 계산

Cut-Off Point True Positives False Positives
5등급 0.56 0.04
7등급 0.77 0.22
9등급 0.90 0.58

- ROC 곡선이 Y축 꼭지점에 근접할수록 평가모형이 우수함

 

3. R을 이용한 ROC 곡선 기법 이용 분류 모델 성능 평가

* Import

# ROC 곡선 생성 및 분류 모델 형성을 위한 패키지 설치
install.packages('ROSE')
install.packages('DMwR')
library(ROSE) # data
library(DMwR) # 데이터 마이닝을 도와주는 패키지(ex: 결측값 대치)
library(rpart)

 

# R 제공 데이터 hacide 사용(ROSE안에 있는 데이터)
data(hacide)

# 데이터 속성 확인
str(hacide.train)
# 1000개 데이터, 3개의 변수(cls, x1, x2)
# cls: 2개의 factor
# x1, x2: num 변수

# 타겟 변수 분포 확인
table(hacide.train$cls)

# 타겟 변수 분포 비율 확인
prop.table(table(hacide.train$cls)) 

# 의사결정나무 생성 후 정확도 산출(분류모델 생성)
tree = rpart(cls ~., data = hacide.train)
pred.tree = predict(tree, newdata = hacide.test)
accuracy.meas(hacide.test$cls, pred.tree[, 2])

# precision: 정밀도
# recall: 재현율
# F 통계량

 

# ROC 곡선을 통한 분류 모델 정확도 측정
roc.curve(hacide.test$cls, pred.tree[, 2], plotit=T)
# 가로축: 특이도
# 세로축: 민감도
# AUC: 0.6 -> 본 모형의 적합도는 판단 기준에 의해 안 좋음
# -> 그래프 역시 낮은 Y축 cut point를 보이며 그래프를 통한 모형 적합도 역시 낮은 것으로 나타남

 

반응형