머신러닝_분류

김정현·2025년 12월 6일

머신러닝

목록 보기
4/9

1. 분류 모델 개요

지도학습이란?

  • 입력 데이터(특징, Feature)와 정답(Label)이 주어졌을 때, 모델이 정답을 예측하도록 학습하는 방식.
  • 회귀(연속값 예측)와 분류(범주 예측)의 차이점?

분류(Classification)의 정의

  • 분류의 목적

    • 데이터가 어느 범주(클래스)에 속하는지 예측.
    • ex) 스팸 메일 분류(스팸/정상), 질병 여부(양성/음성), 제조 공정 품질(불량/정상) 등.
  • 분류 문제를 해결하기 위해 자주 활용되는 알고리즘 : Logistic Regression, SVM

분류 모델이 많이 쓰이는 이유

1️⃣ 이진 분류(양성/음성, 합격/불합격, 정상/불량 등)는 직관적이고 다양한 산업에서 필요함.

2️⃣ 데이터 분석에서 가장 먼저 접하는 모델 중 하나.


2. 주요 분류 모델

로지스틱 회귀(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’)으로 보고서를 보기 쉽게 표시
      • 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, 커널 종류 등)를 적절히 찾아야 하므로 튜닝 비용이 큼.
    • 대규모 데이터 세트에 대해서는 학습 속도가 느릴 수 있음.
  • 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))
  • 코드 해설

    • SVM
      • SVC()는 기본적으로 커널(kernel)을 ‘rbf’로 사용
      • 다른 하이퍼파라미터(C, gamma 등)를 조정해서 성능 개선을 시도할 수 있음
    • 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) 또는 딥러닝 모델

: 복잡도는 높지만 대규모 데이터에서 강점.


3. 분류 모델의 산업별 적용 사례

금융(FinTech)

1️⃣ 사기 거래 탐지(Fraud Detection)

: 거래 패턴이 정상 고객과 다른 이상 패턴을 보이는지 분류 모델로 판단.

2️⃣ 대출 상환 가능성 예측

: 대출 신청 고객의 과거 신용 기록, 소득, 직업, 기타 특성 등을 종합해 상환이 가능한지 여부 분류.

3️⃣ 적용 모델

: 로지스틱 회귀, 랜덤 포레스트, XGBoost, 딥러닝 등 자주 사용.

헬스케어

1️⃣ 질병 진단 : 양성(Positive)/음성(Negative) 여부 분류. ex) 암 진단, 당뇨병 예측 등.

2️⃣ 임상 데이터(혈액 검사 수치, 환자 진료 기록)와 의료 영상을 기반으로 머신러닝 모델을 훈련.

3️⃣ 적용 모델 : 로지스틱 회귀, SVM, 최근에는 딥러닝도 활발히 연구.

마케팅

1️⃣ 고객 이탈 예측

: 고객이 서비스를 해지할 가능성이 있는지 분류.

2️⃣ 캠페인 반응 예측

: 이메일 또는 광고 캠페인에 대한 반응(열람/미열람, 구매/미구매) 여부 예측.

3️⃣ 적용 모델

: 로지스틱 회귀, 랜덤 포레스트, 나이브 베이즈 등.

제조업

1️⃣ 불량 검출

: 공정에서 생산된 부품이 불량인지 아닌지 분류.

2️⃣ 장비 이상 탐지

: 센서 데이터(온도, 진동, 압력 등)를 기반으로 이상 여부 분류.

3️⃣ 적용 모델

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


5. 모델 평가 방법

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)

  • 코드 해설
    • ROC-AUC 계산을 위한 예측 확률
      • ROC 곡선과 AUC는 분류 결과 자체(0/1)보다 ‘양성 클래스(1)일 확률’ 이 필요합니다.
      • predict_proba : 각 클래스(0, 1)에 속할 확률을 예측해주는 메소드
    • ROC 곡선 계산
      • 분류 임계값(threshold)을 다양하게 바꿔가며 FPR, TPR을 계산해줍니다.
      • 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 등)를 설정해볼 것
  • 테스트 데이터를 이용해 예측을 수행하고, 다음을 구하세요.

    • 정확도(Accuracy)
    • 분류 보고서(Classification Report)
    • 혼동행렬(Confusion_matrix) → 선택사항
      • 참고!) sklearn의 confusion matrix는 아래와 같은 형태로 나온다는 점을 참고하세요!
    • ROC, AUC
  • 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


총 정리 및 Q&A

총 정리

1️⃣ 분류 모델의 개념과 활용 분야를 살펴보았다.

2️⃣ 로지스틱 회귀, 랜덤 포레스트, SVM 등 대표적 분류 모델의 원리와 장단점을 이해.

3️⃣ 모델 평가 지표(Precision, Recall, F1-score, ROC-AUC)를 적절히 활용해야 실무에 적용할 때 올바른 판단을 내릴 수 있음.

Q&A

Q1: 분류 모델과 회귀 모델의 차이점은 무엇인가요?

A1: 회귀 모델은 연속적인 숫자 값을 예측(예: 주가, 매출), 분류 모델은 범주나 클래스를 예측(예: 스팸/정상, 불량/정상)합니다. 즉, 출력 값의 형태가 가장 큰 차이점입니다.

Q2: 왜 정확도(Accuracy)만으로 분류 모델의 성능을 판단하면 안 되나요?

A2: 데이터가 불균형(예: 정상 99%, 불량 1%)한 경우, 대부분을 정상이라 예측해도 정확도가 매우 높아져 버립니다. 그래서 Precision, Recall, F1-score, ROC-AUC 같은 지표를 함께 고려해야 모델의 진짜 성능을 평가할 수 있습니다.

Q3: 불량이 1% 미만인 극단적으로 불균형한 제조 공정 데이터도 모델링이 가능할까요?

A3: 가능하지만 불균형 문제가 심각하기 때문에, 오버샘플링(SMOTE), 언더샘플링 등 데이터를 재구성하거나 클래스 가중치(Weight) 조정 같은 기법을 사용해야 합니다. 평가 시에도 단순 정확도(Accuracy) 대신 Recall, Precision, ROC-AUC, PR 곡선 등을 종합적으로 봐야 합니다.

profile
안녕하세요!

0개의 댓글