분류 모델의 개념과 활용 분야를 살펴보았다.
로지스틱 회귀, 랜덤 포레스트, SVM 등 대표적 분류 모델의 원리와 장단점을 이해.
모델 평가 지표(Precision, Recall, F1-score, ROC-AUC)를 적절히 활용해야 실무에 적용할 때 올바른 판단을 내릴 수 있음.
분류 모델의 개념 이해
다양한 산업 분야 적용 사례 습득
분류 모델 평가 지표 활용 능력
분류 모델의 원리를 이해하고, 금융·헬스케어·제조업 등 다양한 실제 사례와 평가 방법을 종합적으로 익혀, 실무에 효과적으로 적용할 수 있습니다!
입력 데이터(특징, Feature)와 정답(Label)이 주어졌을 때, 모델이 정답을 예측하도록 학습하는 방식.
분류의 목적
분류 문제를 해결하기 위해 자주 활용되는 알고리즘 : Logistic Regression, SVM
이름은 회귀지만 분류모델임.
선형 회귀처럼 입력값의 선형 결합을 취하지만(선형회귀), 결과를 0~1 사이의 확률로 변환하기 위해 로지스틱 함수(시그모이드 함수)를 사용.

0.5보다 작으면 0, 0.5 이상이면 1로 클래스 결정(분류모델)
장/단점
장점
단점
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))
stratify=y는 y(라벨)의 클래스 비율을 유지하면서 train/test 데이터를 나눠줌
훈련셋, 테스트셋 모두에 클래스 비율이 비슷(y랑 비슷하게 나눠짐)하게 들어감.
원래 y값 안에 있는 클래스의 비율이 train/test로 나눴을 때도 비슷하게 유지
(전체 y가 90:10 비율이면, 나눠진 y_train / y_test도 90:10으로 유지)
클래스 불균형 문제 최소화, 모델 학습/평가의 공정성 확보
max_iter(최대 반복 횟수)를 기본값(100)에서 조금 늘려 200으로 설정, 몇번 반복할 지 정해줌
accuracy_score로 정확도(Accuracy) 계산, 전체 중 맞춘 비율
classification_report로 클래스별 정밀도(precision), 재현율(recall), F1 점수, 지원된 샘플 수(support) 등을 확인
target_names=iris.target_names를 통해 각 클래스의 이름(‘setosa’, ‘versicolor’, ‘virginica’)으로 보고서를 보기 쉽게 표시
데이터를 가장 잘(안전 여유공간을 크게) 구분하는 경계를 찾는 알고리즘
예를들면, 두 부류(ex: 고양이 vs 개)를 잘 구분해주는 경계를 찾는데, 두 부류가 최대한 멀리 떨어지도록(안전 여유공간이 넓도록) 찾는 방식"
장단점
- 장점
- 차원이 높은 데이터에서도 좋은 성능을 보일 수 있음.(커널;필터 를 사용할 수 있음)
- 결정 경계를 명확하게 찾는 경우, 예측 성능이 우수함.
- 결정경계란? → SVM이 찾은 최적의 분류선(또는 초평면)
ex) 한쪽 편을 '고양이'로, 다른 한편을 '개'로 구분해주는 기준선
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))
SVC()는 기본적으로 커널(kernel)을 ‘rbf’로 사용K-NN(K-최근접 이웃)
간단하지만 대규모 데이터에서 계산량이 큼.

k만큼 주변 개수로 판단함
초록색 동그라미의 경우 k=3일때 네모1 삼각형2이므로 삼각형이 될 것이라 판단
나이브 베이즈(Naive Bayes)
확률적으로 구하는 모델, 통계적 가정(독립성)에 기반하므로 계산이 빠름, 스팸 필터 등에서 자주 사용.
신경망(MLP) 또는 딥러닝 모델
복잡도는 높지만 대규모 데이터에서 강점.
크로스 엔트로피(정보이론) / 힌지로스
분류(Classification) 모델에 사용되는 손실함수
Binary Cross Entropy / Cross Entropy
- Hinge Loss
결정경계를 끗는 역할, 데이터 공간 확보하는게 중요(마진)
SVM(Support Vector Machine)에서 많이 사용
마진을 고려하여 오분류된 샘플에 페널티를 부여
진짜중요.매우매우중요.

맞췄는지/ 안맞췄는지, 뭘로 맞추고/뭘로 틀렸는지
예측하고자 하는 대상 = positive(양성)
TP/ TN 은 정답.
FN(negative로 예측했는데 실제 positive).. 반대
정확도 = 전체개수 / 맞춘개수, 정확도 계산 가능
클래스가 불균형이면 정확도는 신뢰할 수 없다 (양성 99%, 음성 1%면 정확도는 99%나옴)
클래스 불균형일때 평가지표로 사용 가능
Precision(정밀도): 예측을 Positive라고 한 사례 중, 실제로 Positive인 비율. FP + TP / TP
Recall(재현율): 실제 Positive 사례 중, 모델이 Positive로 맞춘 비율.
TP + FN / TP
- “놓치지 않는 것”이 중요한 경우(예: 질병 진단) 강조.
F1-score: Precision과 Recall의 조화평균.
ROC 곡선
임계값(Threshold)을 변화시키며, TPR(True Positive Rate)과 FPR(False Positive Rate)의 변화를 시각화한 곡선

다른 말로 재현율(Recall) 또는 민감도(Sensitivity)
실제 양성(Positive) 샘플 중 모델이 양성이라고 예측한 비율
0~1 사이의 값을 가지며 1에 가까울 수록 좋음

실제 음성(Negative) 샘플 중 모델이 양성이라고 잘못 예측한 비율
0~1 사이의 값을 가지며 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)
predict_proba: 시그모이드 함수(확률)
어떤 클래스에 대해서 몇 퍼센트의 확률을 예측했느냐의 해석이 가능함
roc_curve: 정답값과 확률값을 넣어줘야 함

데이터가 불균형할 경우(ex : 사기 거래 탐지, 질병 예측 등) Accuracy(정확도)만으로는 모델을 평가하기 어려움 → Precision, Recall, F1-score, ROC-AUC 등 지표를 함께 봐야 함.
현업 목표에 따라 어떤 지표를 중시할지 결정(ex : 암 진단은 Recall 중요, 스팸 필터는 Precision 중요 등).