본문 바로가기
Data Science/Machine Learning

[ML] 분류(Classification)

by VAMOSSS 2022. 2. 6.
반응형

분류

지도학습의 한 종류로 target이 범주형(이산형) 레이블인 데이터를 다루는 학습입니다.

분류를 적용하는 target 예시

연속형인 레이블을 가진 데이터셋을 다루는 학습은 회귀라고 부릅니다. 다음 글에 설명해놓았습니다.

 

분류의 종류

  • 이진 분류
  • 다중 분류
  • 다중 레이블 분류
  • 다중 출력 분류

이진 분류

이진 분류기는 한 레이블만 구별하는 것입니다.

예를 들면, 5-감지기는 '5'와 '5아님' 두 클래스를 구분할 수 있는 이진 분류기입니다.

 

다중 분류

셋 이상의 클래스 구별합니다.

예를 들어, 언어라는 target이 있다면, 값에는 한국어, 영어, 프랑스어, 스페인어 등 여러 클래스가 존재할 것입니다.

 

일부 알고리즘(SGD 분류기, 랜덤 포레스트 분류기, 나이브 베이즈 분류기 등)은 여러 개의 클래스를 직접 처리할 수 있는 반면, 다른 알고리즘(로지스틱 회귀나 서포트 벡터 머신 분류기 등)은 이진 분류만 가능합니다.

 

이진 분류만 가능한 알고리즘을 사용해서 다중 분류를 하는 방법입니다. 이진 분류기를 여러 개 사용하여 다중 클래스를 분류하는 것입니다.

  • OvR 전략 (One-versus-the-Rest)
    • OvA(one-versus-all)라고도 함
    • 각 샘플에 대해 각기 다른 이진 분류기를 실행한 후, 각 분류기의 결정 점수 중에서 가장 높은 점수를 받은 클래스를 선택
    [예시] 0 이진분류기, 1 이진분류기, 2 이진분류기 ,,,
  • OvO 전략 (One-versus-One)
    • 각 숫자의 조합마다 이진 분류기 훈련한 후, 가장 많이 선택된 클래스 선택
    • 클래스가 N개라면 분류기 N x (N-1) / 2 필요
    • 장점 : 각 분류기의 훈련에 전체 훈련 세트 중 구별할 두 클래스에 해당하는 샘플만 필요하다는 것
    [예시] 0과 1 구별, 0과 2 구별, 1과 2 구별

대부분의 이진 분류 알고리즘 OvR 선호한다고 합니다.

반면에, 일부 알고리즘은 훈련 세트의 크기에 민감해서 큰 훈련 세트에서 몇개의 분류기를 훈련시키는 것보다 작은 훈련 세트에서 많은 분류기를 훈련시키는 쪽이 빠르므로 OvO 선호한다고 합니다.

다중 클래스 분류 작업에 이진 분류 알고리즘을 선택하면 사이킷런이 알고리즘에 따라 자동으로 OvR 또는 OvO 실행합니다.

 

다중 레이블 분류

여러 개의 이진 답을 출력하는 분류 시스템입니다.

 

예를 들어, 얼굴 인식 분류기에서 같은 사진에 세명이 등장했을 때 원하는 사람이 1: 있음, 0 :없음인 이진 분류로 [0,1,1]와 같이 출력.

 

다중 출력 분류

다중 레이블 분류에서 한 레이블이 다중 클래스가 될 수 있도록 일반화한 것입니다.

다중 레이블 분류에서 이진 답이 아니라 답이 여러 클래스에 해당한다고 생각하시면 됩니다.

 

예시 코드 : Iris data

사이킷런(scikit-learn)의 SGDClassifier를 사용해서 진행해보겠습니다.

 

확률적 경사 하강법 (SGD : Stochatstic Gradient Descent)

  • 매우 큰 데이터셋을 효율적으로 처리하는 장점
  • 온라인 학습에 적합
  • 한 번에 하나씩 훈련 샘플을 독립적으로 처리
  • SGDClassifier는 훈련하는 데 무작위성을 사용. 그래서 이름에 확률적’ 이 붙음
import pandas as pd
import numpy as np

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import SGDClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score
iris = load_iris()
X = iris.data
y = iris.target

# 모델 학습 후 모델 성능 파악하기 위해 데이터 분리
# 학습데이터와 테스트데이터 분리

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
sgd_clf = SGDClassifier(random_state=42)
sgd_clf.fit(X_train, y_train)
prediction = sgd_clf.predict(X_test)
print('실제 레이블 : {}'.format(y_test))
print('예측 레이블 : {}'.format(prediction))

print('예측 정확도 : {:.4f}'.format(accuracy_score(y_test, prediction)))
print('교차검증 예측 정확도 : {:.4f}'.format(cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring="accuracy").mean()))

 

Reference

핸즈온 머신러닝을 참고하여 작성하였습니다.

https://github.com/liganega/handson-ml2

 

GitHub - liganega/handson-ml2: 머신러닝과 딥러닝의 기초 학습 자료 제공

머신러닝과 딥러닝의 기초 학습 자료 제공. Contribute to liganega/handson-ml2 development by creating an account on GitHub.

github.com

 

반응형

댓글