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_proba
sagt:
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 predict
Vorhersagen ü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 predict
Dokumentation 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 predict
jedes Mal mit der Methode überein .