일대다(OvR) 접근¶
착상¶
로지스틱 회귀, SVM, 퍼셉트론 등 많은 분류 알고리즘은 이항 문제를 위해 설계되었다. 일대다(OvR, One-vs-All이라고도 한다) 전략은 다범주 문제를 \(C\)개의 독립적인 이항 부분문제로 분해하여 어떤 이항 분류기든 \(C\)개 범주로 확장한다. 각 부분문제는 "이 관측치가 범주 \(c\)인가, 아니면 그 밖의 무엇인가?"를 묻는다.
학습 절차¶
\(y_i \in \{1, \ldots, C\}\)인 훈련자료 \(\{(\mathbf{x}_i, y_i)\}_{i=1}^{n}\)가 주어지면, OvR은 \(C\)개의 이항 분류기 \(f_1, \ldots, f_C\)를 학습시킨다. 분류기 \(f_c\)에 대해,
- 목표값을 다시 붙인다.
- 새로 붙인 자료 \(\{(\mathbf{x}_i, \tilde{y}_i^{(c)})\}_{i=1}^{n}\)로 이항 분류기를 학습시킨다.
- 그 결과가 점수함수 \(f_c(\mathbf{x})\)다. 로지스틱 회귀라면 \(c\)번째 이항 모형이 낸 \(P(Y = c \mid \mathbf{x})\)이다.
예측 규칙¶
검정 시점에 \(C\)개의 점수를 모두 계산하고 가장 높은 점수의 범주를 예측한다.
로지스틱 회귀에서는 각 \(f_c\)가 확률을 내지만, 이 확률들은 \(C\)개의 별개 모형에서 추정된 것이라 일반적으로 합이 1이 되지 않는다.
OvR에서의 범주 불균형¶
각 이항 부분문제는 대개 불균형하다. \(C\)개 범주의 크기가 비슷하다면 "나머지" 범주가 전체 자료의 약 \((C-1)/C\)를 차지한다. 예컨대 균형 잡힌 \(C = 10\)개 범주에서 각 이항 분류기는 양성 대 음성이 1:9인 자료를 보게 된다.
이 인위적 불균형은 다음을 낳을 수 있다.
- "나머지"(이항 부분문제의 범주 0)를 예측하는 쪽으로의 치우침.
- 잘 보정되지 않은 확률 추정.
인위적 불균형 다루기
표준적인 처방으로는 범주 가중치 조정(scikit-learn의 class_weight='balanced'), 양성
범주의 과대표집, 학습 후 보정 단계 추가가 있다.
다만 여기서의 "불균형"은 대개 문제가 아니다
19장의 불균형 자료 다루기에서 보았듯이,
로지스틱 회귀의 MLE는 불균형 자체 때문에 편향되지 않는다. 문제가 되는 것은 문턱 0.5뿐인데,
OvR의 예측 규칙은 문턱이 아니라 \(\arg\max\)를 쓰므로 그 문제조차 자동으로 비껴간다. 실제로
OvR에 class_weight='balanced'를 걸면 각 이항 모형의 절편이 이동할 뿐이고, 그 이동량이
범주마다 다르면 오히려 \(\arg\max\) 비교가 왜곡될 수 있다. 균형 잡힌 범주에서는 가중치를
건드리지 않는 편이 낫다.
장점과 단점¶
| 측면 | 평가 |
|---|---|
| 분류기 개수 | \(C\)개(범주 수에 선형) |
| 분류기당 훈련자료 | 전체 \(n\)개 |
| 해석 가능성 | 각 분류기가 자신의 계수를 가짐 |
| 병렬화 | \(C\)개 분류기를 독립적으로 학습 가능 |
| 확률 보정 | 재보정 없이는 점수의 합이 1이 아님 |
| 결정경계 | 조각별. 모호한 영역이 생길 수 있음 |
모호한 영역¶
\(C\)개 분류기가 독립적으로 학습되므로, 같은 입력에 둘 이상의 분류기가 높은 점수를 주거나 모든 분류기가 낮은 점수를 주는 일이 생길 수 있다. 앞의 경우는 \(\arg\max\)가 동점을 해소하지만, 뒤의 경우 예측을 신뢰하기 어렵다. 이런 모호한 영역은 항상 유효한 확률분포를 내는 고유 소프트맥스 회귀에서는 나타나지 않는다.
로지스틱 회귀를 쓰는 OvR¶
기저 분류기가 로지스틱 회귀이면 각 이항 모형은
를 추정한다. 가중벡터 \(\mathbf{w}_1, \ldots, \mathbf{w}_C\)와 편향 \(b_1, \ldots, b_C\)의 모음이 특성공간에 \(C\)개의 선형 결정경계를 정의한다.
보기: 3범주 OvR
범주 세 개(A, B, C)와 훈련 사례 \(n = 300\)개(범주당 100개), 특성 \(p = 2\)개를 생각하자.
학습. 세 개의 이항 로지스틱 회귀를 적합한다.
| 분류기 | 양성 범주 | 음성 범주 | \(n_+\) | \(n_-\) |
|---|---|---|---|---|
| \(f_A\) | A | B \(\cup\) C | 100 | 200 |
| \(f_B\) | B | A \(\cup\) C | 100 | 200 |
| \(f_C\) | C | A \(\cup\) B | 100 | 200 |
예측. 새로운 점 \(\mathbf{x}_*\)에 대해 다음과 같다고 하자.
- \(f_A(\mathbf{x}_*) = 0.72\)
- \(f_B(\mathbf{x}_*) = 0.35\)
- \(f_C(\mathbf{x}_*) = 0.18\)
\(0.72 = \max(0.72, 0.35, 0.18)\)이므로 예측 범주는 A다. 점수의 합이 \(1.25 \neq 1\)이라는 점에 유의하라. 유효한 확률분포가 아니다.
모호한 영역을 눈으로 보기¶
특성이 2개인 3범주 자료(범주당 \(100\)개)에 OvR 로지스틱 회귀를 적합하고, 특성공간의 각 점에서 몇 개의 분류기가 \(0.5\)를 넘는지 세어 색을 칠해 보자. 배치만 다른 두 자료를 나란히 놓는다.

