10 votos

Predicción probabilística de Random Forest frente al voto mayoritario

Scikit aprender parece utilizar predicción probabilística en lugar del voto mayoritario para la técnica de agregación de modelos sin una explicación de por qué (1.9.2.1. Bosques aleatorios).

¿Hay una explicación clara de por qué? Además, ¿existe un buen documento o artículo de revisión sobre las distintas técnicas de agregación de modelos que pueden utilizarse para el ensacado de Random Forest?

Gracias.

10voto

Bauna Puntos 176

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.

0 votos

¡Gran respuesta, Dougal! Gracias por tomarte el tiempo de explicarlo detenidamente. Por favor, considere también ir a desbordamiento de pila y responder a esta pregunta allí .

1 votos

También hay un documento, aquí que aborda la predicción probabilística.

3voto

user777 Puntos 10934

Responder a esta pregunta será difícil. Si la documentación de scikit-learn es tan pobre que no explica lo que hace, será difícil encontrar una fuente "oficial" para responder a esta pregunta. He leído tu enlace varias veces y todavía no está claro lo que los autores quieren decir -- los autores afirman que ellos no siguen un método publicado (o si siguen un método publicado, ¡no lo citan!), lo que pide desesperadamente que se explique lo que do en su lugar.

Como mínimo, se les podría pedir que explicasen por qué consideran adecuado hacer las cosas de forma diferente a como lo hace el Dr. Breiman, de quien creo que podemos suponer que sabía un poco sobre bosques aleatorios.

Pero ¡ni siquiera está claro que scikit-learn parta del Dr. Brieman! A otra página de scikit-learn sobre conjuntos de bosques aleatorios dice que, de hecho, las predicciones se construyen por mayoría de votos entre los árboles. La cita directa:

predict(X) P La clase predicha de una muestra de entrada se calcula como la predicción mayoritaria de los árboles del bosque.

Esta descripción no dice nada sobre promediar probabilidades; de hecho, afirma literalmente que evalúa el voto mayoritario.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X