web-dev-qa-db-ja.com

クラスまたはクラス確率を予測しますか?

現在、分類問題のデータセットにH2Oを使用しています。 python 3.6環境で_H2ORandomForestEstimator_を使用してテストしています。predictメソッドの結果が0〜1の値を示していることに気付きました(これが確率であると想定しています) 。

私のデータセットでは、ターゲット属性は数値です。つまり、True値は1で、False値は0です。ターゲット属性のタイプにカテゴリに変換したことを確認しましたが、まだ同じ結果。

次に、H2OFrameでasfactor()メソッドを使用してターゲット列を因数に変換するようにコードを変更しましたが、結果に変更はありませんでした。

しかし、target属性の値をそれぞれ1と0でTrueとFalseに変更すると、期待される結果が得られました(つまり、出力は確率ではなく分類でした)。

  • 分類された予測結果を取得する正しい方法は何ですか?
  • 確率が数値目標値の結果である場合、マルチクラス分類の場合にそれをどのように処理しますか?
10
Rahul

原則と理論では、ハードとソフトの分類(つまり、クラス確率をそれぞれ返す)は異なるアプローチであり、それぞれに自分の長所と短所。たとえば、紙から次のことを考えてみてください ハードまたはソフト分類?大きなマージンの統合マシン

マージンベースの分類器は、分類問題の機械学習と統計の両方で人気があります。多数の分類子のうち、一部はhard分類子であり、一部はsoft分類子です。ソフト分類器は、クラスの条件付き確率を明示的に推定し、推定された確率に基づいて分類を実行します。対照的に、ハード分類器は、確率推定を生成せずに、分類決定境界を直接ターゲットにします。これらの2つのタイプの分類子は、異なる哲学に基づいており、それぞれに独自のメリットがあります。

とは言っても、実際には、ランダムフォレストを含む今日使用されるほとんどの分類子(私が考えることができる唯一の例外はSVMファミリーです)は実際にはsoft分類子です:実際にその下に生成されるのは確率のような測度であり、その後暗黙的なthreshold(通常、バイナリの場合はデフォルトで0.5)と組み合わされて、0/1True/Falseのようなハードクラスメンバーシップを与えます。

分類された予測結果を取得する正しい方法は何ですか?

まず第一に、確率からハードクラスに行くことは常に可能ですが、その逆は当てはまりません。

一般的に言って、あなたの分類子が実際にsoftであるという事実を考えると、最後のハード分類(True/False)だけを取得すると、プロセスに「ブラックボックス」の味が与えられます。原則として望ましくないはずです。ここでは、生成された確率を直接処理し、判定しきい値を明示的に制御することが重要です。私の経験によれば、これらはしばしば新しい開業医に失われる繊細さです。たとえば、相互検証済みスレッド 分類確率のしきい値 から、次のことを検討してください。

新しいサンプルの各クラスの確率を出力すると、運動の統計コンポーネントが終了します。新しい観測値を1と0として分類するしきい値を選択しても、statisticsの一部ではなくなります。これはdecisionコンポーネントの一部です。

上記のような「ソフト」引数(意図されていない)とは別に、基礎となる確率としきい値を直接処理する必要がある場合があります。バイナリ分類のデフォルトのしきい値0.5は、クラスが不均衡な場合に特に迷います。そのような場合の具体的な例については、 AUCが高いが不均衡なデータによる予測が悪い (およびその中のリンク)の私の回答を参照してください。

正直なところ、私はあなたが報告するH2Oの動作(私は個人的には使用していません)にかなり驚いています。つまり、出力の種類は入力の表現に影響されます。これは当てはまらないはずであり、実際にそうである場合は、設計に問題がある可能性があります。たとえば、2つの異なるメソッド predict および predict_proba を含むscikit-learnのランダムフォレスト分類子を比較して、ハード分類と基礎となる確率を取得します。それぞれ(およびドキュメントを確認すると、predictの出力が確率推定に基づいていることが明らかです。

確率が数値目標値の結果である場合、マルチクラス分類の場合にそれをどのように処理しますか?

単純なしきい値が意味をなさなくなったという事実を除いて、ここでは原則として新しいものはありません。再び、ランダムフォレストから predict scikit-learnのドキュメント:

予測されたクラスは、平均確率推定値が最も高いクラスです

つまり、3つのクラス(0, 1, 2)の場合、[p0, p1, p2]の推定値が得られ(確率の規則に従って要素の合計が1になる)、予測されたクラスが最も確率の高いクラスになります。 [0.12, 0.60, 0.28]の場合のクラス#1。以下は 再現可能な例 であり、3クラスのアイリスデータセットを使用しています(GBMアルゴリズムとRの場合ですが、理論的根拠は同じです)。

12
desertnaut

@desertnautの回答に追加し、この質問にPythonのタグを付けたので、質問の最後の部分を処理する方法を次に示します。

確率が数値目標値の結果である場合、マルチクラス分類の場合にそれをどのように処理しますか?

y_pred = np.argmax(prob, axis=1)

これにより、確率値の(num_examples, n_classes)配列が予測クラスの(num_examples, )配列に変換されます。

4
doodhwala