왼쪽은 세 무리가 삼각형 꼭짓점에 놓인 경우다. 자료가 있는 곳은 대부분 흰색, 즉 정확히 한 분류기만 "내 범주다"라고 한다. B의 분류기가 B의 자료 위에서 내는 점수의 평균은 \(0.975\)이고, 훈련자료 중 아무도 주장하지 않는 주황 영역에 떨어지는 것은 \(1\%\)뿐이다. 다만 자료에서 멀어지면 이야기가 달라진다. 위쪽 분홍 영역에서는 둘 이상의 분류기가 동시에 자기 범주라고 주장하고, 가운데 주황 쐐기에서는 아무도 주장하지 않는다. 세 경계선이 서로 맞물리도록 학습된 것이 아니므로, 훈련자료가 없는 곳에서 이들이 정합적으로 맞을 이유가 없다.
오른쪽이 이 절의 경고가 현실이 되는 경우다. 세 무리를 한 줄로 늘어놓으면 범주 B는 "\(-3.4\) 근처도 아니고 \(+3.4\) 근처도 아닌 가운데"에 있다. 그런데 B의 분류기는 B 대 \(\text{A} \cup \text{C}\)라는 선형으로 분리되지 않는 문제를 푼다. 직선 하나로 가운데를 양쪽에서 동시에 잘라 낼 수 없기 때문이다. 그 결과 B의 자료 위에서조차 \(f_B\)의 최댓값이 \(0.452\), 평균이 \(0.339\)에 그친다. 그림에서 B의 무리 전체가 주황색, 즉 아무도 자기 것이라 하지 않는 영역에 통째로 들어앉아 있다. 훈련자료의 \(33\%\)가 여기에 해당한다.
그런데도 \(\arg\max\)로 잰 훈련 정확도는 두 경우 모두 \(0.993\)으로 같다. \(f_B\)가 \(0.339\)밖에 안 되더라도 그 지점에서 \(f_A\)와 \(f_C\)가 더 작기만 하면 예측은 B로 나오기 때문이다. 여기에 이 절의 교훈이 있다. OvR의 정확도가 멀쩡하다는 것은 점수들이 확률로 쓸 만하다는 뜻이 전혀 아니다. 정확도만 보고 있으면 오른쪽 같은 상황을 끝까지 눈치채지 못한다. 확률값이 필요하다면 점수의 합을 관측치별로 확인하거나, 애초에 세 경계를 함께 맞추는 소프트맥스를 쓰는 편이 낫다.
scikit-learn에서의 사용¶
sklearn.multiclass.OneVsRestClassifier 래퍼는 어떤 이항 분류기에든 OvR을 적용한다.
보기 1. 일대다 전략. 붓꽃 자료(\(n = 150\), \(C = 3\))를 층화추출로 \(7:3\)으로 나누어 OneVsRestClassifier를 적합한다.
(1) 세 이항 부분문제의 양성 비율은 각각 얼마인가.
(2) OvR 점수는 관측치마다 합이 \(1\)이 아니다. 그런데 훈련자료 전체에 걸쳐 평균하면 정확히 \(1\)이 된다. 이것을 유도하고, 관측치별 합이 실제로 얼마나 흩어지는지 코드로 확인하시오.
풀이
(1) 양성 비율. 층화추출이므로 훈련자료 \(n = 105\)개가 범주마다 \(35\)개씩이다. 분류기 \(f_c\)는 범주 \(c\)를 양성, 나머지 둘을 음성으로 두므로 양성 비율은
이고 양성 대 음성이 \(1:2\)다. 세 부분문제가 모두 같다. 이 쪽의 연습문제 2가 다루는 \(1/C\)가 \(C = 3\)에서는 \(33.3\%\)라 아직 견딜 만하다.
(2) 평균하면 왜 \(1\)인가. 분류기 \(f_c\)는 다시 붙인 목표값 \(\tilde y_i^{(c)} = \mathbf{1}\{y_i = c\}\)에 대해 벌점 붙은 음의 로그가능도
을 최소화한다. 여기서 \(\hat p_i^{(c)} = \sigma(\mathbf{w}_c^\top\mathbf{x}_i + b_c)\)다. 절편에는 벌점이 걸리지 않으므로 \(b_c\)에 대한 편미분이 그대로
이 되고, 따라서 최적점에서
가 정확히 성립한다. 각 이항 모형의 점수를 훈련자료에 걸쳐 더하면 그 범주의 개수가 된다는 말이다. 이제 \(c\)에 대해 더하면
이므로 양변을 \(n\)으로 나누어
을 얻는다. 점마다는 \(1\)이 아니지만 평균으로는 \(1\)이다. 그러므로 "점수의 합이 \(1\)이 아니다"라는 이 절의 경고는 치우침의 문제가 아니라 퍼짐의 문제다. 평균은 공짜로 맞아 주고, 틀리는 것은 개별 관측치다. 덧붙여 이 등식은 훈련자료에서만 성립한다. 검정자료에서는 성립할 이유가 없다.
수치적으로.
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=0, stratify=y)
# 일대다(OvR)는 범주마다 "이 범주인가 아닌가" 분류기를 하나씩 둔다.
# 분류기가 C 개뿐이라 단순하지만, 각 분류기가 불균형 자료를 보게 되고
# 서로 다른 분류기의 점수를 견줄 근거도 약하다는 점이 걸린다.
model = OneVsRestClassifier(LogisticRegression(max_iter=1000))
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f"이항 분류기 개수: {len(model.estimators_)}")
print(f"검정 정확도: {(y_pred == y_test).mean():.4f}")
# 세 이항 모형의 점수를 날것으로 모은다. 래퍼의 predict_proba 는 합이
# 1 이 되도록 정규화해 버리므로 이항 모형에서 직접 꺼낸다.
S = np.column_stack([e.predict_proba(X_train)[:, 1] for e in model.estimators_])
print(f"훈련 점수의 열별 합 {np.round(S.sum(axis=0), 4)}"
f" (범주별 개수 {np.bincount(y_train)})")
print(f"훈련 행별 합: 평균 {S.sum(axis=1).mean():.7f}"
f" 최소 {S.sum(axis=1).min():.4f} 최대 {S.sum(axis=1).max():.4f}")
T = np.column_stack([e.predict_proba(X_test)[:, 1] for e in model.estimators_])
print(f"검정 행별 합: 평균 {T.sum(axis=1).mean():.4f}"
f" 최소 {T.sum(axis=1).min():.4f} 최대 {T.sum(axis=1).max():.4f}")
print(f"아무도 0.5 를 넘지 않는 검정점 {(T.max(axis=1) < 0.5).sum()}/{len(T)}"
f", 둘 이상 넘는 점 {((T > 0.5).sum(axis=1) >= 2).sum()}")
bad = np.where(y_pred != y_test)[0]
print(f"틀린 {len(bad)}개: 참 {y_test[bad]} -> 예측 {y_pred[bad]}")
출력:
이항 분류기 개수: 3
검정 정확도: 0.9333
훈련 점수의 열별 합 [34.9997 35.0003 35. ] (범주별 개수 [35 35 35])
훈련 행별 합: 평균 1.0000007 최소 0.4144 최대 1.5730
검정 행별 합: 평균 0.9591 최소 0.3622 최대 1.5178
아무도 0.5 를 넘지 않는 검정점 9/45, 둘 이상 넘는 점 3
틀린 3개: 참 [1 1 1] -> 예측 [2 2 2]
유도한 등식이 맞는다. 열별 합이 \(34.9997\), \(35.0003\), \(35.0000\)으로 범주별 개수 \(35\)와 소수 넷째 자리까지 같다. 차이 \(3 \times 10^{-4}\)는 L-BFGS가 수렴 허용오차에서 멈춘 탓이며, 식이 틀린 탓이 아니다. 행별 합의 평균은 \(1.0000007\)로 예고한 \(1\)과 맞는다.
그런데 개별 관측치는 전혀 \(1\)이 아니다. 훈련자료에서 행별 합이 \(0.4144\)에서 \(1.5730\)까지 흩어진다. 최소점에서는 세 분류기를 다 합쳐도 \(0.41\)밖에 안 되니 아무도 그 점을 자기 것이라 하지 않고, 최대점에서는 \(1.57\)이니 둘 이상이 동시에 자기 것이라 한다. 검정자료에서 \(45\)개 중 \(9\)개가 \(\max_c f_c < 0.5\)로 아무도 주장하지 않는 점이고 \(3\)개는 둘 이상이 주장하는 점이다. 앞 그림의 주황 영역과 분홍 영역이 수로 나타난 것이다.
틀린 \(3\)개는 모두 참값이 versicolor(범주 \(1\))인데 virginica(범주 \(2\))로 예측되었다. 가운데에 놓인 versicolor가 "versicolor 대 setosa \(\cup\) virginica"라는 선형으로 분리되지 않는 부분문제의 양성이 되는 탓이다. 바로 앞에서 그림으로 본 구조적 결함이 수로 드러난 셈이다. 참고로 다음 절의 OvO는 똑같은 분할에서 \(1.0000\)을 내며, 소프트맥스도 그렇다.
LogisticRegression의 기본값은 OvR이 아니다
LogisticRegression이 기본으로 OvR을 쓴다는 서술을 자주 보게 되지만, 이는 오래된
정보다. scikit-learn 0.22부터 multi_class='auto'가 기본값이며, solver='liblinear'
이거나 범주가 두 개인 경우를 제외하면 다항(소프트맥스) 방식을 고른다. 나아가
multi_class 인자 자체가 1.5에서 폐기 예고되고 1.7에서 제거되었으며, 이제
LogisticRegression은 언제나 다항 방식으로 적합한다. OvR을 쓰려면 위처럼
OneVsRestClassifier로 명시적으로 감싸야 한다.
고유 다항 소프트맥스 회귀 대신 OvR을 쓰는 것이 언제 유리한지는 소프트맥스와의 비교를 보라.
연습문제¶
연습문제 1. 일대다 대 소프트맥스
4범주 문제에서 일대다(OvR)는 이항 분류기 4개를 학습시키고, 소프트맥스 모형은 고유하게 학습된다.
(a) OvR 분류기들이 어떤 검정 사례에 대해 다음 점수를 냈다.
| 분류기 | P(범주 \(k\) 대 나머지) |
|---|---|
| 범주 1 대 나머지 | 0.80 |
| 범주 2 대 나머지 | 0.65 |
| 범주 3 대 나머지 | 0.40 |
| 범주 4 대 나머지 | 0.55 |
이 확률들이 유효한 확률분포를 이루는가? 설명하라.
(b) OvR 점수로부터 어떻게 예측하는가? 예측 범주는 무엇인가?
(c) 소프트맥스 모형이 같은 사례에 대해 \(\hat{\mathbf{p}} = (0.45, 0.30, 0.10, 0.15)^\top\)을 냈다. 이 확률들은 OvR 점수와 근본적으로 어떻게 다른가?
(d) 고유 소프트맥스 회귀가 OvR 접근보다 나은 점 두 가지를 서술하라.
풀이
(a) 점수의 합이 \(0.80 + 0.65 + 0.40 + 0.55 = 2.40 \ne 1\)이다. 유효한 확률분포가 아니다. 각 OvR 분류기는 그 사례가 자기 범주에 속할 확률을 나머지 전부와 견주어 독립적으로 추정한다. 이 개별 이항 확률들은 합이 1이 되도록 제약되지 않으며, 그 크기는 각각의 이항 모형이 그은 결정경계에 달려 있다.
(b) 표준적인 OvR 예측은 점수가 가장 높은 범주를 고른다. \(\arg\max_k \text{score}_k = 1\), 즉 범주 1이다(점수 0.80). 단순하지만 이 규칙은 동점을 만들 수 있고 보정된 확률을 주지 못한다. 점수를 합으로 나누어 정규화할 수는 있지만 (\(0.80/2.40 = 0.333\)) 임시방편일 뿐 보정을 보장하지 않는다.
(c) 소프트맥스 확률 \(\hat{\mathbf{p}} = (0.45, 0.30, 0.10, 0.15)^\top\)은 정확히 합이 1이고 하나의 모형이 동시에 추정한 값이다. 모든 범주에 대한 정합적인 확률분포를 이루며 소프트맥스 함수를 통해 보정된다. 반면 OvR 점수는 학습 중에 서로 소통하지 않는 독립적인 분류기들에서 나온다.
(d) 고유 소프트맥스가 OvR보다 나은 점 두 가지.
-
보정된 확률: 소프트맥스는 사후 정규화 없이도 본질적으로 유효한 확률분포 (비음수이고 합이 1)를 만든다. 출력을 범주 확률로 직접 해석할 수 있고 하류의 확률적 추론에 그대로 쓸 수 있다.
-
동시 학습: 소프트맥스의 가중행렬은 모든 범주를 동시에 가르도록 최적화되므로 범주 경계들 사이에서 정보를 공유할 수 있다. OvR은 각 분류기를 독립적으로 학습시키므로 다범주 문제의 구조를 활용하지 못한다. 예컨대 범주 1과 2를 가르는 데 유용한 특성이 범주 3과 4를 가르는 데도 도움이 될 수 있지만 OvR은 이를 이용할 수 없다.
선형 모형에서는 두 방식의 표현력이 같다
공정하게 덧붙이면, 기저 분류기가 선형이면 OvR과 소프트맥스 모두 \(C\)개의 선형 점수함수를 학습하고 \(\arg\max\)로 예측하므로 표현 가능한 결정경계의 집합이 같다. 다른 것은 학습 목적함수다. 소프트맥스는 결합 가능도를 최대화하고 OvR은 \(C\)개의 주변 가능도를 따로 최대화한다. 따라서 (d)의 두 번째 항목은 "표현력"이 아니라 "추정 효율과 확률의 정합성"에 관한 이야기로 읽어야 정확하다.
연습문제 2. \(C\)개의 균형 잡힌 범주가 있을 때, OvR 각 이항 문제의 양성 비율은 얼마인가? \(C = 100\)이면 어떤 문제가 생기는가?
풀이
범주가 균형 잡혀 있으면 각 범주의 비율이 \(1/C\)이므로, 이항 부분문제의 양성 비율도 \(1/C\)다.
| \(C\) | 양성 비율 | 양성:음성 |
|---|---|---|
| 3 | \(33.3\%\) | 1:2 |
| 10 | \(10\%\) | 1:9 |
| 100 | \(1\%\) | 1:99 |
| 1000 | \(0.1\%\) | 1:999 |
\(C = 100\)에서의 문제.
- 절대 표본 수 부족. 전체 \(n = 10{,}000\)이라면 각 이항 문제의 양성이 100개뿐이다. 특성 차원이 100을 넘으면 분리가 발생하기 쉽고, 벌점 없이는 계수가 발산한다.
- 점수의 비교 가능성 저하. 각 이항 모형의 절편이 \(\log(1/99) \approx -4.6\) 근처로 내려가 모든 \(f_c(\mathbf{x})\)가 작아진다. \(\arg\max\) 비교 자체는 여전히 작동하지만, 모형마다 보정 상태가 달라 비교가 신뢰하기 어려워진다.
- 계산 비용. 분류기가 100개이므로 학습·저장·추론 비용이 그만큼 늘어난다. 다만 OvO의 \(\binom{100}{2} = 4{,}950\)개보다는 훨씬 낫다.
범주 수가 많으면 고유 소프트맥스가 확실히 유리하다. 모수를 하나의 행렬로 공유하고, 확률이 자동으로 정합적이며, 학습이 한 번으로 끝난다. \(\square\)
연습문제 3. OvR 점수를 합으로 나누어 정규화하는 것이 왜 "임시방편"인지 구체적으로 설명하라. 어떤 상황에서 잘못된 결과를 낳는가?
풀이
정규화 \(\tilde p_c = f_c(\mathbf{x}) / \sum_{c'} f_{c'}(\mathbf{x})\)는 합을 1로 만들 뿐 각 값이 실제 조건부확률에 가까워지도록 하지는 않는다.
문제가 되는 상황 두 가지.
-
모든 점수가 낮을 때. 훈련자료에서 멀리 떨어진 입력에서는 모든 \(f_c\)가 작을 수 있다. 예컨대 \((0.05, 0.04, 0.03, 0.02)\)이면 정규화 결과는 \((0.357, 0.286, 0.214, 0.143)\)으로, 모형이 어느 범주에도 확신이 없다는 중요한 정보가 완전히 사라진다. 정규화 후에는 첫 범주에 상당한 확신이 있는 것처럼 보인다.
-
여러 점수가 높을 때. \((0.9, 0.85, 0.1, 0.05)\)이면 두 분류기가 모두 "내 범주다"라고 주장하는 모순 상태인데, 정규화하면 \((0.45, 0.425, 0.05, 0.025)\)가 되어 마치 두 범주 중 어느 쪽인지 애매하다는 정상적인 상태처럼 보인다. 실제로는 모형들이 서로 충돌하고 있으며, 이는 학습이 잘못되었거나 입력이 분포 밖에 있다는 신호다.
두 경우 모두 정규화가 진단에 필요한 정보를 지운다. 원래 점수를 함께 보관하고, \(\max_c f_c(\mathbf{x})\)가 낮거나 상위 두 점수의 합이 1을 크게 넘으면 예측을 보류하는 편이 낫다.
더 나은 대안: 각 \(f_c\)를 따로 떼어 둔 자료에서 보정한 뒤(플랫 척도화나 등위회귀) 정규화하거나, 애초에 고유 소프트맥스를 쓴다. \(\square\)
정리하며¶
일대다는 이항 분류기 \(C\) 개로 다범주를 푼다.
- 각 범주마다 "이 범주 대 나머지" 분류기를 훈련한다. 이항 알고리즘을 그대로 재사용할 수 있다는 것이 장점이다.
- 예측은 점수가 가장 높은 범주다. 각 분류기의 출력을 비교하며, 그 점수들이 서로 비교 가능한 척도인지는 보장되지 않는다. 보정이 다르면 편향이 생긴다.
- 범주 불균형이 구조적으로 생긴다. 각 부분문제에서 "나머지"가 훨씬 크므로 모든 분류기가 불균형 자료를 다루게 된다.
- 분류기가 \(C\) 개라 학습이 선형으로 는다. 범주가 많으면 부담이 되지만 각각은 전체 자료를 쓴다.
- 소프트맥스와 다르다. 소프트맥스는 범주들을 함께 모형화해 확률의 합이 1 이 되도록 하지만, 일대다는 독립적으로 훈련해 그런 보장이 없다.
다음 절 일대일로 넘어간다.