머신 러닝 (15) 분류 성능 지표
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import koreanize_matplotlib
import seaborn as sns
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import (
confusion_matrix,
accuracy_score,
precision_score,
recall_score,
f1_score,
classification_report
)
import warnings
warnings.filterwarnings('ignore')
pima_columns = ['pregnancies', 'glucose', 'blood_pressure', 'skin_thickness', 'insulin', 'bmi', 'diabetes_pedigree_function', 'age', 'outcome']
pima_data_url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv'
df = pd.read_csv(pima_data_url, names=pima_columns)
# 타겟 변수 확인 (outcome: 0=정상, 1=당뇨병)
print(df['outcome'].value_counts())
# Feature(X)와 Target(y) 분리
X = df.drop('outcome', axis=1)
y = df['outcome']
# 학습용/테스트용 데이터 분할 (8:2)
# stratify=y: 타겟 변수의 클래스 비율을 유지하며 분할
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
print(f"학습 데이터: {X_train.shape}")
print(f"테스트 데이터: {X_test.shape}")
# max_iter=1000: 수렴을 위해 반복 횟수 충분히 설정
model = LogisticRegression(max_iter=1000, random_state=42)
model.fit(X_train, y_train)
# 테스트 데이터 예측
y_pred = model.predict(X_test)
# 혼동 행렬 계산
cm = confusion_matrix(y_test, y_pred)
# 혼동 행렬 값 추출 (TP, TN, FP, FN)
# sklearn의 confusion_matrix는 [[TN, FP], [FN, TP]] 순서로 반환함
tn, fp, fn, tp = cm.ravel()
print(f"True Negative (TN): {tn}")
print(f"False Positive (FP): {fp} (Type I Error)")
print(f"False Negative (FN): {fn} (Type II Error)")
print(f"True Positive (TP): {tp}")
# 혼동 행렬 시각화
plt.figure(figsize=(5, 4))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False,
xticklabels=['Predicted Negative (0)', 'Predicted Positive (1)'],
yticklabels=['Actual Negative (0)', 'Actual Positive (1)'])
plt.title('Confusion Matrix')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.show()
# 정확도 (Accuracy): 전체 중 정확히 예측한 비율
accuracy = accuracy_score(y_test, y_pred)
print(f"정확도 (Accuracy) : {accuracy:.4f}")
# 정밀도 (Precision): TP / (TP + FP)
# 모델이 Positive라고 예측한 것 중 실제 Positive의 비율
precision = precision_score(y_test, y_pred)
print(f"정밀도 (Precision): {precision:.4f}")
# 재현율 (Recall): TP / (TP + FN)
# 실제 Positive인 것 중 모델이 정확히 예측한 비율
recall = recall_score(y_test, y_pred)
print(f"재현율 (Recall) : {recall:.4f}")
# F1-Score: 정밀도와 재현율의 조화 평균
f1 = f1_score(y_test, y_pred)
print(f"F1-Score : {f1:.4f}")
댓글
댓글 쓰기