머신 러닝 (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}")

댓글

이 블로그의 인기 게시물

베이스 캠프에서 (1)

베이스 캠프에서 (2)

Database 분석 (4)