분류의 목적
분류 문제를 해결하기 위해 자주 활용되는 알고리즘 : Logistic Regression, SVM
1️⃣ 이진 분류(양성/음성, 합격/불합격, 정상/불량 등)는 직관적이고 다양한 산업에서 필요함.
2️⃣ 데이터 분석에서 가장 먼저 접하는 모델 중 하나.

장점
단점
로지스틱 회귀 코드 예시
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))
코드 해설
X_train, y_train)를 이용해 로지스틱 회귀 모델을 학습max_iter(최대 반복 횟수)를 기본값(100)에서 조금 늘려 200으로 설정accuracy_score로 정확도(Accuracy) 계산classification_report로 클래스별 정밀도(precision), 재현율(recall), F1 점수, 지원된 샘플 수(support) 등을 확인target_names=iris.target_names를 통해 각 클래스의 이름(‘setosa’, ‘versicolor’, ‘virginica’)으로 보고서를 보기 쉽게 표시Logistic Regression
X_train, y_train)를 이용해 로지스틱 회귀 모델을 학습max_iter(최대 반복 횟수)를 기본값(100)에서 조금 늘려 200으로 설정accuracy_score로 정확도(Accuracy) 계산
classification_report로 클래스별 정밀도(precision), 재현율(recall), F1 점수, 지원된 샘플 수(support) 등을 확인
target_names=iris.target_names를 통해 각 클래스의 이름(‘setosa’, ‘versicolor’, ‘virginica’)으로 보고서를 보기 쉽게 표시



장점
단점
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))
코드 해설
SVC()는 기본적으로 커널(kernel)을 ‘rbf’로 사용accuracy_score로 정확도(Accuracy) 계산classification_report로 클래스별 정밀도(precision), 재현율(recall), F1 점수, 지원된 샘플 수(support) 등을 확인target_names=iris.target_names를 통해 각 클래스의 이름(‘setosa’, ‘versicolor’, ‘virginica’)으로 보고서를 보기 쉽게 표시

1️⃣ K-NN(K-최근접 이웃)
: 간단하지만 대규모 데이터에서 계산량이 큼.

2️⃣ 나이브 베이즈(Naive Bayes)
: 통계적 가정(독립성)에 기반하므로 계산이 빠름, 스팸 필터 등에서 자주 사용.

3️⃣ 신경망(MLP) 또는 딥러닝 모델
: 복잡도는 높지만 대규모 데이터에서 강점.

1️⃣ 사기 거래 탐지(Fraud Detection)
: 거래 패턴이 정상 고객과 다른 이상 패턴을 보이는지 분류 모델로 판단.
2️⃣ 대출 상환 가능성 예측
: 대출 신청 고객의 과거 신용 기록, 소득, 직업, 기타 특성 등을 종합해 상환이 가능한지 여부 분류.
3️⃣ 적용 모델
: 로지스틱 회귀, 랜덤 포레스트, XGBoost, 딥러닝 등 자주 사용.
1️⃣ 질병 진단 : 양성(Positive)/음성(Negative) 여부 분류. ex) 암 진단, 당뇨병 예측 등.
2️⃣ 임상 데이터(혈액 검사 수치, 환자 진료 기록)와 의료 영상을 기반으로 머신러닝 모델을 훈련.
3️⃣ 적용 모델 : 로지스틱 회귀, SVM, 최근에는 딥러닝도 활발히 연구.
1️⃣ 고객 이탈 예측
: 고객이 서비스를 해지할 가능성이 있는지 분류.
2️⃣ 캠페인 반응 예측
: 이메일 또는 광고 캠페인에 대한 반응(열람/미열람, 구매/미구매) 여부 예측.
3️⃣ 적용 모델
: 로지스틱 회귀, 랜덤 포레스트, 나이브 베이즈 등.
1️⃣ 불량 검출
: 공정에서 생산된 부품이 불량인지 아닌지 분류.
2️⃣ 장비 이상 탐지
: 센서 데이터(온도, 진동, 압력 등)를 기반으로 이상 여부 분류.
3️⃣ 적용 모델
: 랜덤 포레스트, SVM, 앙상블 모델, 딥러닝이 주로 활용됨.
1️⃣ Binary Cross Entropy / Cross Entropy
2️⃣ Hinge Loss
실제 클래스와 예측 클래스의 관계를 행렬 형태로 나타낸 것.
분류 모델 해석의 기초이므로, 용어와 의미를 잘 숙지해야 함.

Precision(정밀도): 예측을 Positive라고 한 사례 중, 실제로 Positive인 비율.
Recall(재현율): 실제 Positive 사례 중, 모델이 Positive로 맞춘 비율.
F1-score: Precision과 Recall의 조화평균.

