Método de puntuación RandomForestClassifier OOB

16

¿La implementación aleatoria del bosque en scikit-learn utiliza la precisión media como método de puntuación para estimar el error de generalización con muestras fuera de bolsa? Esto no se menciona en la documentación, pero el método score () informa la precisión media.

Tengo un conjunto de datos altamente desequilibrado, y estoy usando AUC de ROC como mi métrica de puntuación en la búsqueda de la cuadrícula. ¿Hay alguna manera de decirle al clasificador que use el mismo método de puntuación en las muestras OOB también?

darXider
fuente
¿El parámetro oob_score de la clase RandomForestClassifier no hace lo que quieres?
Pierre
AFAIK, oob_scoreinforme la precisión. Aunque necesito mirar el código fuente nuevamente.
darXider
¿Qué parámetro estás estimando con tu búsqueda de cuadrícula?
JahKnows
^ Lo siento, pero realmente no recuerdo ahora! Hice esta pregunta hace 1,5 años.
darXider

Respuestas:

14

En general, el rendimiento de los clasificadores se compara utilizando la precisión, esta es una medida del número de instancias clasificadas correctamente dividido por el número total de instancias. Sin embargo, a partir de los datos de entrenamiento podemos obtener una mejor aproximación del error esperado de nuestro clasificador cuando usamos técnicas de ensamble o aprendizaje conjunto.

Error fuera de bolsa

Esta métrica es la precisión de los ejemplos usan todos los árboles en el conjunto de bosque aleatorio para el que se omitió durante el entrenamiento. Por lo tanto, actúa como una instancia de semi-prueba. Puede tener una idea de qué tan bien su clasificador puede generalizar usando esta métrica.xi

Para implementar oob en sklearn, debe especificarlo al crear su objeto Random Forests como

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)

Entonces podemos entrenar al modelo

forest.fit(X_train, y_train)
print('Score: ', forest.score(X_train, y_train))

Puntuación: 0.979921928817

Como se esperaba, la precisión del modelo al evaluar el conjunto de entrenamiento es muy alta. Sin embargo, esto no tiene sentido porque puede muy bien estar ajustando sus datos y, por lo tanto, su modelo es basura. Sin embargo, podemos usar el puntaje de la bolsa como

print(forest.oob_score_)

0.86453272101

Esta es la precisión al evaluar nuestras instancias en el conjunto de entrenamiento utilizando solo los árboles para los que fueron omitidos. Ahora calculemos el puntaje en el conjunto de pruebas como

print('Score: ', forest.score(X_test, y_test))

Puntuación: 0.86517733935

Vemos que la precisión medida por Oob es muy similar a la obtenida con el conjunto de pruebas. Por lo tanto, sigue la teoría de que la precisión de Oob es una mejor métrica para evaluar el rendimiento de su modelo en lugar de solo la puntuación. Esto es una consecuencia de los modelos de ensacado y no se puede hacer con otros tipos de clasificadores.

Cálculo de oob usando diferentes métricas

¡Sí, usted puede hacer esto! Sin embargo, depende de cómo esté estructurado exactamente su código. No estoy seguro de cómo puede incluir el oob y el AUC junto con la cross_val_scorefunción. Sin embargo, si está haciendo los pliegues de validación cruzada manualmente, puede hacer lo siguiente, el algoritmo de bosques aleatorios en sklearn le proporciona la función de decisión del oob como

print(forest.oob_decision_function_)

La clase se puede obtener usando

from sklearn import metrics
pred_train = np.argmax(forest.oob_decision_function_,axis=1)

Entonces podemos calcular el AUC usando lo siguiente

metrics.roc_auc_score(y_train, pred_train)

0.86217157846471204

JahKnows
fuente
44
¡Gracias! Soy consciente de cómo funciona el proceso OOB en bosques aleatorios. Estaba preguntando específicamente si RandomForestClassifierpuede devolver un puntaje OOB que NO sea la precisión, y la segunda parte de su respuesta proporciona una muy buena pista sobre cómo abordar este problema. Sin embargo, debo enfatizar que no se deben usar las etiquetas de clase para calcular el AUC de la curva ROC; más bien, las probabilidades de clase deberían usarse directamente. Entonces, la definición correcta sería pred_train = forest.oob_decision_function_[:, 1].
darXider
@darXider ¿No es esto sombrío, ya que forest.oob_decision_function_.shape [0] == X_train.shape [0], mientras que esperaría que sea == número de muestras OOB, que debería ser menor que el número de muestras en X_train? Además, personalmente estaba interesado en calcular el logloss, para otros que quieran hacer esto también, creo que pred_train debería ser = forest.oob_decision_function_ en su lugar.
Sander Vanden Hautte