Siempre es mejor responder a estas preguntas mirando el código, si dominas Python.
RandomForestClassifier.predict
, al menos en la versión actual 0.16.1, predice la clase con mayor estimación de probabilidad, dada por predict_proba
. ( esta línea )
La documentación de predict_proba
dice:
Las probabilidades de clase predichas de una muestra de entrada se calculan como la media de las probabilidades de clase predichas de los árboles del bosque. La probabilidad de clase probabilidad de clase de un único árbol es la fracción de muestras del mismo clase en una hoja.
La diferencia con el método original es probablemente sólo para que predict
ofrece predicciones coherentes con predict_proba
. El resultado se denomina a veces "voto suave", en lugar del voto mayoritario "duro" utilizado en el documento original de Breiman. En una búsqueda rápida no he podido encontrar una comparación adecuada del rendimiento de los dos métodos, pero ambos parecen bastante razonables en esta situación.
En predict
documentación es, en el mejor de los casos, bastante engañosa; he presentado una pull request para arreglarlo.
Si en lugar de eso quieres hacer una predicción por mayoría de votos, aquí tienes una función para hacerlo. Llámala como predict_majvote(clf, X)
en lugar de clf.predict(X)
. (Basado en predict_proba
; sólo ligeramente probado, pero creo que debería funcionar).
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
En el tonto caso sintético que traté, las predicciones estaban de acuerdo con el predict
cada vez.