분류 모델의 원리 이해
금융, 헬스케어, 제조업 등 다양한 실제 사례와 평가 방법
실무에 적용
지도학습이란?
정답값(라벨)이 주어진 모델 학습
회귀 : 연속값 예측, 분류 : 범주 예측
분류의 정의
- 데이터가 어느 범주(클래스)에 속하는지 예측.
- 스팸/정상, 양성/음성, 정상/불량 등
- 자주 활용되는 알고리즘 : Logistic Regression, SVM
분류가 자주 쓰이는 이유
- 이진 분류는 직관적이고 다양한 산업에 필요
- 데이터 분석에서 가정 먼저 접하는 모델 중 하나
로지스틱 회귀 (Logistic Regresstion)
✔️ 이름은 회귀지면 모델 자체는 분류 모델임!!
- 선형 회귀처럼 입력값이 선형 결합이지만,
- 결과를 0 과 1 사이의 확률로 변환하기 위해 로지스틱 함수(시그모이드 함수)를 사용
- 기준(그래프상 0.5)을 정해서 그것보다 크면 1, 그것보다 작으면 0 -> 이진분류

: 계산이 빠르고 구현이 간단
: 결과 해석이 용이 -> 회귀 계수로 각 변수의 영향도 해석 가능
but, 복작한 비선형 패턴 학습에는 한계
로지스틱 회귀 코드
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
# 1. 데이터 로드
iris = load_iris()
X = iris.data # 특징(feature) 데이터
y = iris.target # 타깃(target) 데이터
# 2. 데이터 분할 (train : test = 8 : 2)
# ✔️stratify=y : 클래스 비율을 train, test가 유사하게끔 맞춤
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2,
random_state=42,
stratify=y)
# 3. Logistic Regression
logistic_model = LogisticRegression(max_iter=200)
logistic_model.fit(X_train, y_train)
# 4. 예측
y_pred_logistic = logistic_model.predict(X_test)
# 5. 성능 평가
print("=== Logistic Regression ===")
print("Accuracy:", accuracy_score(y_test, y_pred_logistic))
print(classification_report(y_test, y_pred_logistic, target_names=iris.target_names))
* target_names=iris.target_names : 각 클래스의 이름으로 보고서를 보기 쉽게 표시

SVM (Support Vector Machine)
데이터를 가장 잘(안전 여유공간을 크게) 구분하는 경계를 찾는 알고리즘
예. 고양이vs개 를 잘 구분하는 경계를 찾는데
-> 두 부류가 최대한 멀리 떨어지도록 찾는 방식
- 차원이 높은 데이터에서도 좋은 성능을 보일 수 있음 (커널(필터)을 사용할 수 있음)
- 결정 경계를 명확하게 찾는 경우, 예측 성능이 우수
but, 파라미터(C, 커널 정류 등)를 적절히 찾아야 하고, 튜닝 비용이 큼. 대규모 데이터에선 느림

SVM 코드
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report
# 1. 데이터 로드
iris = load_iris()
X = iris.data # 특징(feature) 데이터
y = iris.target # 타깃(target) 데이터
print(X.shape)
print(y.shape)
# 2. 데이터 분할 (train : test = 8 : 2)
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2,
random_state=42,
stratify=y)
# 3. SVM(Support Vector Machine)
# C, gamma 등의 하이퍼파라미터를 설정해서 더 최적화할 수도 있습니다.
svm_model = SVC()
svm_model.fit(X_train, y_train)
# 4. 예측
y_pred_svm = svm_model.predict(X_test)
# 5. 성능 평가
# Accuracy(정확도)와 정밀 평가(classification_report)를 이용해 비교해봅니다.
print("=== SVM ===")
print("Accuracy:", accuracy_score(y_test, y_pred_svm))
print(classification_report(y_test, y_pred_svm, target_names=iris.target_names))

추가 모델들
K-NN (K-최근접 이웃)
: 간단하지만 대규모 데이터에서 계산량이 큼
나이브 베이즈 (Naive Bayes)
: 통계적 가정(독립성)에 기반하므로 계산이 빠름, 스팸 필터 등에서 자주 사용
신경망(MLP) 또는 딥러닝 모델
: 복잡도는 높지만 대규모 데이터에서 강점.
* 신경망 형태