- FPR(False Positive Rate)
- 실제 음성(Negative) 샘플 중 **모델이 양성이라고 잘못 예측**한 비율
- 0~1 사이의 값을 가지며 0에 가까울 수록 좋음

- TPR과 FPR은 트레이드 오프 관계 (한 쪽이 좋을 수록 한 쪽이 좋지 않음)
- 이 지표도 클래스 불균형 상황에서 사용
임계값을 조정해서 생기는 성능 변화 전체를 보여주기 때문에 단순히 성능 하나만 얘기하는 위의 지표들과는 다름
AUC
불균형 데이터(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 : 각 클래스(0, 1)에 속할 확률을 예측해주는 메소드fpr : 거짓 양성 비율 = FP / (FP + TN)tpr : 참 양성 비율(재현율) = TP / (TP + FN)1️⃣ 데이터가 불균형할 경우(ex : 사기 거래 탐지, 질병 예측 등) Accuracy(정확도)만으로는 모델을 평가하기 어려움 → Precision, Recall, F1-score, ROC-AUC 등 지표를 함께 봐야 함.
2️⃣ 현업 목표에 따라 어떤 지표를 중시할지 결정(ex : 암 진단은 Recall 중요, 스팸 필터는 Precision 중요 등).
다음 안내에 따라 Wine 데이터를 분류하는 실습을 진행해 보세요.
[실습 안내]
Wine 데이터셋을 로드하세요.
학습용/테스트용 데이터를 적절한 비율로 분할하세요.
Logistic Regression, SVM 모델을 생성하고, 모델을 학습시키세요.
max_iter 등)를 설정해볼 것테스트 데이터를 이용해 예측을 수행하고, 다음을 구하세요.

random_state를 설정해야 하는 경우가 있으면 42로 설정
[코드스니펫] 분류 실습 사전 코드
```python
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# Wine 데이터셋 로드
wine = load_wine()
X = wine.data
y = wine.target
###################################################
# Wine 데이터를 dataframe으로도 확인하고 싶은 분은 아래 코드 실행
# wine.data(특성 부분)를 데이터프레임으로 변환
df = pd.DataFrame(wine.data, columns=wine.feature_names)
# 타깃(target) 레이블을 새로운 컬럼으로 추가
df['target'] = wine.target
df
```
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# Wine 데이터셋 로드
wine = load_wine()
X = wine.data
y = wine.target
###################################################
# Wine 데이터를 dataframe으로도 확인하고 싶은 분은 아래 코드 실행
# wine.data(특성 부분)를 데이터프레임으로 변환
df = pd.DataFrame(wine.data, columns=wine.feature_names)
# 타깃(target) 레이블을 새로운 컬럼으로 추가
df['target'] = wine.target
df


1️⃣ 분류 모델의 개념과 활용 분야를 살펴보았다.
2️⃣ 로지스틱 회귀, 랜덤 포레스트, SVM 등 대표적 분류 모델의 원리와 장단점을 이해.
3️⃣ 모델 평가 지표(Precision, Recall, F1-score, ROC-AUC)를 적절히 활용해야 실무에 적용할 때 올바른 판단을 내릴 수 있음.
Q1: 분류 모델과 회귀 모델의 차이점은 무엇인가요?
A1: 회귀 모델은 연속적인 숫자 값을 예측(예: 주가, 매출), 분류 모델은 범주나 클래스를 예측(예: 스팸/정상, 불량/정상)합니다. 즉, 출력 값의 형태가 가장 큰 차이점입니다.
Q2: 왜 정확도(Accuracy)만으로 분류 모델의 성능을 판단하면 안 되나요?
A2: 데이터가 불균형(예: 정상 99%, 불량 1%)한 경우, 대부분을 정상이라 예측해도 정확도가 매우 높아져 버립니다. 그래서 Precision, Recall, F1-score, ROC-AUC 같은 지표를 함께 고려해야 모델의 진짜 성능을 평가할 수 있습니다.
Q3: 불량이 1% 미만인 극단적으로 불균형한 제조 공정 데이터도 모델링이 가능할까요?
A3: 가능하지만 불균형 문제가 심각하기 때문에, 오버샘플링(SMOTE), 언더샘플링 등 데이터를 재구성하거나 클래스 가중치(Weight) 조정 같은 기법을 사용해야 합니다. 평가 시에도 단순 정확도(Accuracy) 대신 Recall, Precision, ROC-AUC, PR 곡선 등을 종합적으로 봐야 합니다.