Random Forest Probabilistic Prediction gegen Mehrheitswahl


10

Scikit Learn scheint für die Modellaggregationstechnik eine probabilistische Vorhersage anstelle einer Mehrheitsentscheidung zu verwenden, ohne zu erklären, warum (1.9.2.1. Random Forests).

Gibt es eine klare Erklärung dafür, warum? Gibt es außerdem ein gutes Papier oder einen Übersichtsartikel für die verschiedenen Modellaggregationstechniken, die für das Absacken von Random Forest verwendet werden können?

Vielen Dank!

Antworten:


10

Solche Fragen lassen sich am besten immer anhand des Codes beantworten, wenn Sie Python fließend beherrschen.

RandomForestClassifier.predict, zumindest in der aktuellen Version 0.16.1, sagt die Klasse mit der höchsten Wahrscheinlichkeitsschätzung voraus, wie durch gegeben predict_proba. ( diese Zeile )

Die Dokumentation für predict_probasagt:

Die vorhergesagten Klassenwahrscheinlichkeiten einer Eingabestichprobe werden als die mittleren vorhergesagten Klassenwahrscheinlichkeiten der Bäume im Wald berechnet. Die Klassenwahrscheinlichkeit eines einzelnen Baums ist der Bruchteil von Stichproben derselben Klasse in einem Blatt.

Der Unterschied zur ursprünglichen Methode ist wahrscheinlich nur so, dass predictVorhersagen übereinstimmen, die mit übereinstimmen predict_proba. Das Ergebnis wird manchmal als "weiche Abstimmung" bezeichnet und nicht als "harte" Mehrheitsabstimmung, die im ursprünglichen Breiman-Papier verwendet wird. Ich konnte bei der schnellen Suche keinen geeigneten Vergleich der Leistung der beiden Methoden finden, aber beide scheinen in dieser Situation ziemlich vernünftig zu sein.

Die predictDokumentation ist bestenfalls irreführend; Ich habe eine Pull-Anfrage eingereicht, um das Problem zu beheben.

Wenn Sie stattdessen eine Mehrheitsentscheidung treffen möchten, finden Sie hier eine Funktion, um dies zu tun. Nennen Sie es predict_majvote(clf, X)eher wie als clf.predict(X). (Basierend auf predict_proba; nur leicht getestet, aber ich denke, es sollte funktionieren.)

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

Bei dem dummen synthetischen Fall, den ich ausprobiert habe, stimmten die Vorhersagen predictjedes Mal mit der Methode überein .


Tolle Antwort, Dougal! Vielen Dank, dass Sie sich die Zeit genommen haben, dies sorgfältig zu erklären. Bitte denken Sie auch daran, den Stapelüberlauf zu durchlaufen und diese Frage dort zu beantworten .
user1745038

1
Es gibt auch ein Papier, hier , die probabilistische Vorhersage anspricht.
user1745038
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.