
๋ถ๋ฅ ๋ชจ๋ธ ํ๊ฐ์ ์ ํ๋ 99%๊ฐ ์ง์ ํ ๋ชจ๋ธ ์ฑ๋ฅ์ด๋ผ๊ณ ํ ์ ์์๊น?
์ ํ์ ์ง๋จ์ด๋ ๋ถ๋ํ ๊ฒ์ถ์ฒ๋ผ ๋ฐ์ดํฐ๊ฐ ๋ถ๊ท ํํ ๊ฒฝ์ฐ, ์ ํ๋ ์ธ์ ์ ๋ฐ๋(Precision), ์ฌํ์จ(Recall), F1-Score๋ฅผ ๋ฐ๋์ ํ์ธํด์ผ ํ๋ค.
| ๊ตฌ๋ถ | ์์ธก: Positive (1) | ์์ธก: Negative (0) |
|---|---|---|
| ์ค์ : Positive (1) | TP (True Positive) : ์ ํ (1์ 1๋ก ์ ๋ง์ถค) | FN (False Negative) : ๋ฏธํ (1์ธ๋ฐ 0์ด๋ผ๊ณ ๋์นจ) |
| ์ค์ : Negative (0) | FP (False Positive) : ์คํ (0์ธ๋ฐ 1์ด๋ผ๊ณ ์๋ชป ์ฐ๊น) | TN (True Negative) : ์ ํ (0์ 0์ผ๋ก ์ ๋ง์ถค) |
4๊ฐ์ง ๊ธฐ๋ณธ ์์
์๊ธ์ (T/F): ๋ง์ท๋? (True/False)
๋ท๊ธ์ (P/N): ๋ญ๋ผ๊ณ ์์ธกํ๋? (Positive/Negative)
์ ์ฒด ๋ฐ์ดํฐ ์ค ๋ง๊ฒ ์์ธกํ ๋น์จ."์์ฑ(1)์ด์ผ!"๋ผ๊ณ ์์ธกํ ๊ฒ ์ค ์ค์ ์์ฑ์ ๋น์จ ์ค์ ์์ฑ(1)์ธ ๋ฐ์ดํฐ ์ค ๋ชจ๋ธ์ด ๋์น์ง ์๊ณ ์ฐพ์ ๋น์จ. (๋ฏผ๊ฐ๋๋ผ๊ณ ๋ ํจ)์ ๋ฐ๋์ ์ฌํ์จ์ด ์ด๋ ํ์ชฝ์ผ๋ก ์น์ฐ์น์ง ์๊ณ ๊ท ํ์ ์ด๋ฃฐ ๋ ๋์ ๊ฐ์ '์ฐ์ ํ๊ท '์ด ์๋๋ผ '์กฐํํ๊ท '์ผ๊น?
์กฐํํ๊ท (Harmonic Mean)์ ์ญ์์ ์ฐ์ ํ๊ท ์ด๋ค.
๋น์จ์ด๋ ์๋์ฒ๋ผ ํธ์ฐจ๊ฐ ํฐ ๊ฐ๋ค์ ํ๊ท ์ ๊ตฌํ ๋ ์ฌ์ฉํ๋ค.
์์ (ํ๊ท ์๋) ๐
๊ฐ ๋ 100km/h, ์ฌ ๋ 0km/h๋ผ๋ฉด?
์ฐ์ ํ๊ท : 50km/h (์ค๊ฐ๊ฐ) ํ์ง๋ง ์ค์ ๋ก๋ ์์ํ ๋ชป ๋์์์ผ๋ฏ๋ก ์๋๋ 0์ด์ด์ผ ํ๋ค.
์กฐํํ๊ท : 0km/h ์์ ๊ฐ์ ๊ฐ์ค์น๋ฅผ ๋์ด ํ๋ํฐ๋ฅผ ํฌ๊ฒ ๋ถ์ฌํ๋ค.
F1-Score์ ํน์ง: ์ ๋ฐ๋์ ์ฌํ์จ ์ค ํ๋๋ผ๋ 0์ ๊ฐ๊น์ฐ๋ฉด ์ ์๊ฐ ํ ๋จ์ด์ง.
๋ฐ๋ผ์ ๋ ์งํ๋ฅผ ๊ณจ๊ณ ๋ฃจ ์ ์ฑ๊ฒจ์ผ ๋์ ์ ์๋ฅผ ๋ฐ์ ์ ์๋ค.
import numpy as np
# ๊ฐ์์ ํผ๋ ํ๋ ฌ ๋ฐ์ดํฐ
TP = 50 # ์ ํ์๋ฅผ ์์ด๋ผ๊ณ ๋ง์ถค
TN = 40 # ์ ์์ ์ ์์ด๋ผ๊ณ ๋ง์ถค
FP = 10 # ์ ์์ ์์ด๋ผ๊ณ ์๋ชป ์์ธก (์คํ)
FN = 5 # ์ ํ์๋ฅผ ์ ์์ด๋ผ๊ณ ๋์นจ (๋ฏธํ, ์ํ!)
total = TP + TN + FP + FN
# 1. ์ ํ๋ (Accuracy)
accuracy = (TP + TN) / total
# 2. ์ ๋ฐ๋ (Precision) : ์์ธก(P) ๋ถ๋ชจ
precision = TP / (TP + FP)
# 3. ์ฌํ์จ (Recall) : ์ค์ (P) ๋ถ๋ชจ
recall = TP / (TP + FN)
# 4. F1-score (์กฐํํ๊ท )
f1 = 2 * (precision * recall) / (precision + recall)
print(f"์ ํ๋ (Accuracy): {accuracy:.3f}") # 0.857
print(f"์ ๋ฐ๋ (Precision): {precision:.3f}") # 0.833
print(f"์ฌํ์จ (Recall): {recall:.3f}") # 0.909
print(f"F1-score: {f1:.3f}") # 0.870

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import pandas as pd
# ๋ฐ์ดํฐ ์ค๋น (๊ฐ์ )
# x_train, x_test, y_train, y_test = train_test_split(...)
# model.fit(x_train, y_train)
# ์์ธก ์ํ
pred = model.predict(x_test) # ํ
์คํธ ๋ฐ์ดํฐ๋ก ์์ธก
# ํ๊ฐ ์งํ ์ถ๋ ฅ
print('์ ํ๋ (Accuracy) : ', accuracy_score(y_test, pred))
print('์ ๋ฐ๋ (Precision): ', precision_score(y_test, pred))
print('์ฌํ์จ (Recall) : ', recall_score(y_test, pred))
print('F1 Score : ', f1_score(y_test, pred))
# ์คํ ๊ฒฐ๊ณผ ์์
# ์ ํ๋ : 0.78125
# ์ ๋ฐ๋ : 0.7358
# ์ฌํ์จ : 0.5820 <-- ์ฌํ์จ์ด ์๋์ ์ผ๋ก ๋ฎ์ (์ค์ ํ์๋ฅผ ๋ง์ด ๋์นจ)
# F1 Score : 0.6500 <-- ์ฌํ์จ ๋๋ฌธ์ F1 ์ ์๋ ๋ฎ์์ง
Confusion Matrix: ๋ชจ๋ธ์ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ์ ํ/์คํ/๋ฏธํ์ผ๋ก ๋๋์ด ๋ถ์ํ๋ค.