My Data Story

[분류] 소프트맥스 회귀 본문

Machine Learning/2. 지도 학습 알고리즘

[분류] 소프트맥스 회귀

Hwasss 2021. 8. 6. 09:51
728x90

◈  '분류' 목차 

1. 나이브 베이즈

2. 선형판별분석(LDA)

3. 로지스틱 회귀

4. 소프트맥스 회귀

     다중 클래스를 분류할 수 있는 소프트맥스 회귀 모델에 대해 살펴본다.

5. 다중 레이블 분류, 다중 출력 분류

6. 분류 모델 평가


1. 다중 분류

이진 분류는 하나의 레이블에 2개의 클래스가 존재하는 분류 문제였다면,

다중 분류는 하나의 레이블에  3개 이상의 클래가 존재하는 분류이다.

 

 

 

 

다중 분류하는 기법은 다양하다. 

 

SGDClassifier, RandomForestClassifier, NaiveClassifier 는 여러 개 클래스에 대해 직접 처리 가능하다. 로지스틱 회귀나 SVM은 이진 분류만 가능하지만,  이진 분류기 여러 개를 사용하여 다중 클래스를 분류하는 기법도 많이 있다. 

 

첫번째 기법으로 OVR (One-Versus-the-Rest) 전략이 있다. 

클래스가 N개라면, N개의 이진 분류기를 훈련시켜 가장 높은 결정 함수의 분류기를 클래스로 선택한다.

 

예를 들어

클래스 3개라면 '클래스1 vs 나머지 클래스', '클래스2 vs 나머지 클래스', '클래스3 vs 나머지 클래스' 총 3개의 이진 분류기를 훈련시켜 가장 높은 결정 함수의 분류기를 클래스로 선택한다. 

 

두번째 기법으로 OVO (One-Versus-One) 전략이 있다. 

클래스가 N개라면, N*(N-1)/2 개의 이진 분류기를 훈련시켜, 가장 많이 양성으로 분류된 클래스를 선택한다. 

 

예를 들어

클래스 3개라면 '클래스1 vs 클래스2' , '클래스1 vs 클래스3' , '클래스2 vs 클래스3' 총 3개의 이진 분류기를 훈련시켜 가장 많이 양성으로 분류된 클래스를 선택한다. 이때 각 분류기의 훈련에 전체 훈련 세트가 아닌 구별할 두 클래스에 해당하는 샘플만 필요하다. 

 

 

SVM 알고리즘의 경우, 훈련 세트 크기에 민감하여 OVO 전략을 선호한다.

하지만 대부분의 이진 분류 알고리즘은 OVR 을 선호한다. 

 

이렇듯 사이킷런은 이진 분류 알고리즘에 따라 자동으로 OVR 또는 OVO 전략을 선택하여 실행한다.

 

사이킷런에서 OVO 나 OVR 전략을 강제하려면 OneVsOneClassifier 나 OneVsRestClassifier 를 사용한다.

 

from sklearn.svm import SVC
from sklearn.multiclass import OneVsResultClassifier

ovr_clf = OneVsResultClassifier(SVC())

 

2. 소프트맥스 회귀

로지스틱 회귀 모델은 다중 클래스를 지원하도록 일반화될 수 있다. 이를 소프트맥스 회귀 또는 다중 로지스틱 회귀라고 부른다. 

 

소프트맥스 회귀 분류기는 한 번에 하나의 레이블만 예측한다.

다만 레이블의 종류가 2개가 아닌 다중인 것이다.

즉 다중 클래스지 다중 출력은 아니다. 따라서 상호 배타적인 클래스에만 사용해야한다. 

 

3. 알고리즘 작동 원리

소프트맥스 회귀 작동 원리는 다음과 같다.

 

step1

소프트맥스는 각 클래스마다 결정 경계가 존재하여, 각 클래스 K에 대한 점수를 계산한다. 

 

각 클래스 별 결정 경계를 바탕으로 점수를 계산하는 과정은 다음과 같다. 

 

<클래스 K에 대한 소프트맥스 점수>

 

step2

그 점수를 소프트맥스 함수 (정규화된 지수 함수)를 적용하여 각 클래스의 확률을 추정한다.

 

<소프트맥스 함수>

 

 

step3

추정 확률이 가장 높은 클래스를 도출한다.

 

<소프트맥스 회귀 분류기 예측>

 

cf. argmax 연산은 함수를 최대화하는 변수의 값 (클래스 K)을 반환한다.

 

3. 비용 함수

소프트맥스 회귀 분류기는 비용 함수 크로스 엔트로피를 최소화하도록 훈련한다.

 

<크로스엔트로피 비용함수>

 

소프트맥스 회귀 분류기 비용 함수의 편도 함수는 다음과 같다. 

각 클래스에 대한 그레이디언트 벡터 계산할 수 있으므로

비용 함수를 최소화한 파라미터 행렬을 찾기 위해 경사 하강법을 사용할 수 있다. 

 

<클래스 k에 대한 크로스 엔트로피의 그레이디언트 벡터>

 

사이킷런의 LogisticRegression은 클래스가 둘 이상일 때 기본적으로 일대다(OvA) 전략을 사용한다.

하지만 multi_class 매개 변수를 'multinomial' 로 바꾸면 소프트맥스 회귀를 사용할 수 있다. 

소프트맥스 회귀를 사용하려면 solver 매개변수에 'lbfgs' 와 같이 소프트맥스 회귀를 지원하는 알고리즘을 지정해야 한다. 

 

 

X = iris['data'][:,(2,3)]
y = iris['target']

softmax_reg = LogisticRegression(multi_class='multinomial', solver='lbfgs',C=10)
softmax_reg.fit(X,y)
softmax_reg.predict([[5,2]])
softmax_reg.predict_proba([[5,2]])