분류 모델의 산업별 적용 사례
금융
1. 사기 거래 탐지 : 거래 패턴이 정상 고객과 다른 이상 패턴을 보이는지
2. 대출 상환 가능성 예측
3. 로지스틱 회귀, 랜덤 포레스트, XGBoost, 딥러닝 등 자주 사용
헬스케어
1. 질병 진단 : 양성/음성 (클래스 불균형이 큼)
2. 임상 데이터(혈액 검사 수치, 환자 진료 기록)와 의료 영상(->딥러닝)을 기반으로 머신러닝 모델 훈련.
3. 로지스틱 회귀, SVM, 최근 딥러닝 활발
마케팅
1. 고객 이탈 예측
2. 캠페인 반응 예측
3. 로지스틱 회귀, 랜덤 포레스트, 나이브 베이즈 등.
제조업
1. 불량 검출
2. 장비 이상 탐지
3. 랜덤 포레스트, SVM, 앙상블 모델, 딥러닝
모델 평가 방법
Cross Entropy, Hinge Loss
: 분류 모델에 사용되는 손실함수
1. Binary Cross Entropy / Cross Entropy
- Binary는 이진 분류에 자주 사용
- 다중 분류에선 Cross Entropy 사용
- 예측 확률이 실제 레이블과 얼마나 차이가 있는지 측정
2. Hinge Loss
- SVM에서 많이 사용
- 마진을 고려하여 오분류된 샘플에 패널티 부여
혼동 행렬 (Confusion Matrix) ⭐️⭐️⭐️
- 실제 클래스와 예측 클래스의 관계를 행렬 형태로 나타낸 것
- 분류 모델 해석의 기초

최대한 줄여야하는 에러가
✔️ False positive 가 치명적인가? -> Precisoin(스팸 메일)
(* 스펨이 positive, 정상이 negative)
✔️ False negative 가 치명적인가? -> recall(질병 진단)
(* 암이 positive)
✔️ 모두 다 중요하고, 다 볼래 -> 조화 평균 F10-score
ROC 곡선과 AUC (Area Under the Curve)
✔️ ROC곡선
: 임계값(threshold)을 변화시켜서 TPR(True Positive Rate)과 FPR(False Positive Rate)의 변화를 시각화한 곡선

✔️ TPR(True Positive Rate) : 재현율(recall) 또는 민감도
: 실제 양성(positive) 샘플 중 모델이 양성이라고 예측한 비율
-> 1에 가까울수록 좋음
✔️ FPR(False Positive Rate)
: 실제 음성(negative) 샘플 중 모델이 양성이라고 잘못 예측한 비율
-> 0에 가까울수록 좋음
✔️ AUC
: ROC곡선 아래 면적. 1에 가까울수록 모델이 우수함
💡 불균형 데이터(positive가 매우 적거나 많은 경우)에서도 모델 성능 비교에 유용
코드
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve, roc_auc_score
# 1. 데이터 로드 (유방암 데이터셋: 이진 분류)
data = load_breast_cancer()
X = data.data
y = data.target
# 2. 학습/테스트 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2,
random_state=42,
stratify=y)
# 3. 모델 생성 및 학습
model = LogisticRegression(max_iter=500) # 반복횟수를 충분히 늘려줌
model.fit(X_train, y_train)
# 4. 예측(특히 ROC-AUC 계산을 위해 확률값이 필요하므로 predict_proba 사용)
y_proba = model.predict_proba(X_test)[:, 1]
# predict_proba의 결과 shape는 (샘플 수, 클래스 수).
# 여기서는 양성 클래스(1)에 대한 확률만 사용
# 5. ROC 곡선 계산
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
# fpr: False Positive Rate
# tpr: True Positive Rate (재현율과 동일)
# thresholds: 임계값(이 값을 기준으로 양성/음성 분류가 달라짐)
# 6. AUC 계산
auc_score = roc_auc_score(y_test, y_proba)
# 7. ROC 곡선 시각화
plt.figure()
plt.plot(fpr, tpr, label=f'Logistic (AUC = {auc_score:.3f})')
plt.plot([0, 1], [0, 1], linestyle='--') # 랜덤 분류선
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend()
plt.show()
print("ROC-AUC Score:", auc_score)

📌 실전 TIP!
1. 데이터가 불균형할 경우(ex. 사기 거래 탐지, 질병 예측 등) Accuracy(정확도)만으로는 모델을 평가하기 어려움
-> Precision, Recall, F1-score, ROC-AUC 등 지표를 함께 봐야 함.
2. 현업 목표에 따라 어떤 지표를 중시할지 결정(ex. 암 진단은 Recall중요, 스팸 필터는 Precision 중요 등).
'머신러닝' 카테고리의 다른 글
| [ML] 머신러닝 6강 - 하나보단 둘, 잉상블 기법 (0) | 2025.11.19 |
|---|---|
| [ML] 머신러닝 4강 - 값을 예측하고 싶을 땐 회귀 (0) | 2025.11.18 |
| [ML] 3강 - 머신러닝을 위한 전처리 실습 (0) | 2025.11.17 |

