Post

[ML] 2. 지도 학습 알고리즘(2-5) 다중 클래스 분류


[ML with Python] 2. 지도 학습 알고리즘 (2) 다중 클래스 분류

  • 본 포스팅은 지도 학습 알고리즘인 분류용 선형 모델에 관한 기본적인 내용에 관하여 다룹니다.
  • 다중 클래스 분류용 선형 모델
  • 일대다 방법(one-vs.-rest)
  • SVC를 이용한 일대다 방법
  • 선형 모델의 매개변수 (정리)
  • 선형 모델의 장단점

필요 라이브러리 import

1
2
3
4
5
6
7
import mglearn
import matplotlib.pyplot as plt
import numpy as np

from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC

다중 클래스 분류용 선형 모델

(로지스틱 회귀만을 제외하고) 많은 선형 분류 모델은 태생적으로 이진 분류만을 지원한다.
다중 클래스(multiclass)를 지원하지 않는다는 의미이다. 그러므로, 이진 분류알고리즘을 다중 클래스 분류알고리즘으로 확장하기 위해서 주로 일대다 방법을 사용한다.


  • 일대다 방법(one-vs.-rest)
    • 이진 분류알고리즘을 다중 클래스 분류 알고리즘으로 확장하는 방법이다.
    • 각 클래스를 다른 모든 클래스와 구분하도록 이진 분류모델을 학습시킨다.
    • 결국 클래스의 수만큼 이진 분류모델이 만들어진다.
    • 예측할 때 이렇게 만들어진 모든 이진 분류기가 작동하여
      가장 점수가 높은 점수를 내는 분류기의 클래스를 에측값으로 선택한다.


클래스별 이진 분류기를 만들면 각 클래스가 계수 백터(w)와 절편(b)를 하나씩 가지게 된다.
결국 분류 신뢰도를 나타내는 다음 공식의 결과값이 가장 높은 클래스가 해당 데이터의 클래스 레이블로 할당된다.

w[0] × x[0] + w[1] × x[1] + … + w[p] × x[p] + b


다음 세 개의 클래스를 가진 데이터셋에 일대다 방식을 적용해보자
해당 데이터셋은 2차원이며 각 클래스의 데이터는 정규분포(가우시안 분포)를 따른다.

1
2
3
4
5
X, y = make_blobs(random_state=42)
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
plt.xlabel("property 0")
plt.ylabel("property 1")
plt.legend(["class 0", "class 1", "class 2"])
1
<matplotlib.legend.Legend at 0x188ccf92880>

linearmodel_multi_classification_model_5_1


먼저 LinearSVC 훈련결과를 확인해보자

1
2
3
4
5
6
linear_svm = LinearSVC().fit(X, y)
print(linear_svm.coef_)
print("계수 배열의 크기: ", linear_svm.coef_.shape)
print()
print(linear_svm.intercept_)
print("절편 배열의 크기: ", linear_svm.intercept_.shape)
1
2
3
4
5
6
7
[[-0.17492627  0.23141057]
 [ 0.4762129  -0.0693673 ]
 [-0.18914077 -0.20400584]]
계수 배열의 크기:  (3, 2)

[-1.07745602  0.13140337 -0.08604988]
절편 배열의 크기:  (3,)
  • coef_배열의 크기는 (3,2)이다.
    해당 배열의 행은 세 개의 클래스에 각각 대응하는 계수 벡터를 담고 있으며,
    열은 각 특성에 따른 계수 값을 가지고 있다.

  • intercept_는 각 클래스의 절편을 담고 있다.


세 개의 이진 분류기가 만드는 경계를 시각화하면 다음과 같다.

-(line * coef[0] + intercept) / coef[1]

위의 식은 기본적인 직선 공식(Ax+By+C = 0)에 기반되어있다.

coef[0]x + coef[1]y + intercept = 0
(coef[0]/coef[1])x + y + intercept/coef[1] = 0
y = -( (coef[0]/coef[1])
x + intercept/coef[1] )

