다운로드
작성자: admin 작성일시: 2016-06-12 19:46:49 조회수: 4482 다운로드: 341
카테고리: 머신 러닝 태그목록:

다중 클래스 분류

종속변수의 클래스가 2개인 경우를 이진(Binary Class) 분류 문제, 클래스가 3개 이상인 경우를 다중 클래스(Multi-Class) 분류 문제라고 한다. 다중 클래스 분류 문제는 OvO (One-Vs-One) 방법이나 OvR (One-vs-the-Rest) 방법 등을 이용하면 여러개의 이진 클래스 분류 문제로 변환하여 풀 수 있다.

OvO (One-Vs-One)

OvO (One-Vs-One) 방법은 $K$개의 타겟 클래스가 존재하는 경우, 이 중 2개의 클래스 조합을 선택하여 $K(K - 1)/2$개의 이진 클래스 분류 문제를 풀고 이진판별을 통해 가장 많은 판별값을 얻은 클래스를 선택하는 방법이다.

실제로는 선택받은 횟수가 같은(tie case)가 나올 수 있기 때문에 각 클래스가 얻은 조건부 확률값을 모두 더한 값을 비교하여 가장 큰 조건부 확률 총합을 가진 클래스를 선택한다.

OneVsOneClassifier 클래스를 사용하면 이진 클래스용 모형을 OvO 방법으로 다중 클래스용 모형으로 변환한다. OneVsOneClassifier 클래스는 각 클래스가 얻는 조건부 확률값을 합한 값을 decision_function으로 출력한다.

In [1]:
from sklearn.datasets import load_iris
iris = load_iris()

from sklearn.multiclass import OneVsOneClassifier
from sklearn.linear_model import LogisticRegression

model_ovo = OneVsOneClassifier(LogisticRegression()).fit(iris.data, iris.target)

ax1 = plt.subplot(211)
pd.DataFrame(model_ovo.decision_function(iris.data)).plot(ax=ax1, legend=False)
plt.title("판별 함수")
ax2 = plt.subplot(212)
pd.DataFrame(model_ovo.predict(iris.data), columns=["prediction"]).plot(marker='o', ls="", ax=ax2)
plt.title("클래스 판별")
plt.tight_layout()
plt.show()

OvR (One-vs-the-Rest)

OvO 방법은 클래스의 수가 많아지면 실행해야 할 이진 판별 문제의 수가 너무 많아진다.

OvR(One-vs-the-Rest) 방법은 $K$개의 클래스가 존재하는 경우, 각각의 클래스에 대해 표본이 속하는지(y=1) 속하지 않는지(y=0)의 이진 분류 문제를 푼다. OvO와 달리 클래스 수만큼의 이진 분류 문제를 풀면 된다.

OvR에서도 판별 결과의 수가 같은 동점 문제가 발생할 수가 있기 때문에 각 클래스가 얻은 조건부 확률값을 더해서 이 값이 가장 큰 클래스를 선택한다.

OneVsRestClassifier 클래스를 사용하면 이진 클래스용 모형을 OvR 방법으로 다중 클래스용 모형으로 변환한다.

In [2]:
from sklearn.multiclass import OneVsRestClassifier
from sklearn.linear_model import LogisticRegression

model_ovr = OneVsRestClassifier(LogisticRegression()).fit(iris.data, iris.target)

ax1 = plt.subplot(211)
pd.DataFrame(model_ovr.decision_function(iris.data)).plot(ax=ax1, legend=False)
plt.title("판별 함수")
ax2 = plt.subplot(212)
pd.DataFrame(model_ovr.predict(iris.data), columns=["prediction"]).plot(marker='o', ls="", ax=ax2)
plt.title("클래스 판별")
plt.tight_layout()
plt.show()

Label Binarizer는 y 즉 종속변수의 클래스를 one-hot-encoding 하기 위한 명령이다. 이렇게 하면 각 열은 OvR 문제를 풀기위한 y 값이 된다.

질문/덧글

질문있습니다. rhlf*** 2017년 3월 1일 3:26 오후

pd.DataFrame(model1.decision_function(iris.data)).plot(ax=ax1)
이 코드에서 ax가 의미하는게 무엇인지 궁금합니다. 찾아보니까 axes instance라고 하는데 자세히 설명부탁드려요

답변: 질문있습니다. 관리자 2017년 3월 12일 11:42 오전

그래프의 axes 객체를 의미합니다. 자세한 내용은 matplotlib 설명을 읽어보세요.

[https://www.datascienceschool.net/view-notebook/d0b1637803754bb083b5722c9f2209d0/#그림의-구조](https://www.datascienceschool.net/view-notebook/d0b1637803754bb083b5722c9f2209d0/#그림의-구조)

"타겟 클래스가 2개 이상인 경우를 다중 클래스 분류(Multi-Class Classification) 문제라고 한다"는 3개 이상이 되어야 하는 것 아닌가요?? ggah*** 2018년 3월 25일 9:37 오후

분류문제에서 타겟 클래스가 최소한 2개여야 할 것 같은데, 그렇다면 모든 문제가 multi-class 가 되는건가요??
"타겟 클래스가 2개 이상인 경우를 다중 클래스 분류(Multi-Class Classification) 문제라고 한다"는 혹시 2개가 아니라 3개 이상이 되어야 하는 것 아닌가요??

답변: "타겟 클래스가 2개 이상인 경우를 다중 클래스 분류(Multi-Class Classification) 문제라고 한다"는 3개 이상이 되어야 하는 것 아닌가요?? 관리자 2018년 11월 26일 8:45 오후

수정하였습니다. 지적 감사합니다.

OvR(One-vs-the-Rest) 방법은 K 개의 클래스가 존재하는 경우, 각각의 클래스에 대해 표본이 속하는지(y=1) 속하지 않는지(y=0)의 이진 분류 문제를 '픈'다. aod8*** 2018년 11월 28일 12:17 오전

작은 오타가 있습니다.

OvR(One-vs-the-Rest) 방법은 K 개의 클래스가 존재하는 경우, 각각의 클래스에 대해 표본이 속하는지(y=1) 속하지 않는지(y=0)의 이진 분류 문제를 '픈'다.
>> '푼'다.

감사합니다.

답변: OvR(One-vs-the-Rest) 방법은 ... 관리자 2018년 11월 28일 1:25 오후

수정하였습니다. 지적 감사합니다.