โ‘ฌ ๐Ÿค– Machine Learning 3์ผ์ฐจ - ROC ์™€ AUC

JItzelยท2025๋…„ 12์›” 14์ผ

๐Ÿก Machine_learning

๋ชฉ๋ก ๋ณด๊ธฐ
13/14

ROC Curve์™€ AUC (๋ถ„๋ฅ˜ ์ž„๊ณ„๊ฐ’๊ณผ ์„ฑ๋Šฅ์˜ ๊ด€๊ณ„)

์ •ํ™•๋„, ์ •๋ฐ€๋„, ์žฌํ˜„์œจ... ์ˆซ์ž ํ•˜๋‚˜๋กœ๋งŒ ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜๊ธฐ์—” ๋ถ€์กฑํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.
๋ชจ๋ธ์ด ์–ผ๋งˆ๋‚˜ ์—„๊ฑฑํ•˜๊ฒŒ(Threshold) ํŒ์ •ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ.

1. ROC Curve (Receiver Operating Characteristic Curve)

  • ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๋ถ„๋ฅ˜ ์ž„๊ณ„๊ฐ’(Threshold)์— ๋Œ€ํ•ด ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ์‹œ๊ฐํ™”ํ•œ ๊ทธ๋ž˜ํ”„

X์ถ•๊ณผ Y์ถ•์˜ ์˜๋ฏธ

ROC ๊ณก์„ ์€ "๋งž์ถ˜ ๊ฒƒ(์ด๋“)"๊ณผ "ํ‹€๋ฆฐ ๊ฒƒ(๋น„์šฉ)"์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„(Trade-off)๋ฅผ ๋ณด์—ฌ์ค€๋‹ค

  • Y์ถ•: TPR (True Positive Rate) โ†’\rightarrow ์žฌํ˜„์œจ(Recall)
    ์‹ค์ œ ์–‘์„ฑ(Positive)์ธ ์‚ฌ๋žŒ๋“ค ์ค‘ ๋ชจ๋ธ์ด "์–‘์„ฑ์ž…๋‹ˆ๋‹ค!"๋ผ๊ณ  ๋งž๊ฒŒ ์ฐพ์€ ๋น„์œจ.
    Ex) ์‹ค์ œ ์•” ํ™˜์ž๋ฅผ ์•”์ด๋ผ๊ณ  ์ง„๋‹จํ•œ ๋น„์œจ (๋†’์„์ˆ˜๋ก ์ข‹์Œ)

  • X์ถ•: FPR (False Positive Rate)
    ์‹ค์ œ ์Œ์„ฑ(Negative)์ธ ์‚ฌ๋žŒ๋“ค ์ค‘ ๋ชจ๋ธ์ด "์–‘์„ฑ์ž…๋‹ˆ๋‹ค.."๋ผ๊ณ  ํ‹€๋ฆฌ๊ฒŒ ๊ฒฝ๊ณ ํ•œ ๋น„์œจ.
    Ex) ์ •์ƒ์ธ์„ ์•”์ด๋ผ๊ณ  ์˜ค์ง„ํ•œ ๋น„์œจ (๋‚ฎ์„์ˆ˜๋ก ์ข‹์Œ)

์ข‹์€ ๋ชจ๋ธ์€ ์•” ํ™˜์ž๋Š” ๋‹ค ์ฐพ์œผ๋ฉด์„œ(TPR โ†‘\uparrow), ์ •์ƒ์ธ์—๊ฒŒ๋Š” ์˜ค์ง„์„ ์•ˆ ํ•˜๋Š”(FPR โ†“\downarrow) ๋ชจ๋ธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ขŒ์ƒ๋‹จ(0, 1) ์— ๋ถ™์„์ˆ˜๋ก ์ข‹๋‹ค.

2. ์ž„๊ณ„๊ฐ’(Threshold)์˜ ๋ณ€ํ™”