1
2
3
4
5
6
7
8
9
10
11
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
line = np.linspace(-15, 15)
for coef, intercept, color in zip(linear_svm.coef_, linear_svm.intercept_,
                                  mglearn.cm3.colors):
    plt.plot(line, -(line * coef[0] + intercept) / coef[1], c=color)
    plt.ylim(-10, 15)
    plt.xlim(-10, 8)
plt.xlabel("property 0")
plt.ylabel("property 1")
plt.legend(['class 0', 'class 1', 'class 2', 'class 0 boundary', 'class 1 boundary',
            'class 2 boundary'], loc=(1.01, 0.3))
1
<matplotlib.legend.Legend at 0x188d3395910>

linearmodel_multi_classification_model_11_1

각각의 선이 이진 분류 모델을 뜻한다. 클래스의 수 만큼 이진 분류 모델이 만들어진 것을 확인할 수 있다. 이를 토대로 decision boundary가 그려진다.


그렇다면 위의 그림 중앙의 세 분류기가 모두 나머지로 분류한 삼각형 영역은 어떻게되는 걸까? 해당 데이터 포인트는 가장 가까운 직선의 클래스가 될 것이다.


다음 예는 2차원 평면의 모든 포인트에 대한 예측 결과를 보여준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mglearn.plots.plot_2d_classification(linear_svm, X, fill=True, alpha=.7)

mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
line = np.linspace(-15, 15)


for coef, intercept, color in zip(linear_svm.coef_, linear_svm.intercept_,    
                                   mglearn.cm3.colors):
    plt.plot(line, -(line * coef[0] + intercept) / coef[1], c=color)

    
    plt.legend(['class 0', 'class 1', 'class 2', 'class 0 boundary', 'class 1 boundary',
            'class 2 boundary'], loc=(1.01, 0.3))
plt.xlabel("property 0")
plt.ylabel("property 1")
1
Text(0, 0.5, 'property 1')

linearmodel_multi_classification_model_13_1


선형 모델의 매개변수

선형 모델의 주요 매개변수는 다음과 같았다.

  • 회귀 모델 : alpha
    • alpha ↑ => 모델이 단순해짐


  • LinearSVCLogisticRegression : C
    • C ↓ => 모델이 단순해짐


특별히 회귀 모델에서는 이 매개변수를 조정하는 것이 매우 중요하다.
보통 Calpha로그 스케일로 최적치를 정한다.


그리고 L1 규제를 사용할지 L2 규제를 사용할지도 정해야한다.

  • 중요한 특성이 많지 않음 => L1 규제
    • 특히, 해당 규제는 모델의 해석이 중요한 요소일 떄도 사용할 수 있다.
      몇 가지 특성만 사용하므로 해당 모델에 중요한 특성이 무엇이고 그 효과가 어느 정도인지 설명하기 쉬워진다.


  • 중요한 특성이 많음 => L2 규제

선형 모델의 장단점

장점

  • 학습 속도와 예측이 빠르다.


  • 매우 큰 데이터셋과 희소한 데이터셋에서도 잘 작동한다.
    • 수십만에서 수백만 개의 샘플로 이뤄진 대용량 데이터셋이라면 기본 설정보다 빨리 처리하도록 LogisticRegressionRidgesolver='sag' 옵션을 준다.
    • 다른 대안으로 SDGClassifierSGDRegressor을 사용할 수 있다.


  • 회귀와 분류에서 본 공식을 사용해 예측이 어떻게 만들어지는지 비교적 쉽게 이해할 수 있다.


  • 샘플에 비해 특성이 많을 때 잘 작동한다.
    다른 모델로 학습하기 어려운 매우 큰 데이터셋에도 선형 모델을 많이 사용한다.

단점

  • 위에서 처럼 예측이 어떻게 만들어지는지 비교적 쉽게 이해할 수 있지만,
    계수의 값들이 왜 그런지는 명확하지 않을 때가 종종있다.
    특히 데이터셋의 특성들이 서로 깊게 연관되어 있을 때 그렇다.
    그리고 이런 경우 계수 분석이 매우 어려울 수 있다.


  • 특성이 적은 저차원 데이터셋에서는 다른 모델들의 일반화 성능이 더 좋다.

References

This post is licensed under CC BY 4.0 by the author.