MultiOutputClassifierからpredict_probaを理解する


28

scikit-learn Webサイトでこのをフォローして、ランダムフォレストモデルでマルチ出力分類を実行しています。

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_proba、2つの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_samplen_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に属する確率を指し、2番目のインデックスはデータがクラス1に属する確率を指します。

これら2つの合計は1になります。

その後、次の方法で結果を出力できます。

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

k個のクラスがある場合、出力は(N、k)になり、どのクラスの確率が必要かを指定する必要があります。


2
この場合、クラスごとに2つの列がある理由についてはまだ混乱しています。各クラスに独自のエントリがある場合、各エントリはそのクラスの確率を示すために(N、1)行列にすべきではありませんか?
ハーパル

2
2つのクラスの2つの列。target(0,1)を定義するときに2つのクラスがあることを思い出してください。各行/データポイントには、0と1の両方で予測が必要です。たとえば、datapoint1は0に属する可能性が80%、1に属する可能性が20%です。出力は(0.8,0.2)になります。uは、一般的なアクセス予測では1のための予測をしたい場合は、2番目の列を取得するには:[1]あなたはアクセスpredicitonに必要な[:、K]は、K番目のクラスの可能性をしたい場合
chrisckwong821

1
これは、質問が多出力モデルに関するものであることを無視しているようです。
ベンライニガー

2

では、MultiOutputClassifier2つの出力を別々の分類タスクとして扱っています。リンクしたドキュメントから:

この戦略は、ターゲットごとに1つの分類子を適合させることで構成されます。

したがって、結果のリストの2つの配列は、2つの分類子/従属変数のそれぞれを表します。配列は、@ chrisckwong821が言及したバイナリ分類出力(クラス0の確率、クラス1の確率である列)ですが、問題ごとに1つです。

言い換えれば、の戻り値はpredict_proba、長さがyourの幅に等しいリストになります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配列の2番目の列は「テストサンプルが最初のクラスとして分類される確率「。

同様に、2番目の5x2配列は、2番目のクラスのサンプルをテストする分類確率を提供します。

これを確認する場合は、これらの配列の値との結果を比較できますpredict

場合によっては、の戻りにより、predict_probaNx1配列とNx2配列を含むリストが表示されることがあります。その場合、テストデータはクラスを表すNx1配列に分類されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.