๋ชจ๋ธ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ํ™•๋ฅ (0.1 ~ 0.9)์„ ๊ณ„์‚ฐํ•˜๊ณ , ํŠน์„ฑ ๊ธฐ์ค€(Threshold, ๋ณดํ†ต 0.5)๋ฅผ ๋„˜์œผ๋ฉด 1, ์•„๋‹ˆ๋ฉด 0์œผ๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค.

  • ์ž„๊ณ„๊ฐ’์„ ๋‚ฎ์ถ”๋ฉด (0.5 โ†’\rightarrow 0.1): "์˜์‹ฌ๋˜๋ฉด ๋ฌด์กฐ๊ฑด ์•”์ด๋ผ๊ณ  ํ•ด!"
    ์•” ํ™˜์ž๋ฅผ ๊ฑฐ์˜ ๋‹ค ์ฐพ์•„๋ƒ„. (TPR ์ฆ๊ฐ€ ๐Ÿ‘)
    ํ•˜์ง€๋งŒ ๋ฉ€์ฉกํ•œ ์‚ฌ๋žŒ๋„ ์•”์ด๋ผ๊ณ  ์˜ค์ง„. (FPR ์ฆ๊ฐ€ ๐Ÿ‘Ž)

  • ์ž„๊ณ„๊ฐ’์„ ๋†’์ด๋ฉด (0.5 โ†’\rightarrow 0.9): "ํ™•์‹คํ•  ๋•Œ๋งŒ ์•”์ด๋ผ๊ณ  ํ•ด!"
    ์˜ค์ง„์ด ๊ฑฐ์˜ ์—†๋‹ค. (FPR ๊ฐ์†Œ ๐Ÿ‘)
    ํ•˜์ง€๋งŒ ์ดˆ๊ธฐ ์•” ํ™˜์ž๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (TPR ๊ฐ์†Œ ๐Ÿ‘Ž)

โ†’\rightarrow ROC Curve๋Š” ์ด ๋ชจ๋“  ์ž„๊ณ„๊ฐ’์—์„œ์˜ ์ ๋“ค์„ ์ด์€ ์„ .

3. AUC (Area Under the Curve)

  • ROC ๊ณก์„  ์•„๋ž˜์˜ ๋ฉด์ 
    โ†’\rightarrow ๊ณก์„ ๋งŒ์œผ๋กœ๋Š” ์–ด๋–ค ๋ชจ๋ธ์ด ๋” ์ข‹์€์ง€ ์ˆซ์ž๋กœ ๋น„๊ตํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ

AUC = 1.0: ์™„๋ฒฝํ•œ ๋ชจ๋ธ (FPR=0์ผ ๋•Œ TPR=1)
AUC = 0.5: ์™„์ „ ๋žœ๋ค ๋ชจ๋ธ (๋™์ „ ๋˜์ง€๊ธฐ ์ˆ˜์ค€, ๊ทธ๋ž˜ํ”„์˜ ๋Œ€๊ฐ์„ )
ํ•ด์„: ์ผ๋ฐ˜์ ์œผ๋กœ 0.8 ์ด์ƒ์ด๋ฉด ํ›Œ๋ฅญํ•œ ๋ชจ๋ธ๋กœ ํ‰๊ฐ€.

ROC Curve ๊ทธ๋ฆฌ๊ธฐ

Scikit-learn์˜ roc_curve์™€ auc ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ.
์ฃผ์˜ํ•  ์ : roc_curve ํ•จ์ˆ˜์—๋Š” ์ตœ์ข… ์˜ˆ์ธก๊ฐ’(0, 1)์ด ์•„๋‹ˆ๋ผ ์˜ˆ์ธก ํ™•๋ฅ (predict_proba)์„ ๋„ฃ์–ด์•ผ ๋งค๋„๋Ÿฌ์šด ๊ณก์„ ์ด ๊ทธ๋ ค์ง„๋‹ค.

1) ๋ฐ์ดํ„ฐ ์ค€๋น„ ๋ฐ ํ•™์Šต

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc

