016 분류 문제의 이해
키워드: 분류, 개념
개요
분류(Classification)는 머신러닝에서 가장 흔한 문제 유형 중 하나입니다. 주어진 데이터를 미리 정의된 클래스(범주) 중 하나로 분류하는 것이 목표입니다.
이 글에서는 분류 문제의 개념, 종류, 그리고 FLAML에서 분류 문제를 다루는 방법을 알아봅니다.
실습 환경
- Python 버전: 3.11 권장
- 필요 패키지:
flaml[automl], pandas, scikit-learn
pip install flaml[automl] pandas scikit-learn matplotlib
분류란?
정의
분류는 입력 데이터(특성)를 기반으로 미리 정의된 클래스 중 하나를 예측하는 문제입니다.
입력(특성) → 분류 모델 → 출력(클래스)
분류 vs 회귀
| 구분 | 분류 | 회귀 |
|---|---|---|
| 출력 | 범주형 (클래스) | 연속형 (숫자) |
| 예시 | 스팸/정상 | 주택 가격 |
| 평가 | 정확도, F1 | MSE, R² |
분류의 종류
1. 이진 분류 (Binary Classification)
두 개의 클래스 중 하나를 예측합니다.
예시:
- 스팸 메일 탐지: 스팸 / 정상
- 질병 진단: 양성 / 음성
- 고객 이탈: 이탈 / 유지
- 사기 탐지: 사기 / 정상
# 016 이진 분류 예시
y = [0, 1, 0, 1, 1, 0] # 0: 클래스 A, 1: 클래스 B
2. 다중 분류 (Multiclass Classification)
세 개 이상의 클래스 중 하나를 예측합니다.
예시:
- 붓꽃 품종: setosa / versicolor / virginica
- 숫자 인식: 0~9 (10개 클래스)
- 감정 분석: 긍정 / 부정 / 중립
- 제품 카테고리: 의류 / 전자제품 / 식품 / ...
# 016 다중 분류 예시
y = [0, 1, 2, 0, 2, 1] # 0, 1, 2: 세 개의 클래스
3. 다중 레이블 분류 (Multilabel Classification)
하나의 샘플이 여러 클래스에 동시에 속할 수 있습니다.
예시:
- 영화 장르: [액션, SF], [로맨스, 코미디, 드라마]
- 기사 태그: [정치, 경제], [스포츠, 건강]
# 016 다중 레이블 예시
y = [[1, 0, 1], [0, 1, 1], [1, 1, 0]] # 각 샘플이 여러 레이블 가질 수 있음
FLAML에서 분류 설정
기본 분류 설정
from flaml import AutoML
automl = AutoML()
automl.fit(
X_train, y_train,
task="classification", # 분류 태스크
time_budget=60,
metric="accuracy"
)
이진 분류 vs 다중 분류
FLAML은 타겟의 고유값 개수를 자동으로 감지합니다:
- 고유값 2개 → 이진 분류
- 고유값 3개 이상 → 다중 분류
import numpy as np
# 016 타겟 확인
print(f"클래스 개수: {len(np.unique(y_train))}")
print(f"클래스 목록: {np.unique(y_train)}")
분류 예제: 이진 분류
from flaml import AutoML
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 016 데이터 로드 (이진 분류: 악성/양성)
X, y = load_breast_cancer(return_X_y=True)
print(f"클래스: {np.unique(y)}") # [0, 1]
# 016 분할
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 016 FLAML 학습
automl = AutoML()
automl.fit(
X_train, y_train,
task="classification",
time_budget=30,
metric="accuracy",
verbose=0
)
# 016 평가
y_pred = automl.predict(X_test)
print(f"정확도: {accuracy_score(y_test, y_pred):.4f}")
분류 예제: 다중 분류
from sklearn.datasets import load_iris
# 016 데이터 로드 (다중 분류: 3개 품종)
X, y = load_iris(return_X_y=True)
print(f"클래스: {np.unique(y)}") # [0, 1, 2]
# 016 분할
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 016 FLAML 학습
automl = AutoML()
automl.fit(
X_train, y_train,
task="classification",
time_budget=30,
metric="accuracy",
verbose=0
)
# 016 평가
y_pred = automl.predict(X_test)
print(f"정확도: {accuracy_score(y_test, y_pred):.4f}")
분류의 출력
predict()
클래스 레이블을 반환합니다.
y_pred = automl.predict(X_test)
print(f"예측 클래스: {y_pred[:5]}")
# 016 예: [1, 0, 1, 1, 0]
predict_proba()
각 클래스에 속할 확률을 반환합니다.
y_prob = automl.predict_proba(X_test)
print(f"확률 shape: {y_prob.shape}")
print(f"첫 샘플 확률: {y_prob[0]}")
# 016 이진 분류: [[0.1, 0.9], ...] (클래스 0 확률, 클래스 1 확률)
# 016 다중 분류: [[0.1, 0.3, 0.6], ...] (각 클래스 확률)
분류 문제의 특성
클래스 불균형
현실의 많은 분류 문제는 클래스 간 샘플 수가 불균형합니다.
# 016 클래스 불균형 확인
from collections import Counter
class_counts = Counter(y_train)
print("클래스 분포:")
for cls, count in class_counts.items():
print(f" 클래스 {cls}: {count}개 ({count/len(y_train)*100:.1f}%)")
불균형 예시:
- 사기 탐지: 사기 1%, 정상 99%
- 질병 진단: 양성 5%, 음성 95%
클래스 불균형 처리
# 016 불균형 데이터에서는 정확도 대신 다른 지표 사용
automl.fit(
X_train, y_train,
task="classification",
time_budget=60,
metric="roc_auc", # 또는 "f1"
)
분류 평가 지표 미리보기
| 지표 | 설명 | 사용 상황 |
|---|---|---|
| Accuracy | 전체 정확도 | 균형 데이터 |
| Precision | 양성 예측 중 실제 양성 | 거짓 양성이 비용이 큰 경우 |
| Recall | 실제 양성 중 양성 예측 | 거짓 음성이 비용이 큰 경우 |
| F1 Score | Precision과 Recall의 조화 평균 | 불균형 데이터 |
| ROC AUC | ROC 곡선 아래 면적 | 불균형 데이터 |
분류 문제 예시
비즈니스 분야
| 문제 | 클래스 | 유형 |
|---|---|---|
| 고객 이탈 예측 | 이탈/유지 | 이진 |
| 구매 예측 | 구매/미구매 | 이진 |
| 고객 세그먼트 | A/B/C 등급 | 다중 |
| 리뷰 감성 | 긍정/부정/중립 | 다중 |
의료 분야
| 문제 | 클래스 | 유형 |
|---|---|---|
| 질병 진단 | 양성/음성 | 이진 |
| 암 유형 분류 | 여러 암 유형 | 다중 |
| 위험도 분류 | 저/중/고 | 다중 |
금융 분야
| 문제 | 클래스 | 유형 |
|---|---|---|
| 사기 탐지 | 사기/정상 | 이진 |
| 신용 등급 | A/B/C/D | 다중 |
| 대출 승인 | 승인/거절 | 이진 |
정리
- 분류는 데이터를 미리 정의된 클래스로 분류하는 문제입니다.
- 이진 분류: 두 개의 클래스 (예: 스팸/정상)
- 다중 분류: 세 개 이상의 클래스 (예: 품종 분류)
- FLAML에서는
task="classification"으로 설정합니다. predict()로 클래스를,predict_proba()로 확률을 얻습니다.- 클래스 불균형에 주의하고 적절한 평가 지표를 선택하세요.
다음 글 예고
다음 글에서는 이진 분류 - 타이타닉 생존 예측에 대해 알아보겠습니다. 유명한 타이타닉 데이터세트로 실전 이진 분류 프로젝트를 진행합니다.
FLAML AutoML 마스터 시리즈 #016