MultiOutputClassifier의 predict_proba 이해


28

scikit-learn 웹 사이트 에서이 예제 를 따라 임의 포리스트 모델로 다중 출력 분류를 수행합니다.

from sklearn.datasets import make_classification
from sklearn.multioutput import MultiOutputClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.utils import shuffle
import numpy as np

X, y1 = make_classification(n_samples=5, n_features=5, n_informative=2, n_classes=2, random_state=1)
y2 = shuffle(y1, random_state=1)
Y = np.vstack((y1, y2)).T

forest = RandomForestClassifier(n_estimators=10, random_state=1)
multi_target_forest = MultiOutputClassifier(forest, n_jobs=-1)
multi_target_forest.fit(X, Y).predict(X)

print(multi_target_forest.predict_proba(X))

이것으로부터 predict_proba2 5x2 배열을 얻습니다.

[array([[ 0.8,  0.2],
       [ 0.4,  0.6],
       [ 0.8,  0.2],
       [ 0.9,  0.1],
       [ 0.4,  0.6]]), array([[ 0.6,  0.4],
       [ 0.1,  0.9],
       [ 0.2,  0.8],
       [ 0.9,  0.1],
       [ 0.9,  0.1]])]

나는 정말 기다리고 있었다 n_sample의해 n_classes매트릭스. 나는 이것이 클래스의 확률과 어떻게 관련되는지 이해하려고 애 쓰고 있습니다.

문서 에 대한 predict_proba상태 :

모양의 배열 = [n_samples, n_classes] 또는 n_outputs> 1 인 경우 이러한 배열과 같은 n_outputs 목록

입력 샘플의 클래스 확률. 클래스의 순서는 classes_ 속성의 순서와 일치합니다.

나는 설명에 후자가 있다고 생각하지만, 이것이 이것이 내 클래스 확률과 어떻게 관련되는지 이해하기 위해 여전히 고심하고 있습니다.

또한 모델 의 classes_속성에 액세스하려고하면 이 속성이에 없습니다 . 클래스를 출력과 어떻게 관련시킬 수 있습니까?forestAttributeErrorMultiOutputClassifier

print(forest.classes_)

AttributeError: 'RandomForestClassifier' object has no attribute 'classes_'

답변:


31

목표가 (0,1)이라고 가정하면 분류기는 차원 (N, 2)의 확률 행렬을 출력합니다. 첫 번째 인덱스는 데이터가 클래스 0에 속할 확률을 나타내고 두 번째 인덱스는 데이터가 클래스 1에 속할 확률을 나타냅니다.

이 둘은 1로 합산됩니다.

그런 다음 다음과 같이 결과를 출력 할 수 있습니다.

probability = model.predict_proba(X)[:,1]

k 개의 클래스가있는 경우 출력은 (N, k)가되고 원하는 클래스의 확률을 지정해야합니다.


2
이 경우에도 각 클래스마다 두 개의 열이있는 이유에 대해 여전히 혼란 스럽습니다. 각 클래스에 고유 항목이있는 경우 각 항목이 해당 클래스의 확률을 설명하기 위해 (N, 1) 행렬이 아니어야합니까?
Harpal

2
두 클래스에 대한 두 개의 열을 사용하면 target (0,1)을 정의 할 때 두 개의 클래스가 있음을 상기하십시오. 각 행 / 데이터 포인트는 0과 1 둘 다에 대한 예측이 필요합니다. 예를 들어 datapoint1은 0에 속할 가능성이 80 %이고 1에 속할 가능성이 20 %입니다. 출력은 (0.8,0.2)입니다. 는 액세스 prediciton 필요 [: 1] : K]는 번째 클래스 k 번째의 가능성을 원한다면 U 일반적인 액세스 예측 1. 대한 예측을 할 경우, 두 번째 열을 얻을
chrisckwong821

1
이것은 다중 출력 모델에 대한 질문이라는 것을 무시하는 것 같습니다.
벤 레이니 거

2

에서 MultiOutputClassifier, 당신은 별도의 분류 작업과 두 개의 출력을 치료하고, 연결 한 문서에서 :

이 전략은 대상 당 하나의 분류기를 맞추는 것으로 구성됩니다.

따라서 결과 목록의 두 배열은 두 분류 자 ​​/ 종속 변수 각각을 나타냅니다. 그러면 배열은 @ chrisckwong821이 언급 한 이진 분류 출력 (클래스 0의 확률, 클래스 1의 확률 인 열)이지만 각 문제마다 하나씩입니다.

다시 말해,의 반환 값은 predict_proba길이가 너비와 동일한 목록 y, 즉 n_outputs귀하의 경우 2입니다. predict_proba문서 참조에 대한 인용문은 다음 문서 n_outputs에 소개되어 있습니다 fit.

fit(self, X, y[, sample_weight])

y : (희소 한) 배열과 같은 모양 (n_samples, n_outputs)


나는 당신의 의견에 동의합니다. 가장 많이 찬성 한 대답은 질문에 대답하지 않으며, 왜 (N, 2) 모양 의 배열 이 있는지 설명하지 않습니다 . 당신의 대답 질문에 대한 답입니다 :n_outputs
The Red Pea

1
고마워, 나는 다른 답변이 그렇게 많이 투표되었다는 사실에 놀랐다. 편집 해 주셔서 감사합니다!
벤 레이니 거

0

첫 번째 질문 :

첫 번째 5x2 배열은 첫 번째 클래스로 분류 된 5 개의 테스트 샘플의 확률을 제공합니다. 또한이 5x2 배열의 첫 번째 열에는 "테스트 샘플이 첫 번째 클래스로 분류되지 않을 확률"이 표시되고이 5x2 배열의 두 번째 열에는 "테스트 샘플이 첫 번째 클래스로 분류 될 확률이 표시됩니다. ".

마찬가지로 두 번째 5x2 배열은 두 번째 클래스에서 샘플을 테스트 할 확률을 제공합니다.

이를 확인하려면 해당 배열의 값을의 결과와 대조 할 수 있습니다 predict.

때때로의 반환은 predict_probaNx1 배열과 Nx2 배열을 포함하는 목록을 제공 할 수 있습니다. 그렇다면 테스트 데이터는 Nx1 배열로 표시된 클래스로 분류되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.