# ๋ฐ์ดํ„ฐ ๋กœ๋“œ (Pima Indians Diabetes ์˜ˆ์ œ ๊ฐ€์ •)
df = pd.read_csv('data/pima-indians-diabetes.data.csv')
x_data = df.iloc[:, :-1].values
y_data = df.iloc[:, -1].values

# ๋ฐ์ดํ„ฐ ๋ถ„ํ• 
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.3, stratify=y_data, random_state=42)

# ๋ชจ๋ธ ํ•™์Šต
model = LogisticRegression(max_iter=500)
model.fit(x_train, y_train)

2) ํ™•๋ฅ ๊ฐ’ ์˜ˆ์ธก ๋ฐ ROC ๊ณ„์‚ฐ

# ์ค‘์š”: predict()๊ฐ€ ์•„๋‹ˆ๋ผ predict_proba()๋ฅผ ์‚ฌ์šฉ!
# [:, 1]์€ ๋ ˆ์ด๋ธ”์ด 1(์–‘์„ฑ)์ผ ํ™•๋ฅ ๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค๋Š” ๋œป
pred_proba = model.predict_proba(x_test)[:, 1]

# roc_curve(์‹ค์ œ๊ฐ’, ์˜ˆ์ธกํ™•๋ฅ ๊ฐ’)
# ๋ฐ˜ํ™˜๊ฐ’: fpr, tpr, ์ž„๊ณ„๊ฐ’๋“ค
fpr, tpr, thresholds = roc_curve(y_test, pred_proba)

# AUC ๊ณ„์‚ฐ
auc_val = auc(fpr, tpr)
print(f"AUC Score: {auc_val:.4f}")

# AUC Score: 0.8375

3) ์‹œ๊ฐํ™” (Plotting)

plt.figure(figsize=(6, 6))

# ROC Curve ๊ทธ๋ฆฌ๊ธฐ
plt.plot(fpr, tpr, color='blue', lw=2, label=f'ROC curve (AUC = {auc_val:.2f})')

# ๊ธฐ์ค€์„  ๊ทธ๋ฆฌ๊ธฐ (Random Classifier, AUC=0.5)
plt.plot([0, 1], [0, 1], color='gray', linestyle='--', label='Random')

plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate (FPR)')
plt.ylabel('True Positive Rate (TPR)')
plt.title('Receiver Operating Characteristic (ROC)')
plt.legend(loc="lower right")
plt.grid(True)
plt.show()


์š”์•ฝ

  • ROC Curve: ๋ชจ๋ธ์˜ ์ž„๊ณ„๊ฐ’(Threshold)์„ ์กฐ์ ˆํ•  ๋•Œ TPR(์žฌํ˜„์œจ)๊ณผ FPR(์˜คํƒ๋ฅ )์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค.
  • ์ด์ƒ์ ์ธ ํ˜•ํƒœ: ๊ทธ๋ž˜ํ”„๊ฐ€ ์™ผ์ชฝ ์œ„(0, 1)์— ๋ถ™์„์ˆ˜๋ก ์ข‹์€ ๋ชจ๋ธ์ด๋‹ค. (๋งŽ์ด ๋งž์ถ”๊ณ , ์˜ค์ง„์€ ์ ๊ณ )
  • AUC: ๊ณก์„  ์•„๋ž˜ ๋ฉด์ ๊ฐ’. 1์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๋‹ค๋Š” ๋œป์ด๋‹ค. (0.5๋Š” ์ฐ๊ธฐ ์ˆ˜์ค€)
  • Tip: ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” predict() ๋Œ€์‹  predict_proba()์˜ ์–‘์„ฑ ํ™•๋ฅ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ์ •ํ™•ํ•œ ๊ณก์„ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
profile
์†Œ๊ธˆ์— ์ ˆ์ธ ์ƒ์„ , ๋ชธ์„ ๋’ค์ฒ™์ด๋‹ค ๐ŸŸ

0๊ฐœ์˜ ๋Œ“๊ธ€