카테고리 없음

실무에 쓰는 머신러닝 기초 - 분류

iron-min 2025. 12. 23. 10:31

1. 주요 분류 모델

① 로지스틱 회귀(Logistic Regression) : 선형 회귀처럼 입력값의 선형 결합을 취하지만, 결과를 0~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))
더보기
  • 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(Support Vector Machine) : 데이터를 가장 잘(안전 여유공간을 크게) 구분하는 경계를 찾는 알고리즘 예를들면, 두 부류(ex: 고양이 vs 개)를 잘 구분해주는 경계를 찾는데, 두 부류가 최대한 멀리 떨어지도록(안전 여유공간이 넓도록) 찾는 방식"

 

  • 장점
    • 차원이 높은 데이터에서도 좋은 성능을 보일 수 있음.
    • 결정 경계를 명확하게 찾는 경우, 예측 성능이 우수함.
      • 결정경계란? → SVM이 찾은 최적의 분류선(또는 초평면)
      • ex) 한쪽 편을 '고양이'로, 다른 한편을 '개'로 구분해주는 기준선
  • 단점
    • 파라미터(C, 커널 종류 등)를 적절히 찾아야 하므로 튜닝 비용이 큼.
    • 대규모 데이터 세트에 대해서는 학습 속도가 느릴 수 있음.
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️⃣ 적용 모델

: 랜덤 포레스트, SVM, 앙상블 모델, 딥러닝이 주로 활용됨.

 

 

 

2. 모델 평가 방법

 

① Cross Entropy, Hinge Loss : 분류(Classification) 모델에 사용되는 손실함수

 

1️⃣ Binary Cross Entropy / Cross Entropy

  • Binary Cross Entropy 2진 분류에서 자주 사용
  • 일반적으로 다중 분류에서 Cross Entropy를 사용
  • 예측 확률이 실제 레이블과 얼마나 차이가 있는지 측정

2️⃣ Hinge Loss

  • SVM(Support Vector Machine)에서 많이 사용
  • 마진을 고려하여 오분류된 샘플에 페널티를 부여

 

② 혼동 행렬(Confusion Matrix) 

  • 실제 클래스와 예측 클래스의 관계를 행렬 형태로 나타낸 것.
    • True Positive(TP), False Positive(FP), False Negative(FN), True Negative(TN)
  • 분류 모델 해석의 기초이므로, 용어와 의미를 잘 숙지해야 함.

 

 

 

Precision, Recall, F1-score

  • Precision(정밀도): 예측을 Positive라고 한 사례 중, 실제로 Positive인 비율.
    • “예측 정확도” 관점에서 중요. (예: 스팸 예측)
  • Recall(재현율): 실제 Positive 사례 중, 모델이 Positive로 맞춘 비율.
    • “놓치지 않는 것”이 중요한 경우(예: 질병 진단) 강조.
  • F1-score: Precision과 Recall의 조화평균.
    • 두 지표가 모두 중요한 경우를 종합적으로 평가하기 좋음.

 

 

④ ROC 곡선과 AUC(Area Under the Curve)

  • ROC 곡선 :임계값(Threshold)을 변화시키며, TPR(True Positive Rate)과 FPR(False Positive Rate)의 변화를 시각화한 곡선
    •  
TPR(True Positive Rate)
  • 다른 말로 재현율(Recall) 또는 민감도(Sensitivity)
  • 실제 양성(Positive) 샘플 중 모델이 양성이라고 예측한 비율
  • 0~1 사이의 값을 가지며 1에 가까울 수록 좋음
FPR(False Positive Rate)
  • 실제 음성(Negative) 샘플 중 모델이 양성이라고 잘못 예측한 비율
  • 0~1 사이의 값을 가지며 0에 가까울 수록 좋음

 

  • TPR과 FPR은 트레이드 오프 관계 (한 쪽이 좋을 수록 한 쪽이 좋지 않음)
  • 이 지표도 클래스 불균형 상황에서 사용
  • 임계값을 조정해서 생기는 성능 변화 전체를 보여주기 때문에 단순히 성능 하나만 얘기하는 위의 지표들과는 다름

 

 

  • 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 중요 등).