ランダムフォレストの確率的予測と多数決


10

Scikitの学習で、モデル集約手法に多数決投票ではなく確率的予測を使用しているようですが、その理由は説明されていません(1.9.2.1。ランダムフォレスト)。

理由は明確に説明されていますか?さらに、ランダムフォレストのバギングに使用できるさまざまなモデル集約手法に関する優れた論文またはレビュー記事はありますか?

ありがとう!

回答:


10

このような質問は、Pythonに堪能であれば、コードを調べることで常に最もよく答えられます。

RandomForestClassifier.predict、少なくとも現在のバージョン0.16.1では、で与えられるように、確率推定値が最も高いクラスを予測しpredict_probaます。(この行

のドキュメントはpredict_proba言う:

入力サンプルの予測クラス確率は、フォレスト内のツリーの平均予測クラス確率として計算されます。単一ツリーのクラス確率は、リーフ内の同じクラスのサンプルの割合です。

元の方法との違いは、おそらくとpredict一致する予測を提供するためですpredict_proba。結果は、元のブライマン紙で使用された「ハード」多数決ではなく、「ソフト投票」と呼ばれることもあります。2つの方法のパフォーマンスの適切な比較をすばやく検索して見つけることはできませんでしたが、どちらもこの状況ではかなり妥当に思えます。

predictドキュメントはかなり誤解を招く最高の状態です。修正リクエストを提出ました。

代わりに多数決投票を行いたい場合は、次の関数を使用してください。predict_majvote(clf, X)ではなく、のように呼び出しclf.predict(X)ます。(に基づいてpredict_proba、軽くテストされただけですが、うまくいくと思います。)

from scipy.stats import mode
from sklearn.ensemble.forest import _partition_estimators, _parallel_helper
from sklearn.tree._tree import DTYPE
from sklearn.externals.joblib import Parallel, delayed
from sklearn.utils import check_array
from sklearn.utils.validation import check_is_fitted

def predict_majvote(forest, X):
    """Predict class for X.

    Uses majority voting, rather than the soft voting scheme
    used by RandomForestClassifier.predict.

    Parameters
    ----------
    X : array-like or sparse matrix of shape = [n_samples, n_features]
        The input samples. Internally, it will be converted to
        ``dtype=np.float32`` and if a sparse matrix is provided
        to a sparse ``csr_matrix``.
    Returns
    -------
    y : array of shape = [n_samples] or [n_samples, n_outputs]
        The predicted classes.
    """
    check_is_fitted(forest, 'n_outputs_')

    # Check data
    X = check_array(X, dtype=DTYPE, accept_sparse="csr")

    # Assign chunk of trees to jobs
    n_jobs, n_trees, starts = _partition_estimators(forest.n_estimators,
                                                    forest.n_jobs)

    # Parallel loop
    all_preds = Parallel(n_jobs=n_jobs, verbose=forest.verbose,
                         backend="threading")(
        delayed(_parallel_helper)(e, 'predict', X, check_input=False)
        for e in forest.estimators_)

    # Reduce
    modes, counts = mode(all_preds, axis=0)

    if forest.n_outputs_ == 1:
        return forest.classes_.take(modes[0], axis=0)
    else:
        n_samples = all_preds[0].shape[0]
        preds = np.zeros((n_samples, forest.n_outputs_),
                         dtype=forest.classes_.dtype)
        for k in range(forest.n_outputs_):
            preds[:, k] = forest.classes_[k].take(modes[:, k], axis=0)
        return preds

私が試したばかげた合成のケースでは、予測はそのpredict方法と毎回一致しました。


素晴らしい答え、ドゥガル!これを注意深く説明する時間を割いていただきありがとうございます。スタックオーバーフローについても検討し、そこでこの質問に答えることを検討してください。
user1745038 2015

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