¿Cuál es un buen puntaje oob para bosques aleatorios con sklearn, clasificación de tres clases? [duplicar]

8

Tengo datos de aprendizaje que consisten en ~ 45k muestras, cada una tiene 21 características. Estoy tratando de entrenar un clasificador de bosque aleatorio en estos datos, que está etiquetado en 3 clases (-1, 0 y 1). Las clases son más o menos iguales en sus tamaños.

Mi modelo de clasificador de bosque aleatorio está utilizando ginicomo criterio de calidad dividida, el número de árboles es 10 y no he limitado la profundidad de un árbol.

La mayoría de las características han mostrado una importancia insignificante: la media es aproximadamente del 5%, un tercio de ellas es de importancia 0, un tercio de ellas es de importancia superior a la media.

Sin embargo, quizás el hecho más llamativo es el puntaje de oob (fuera de bolsa): un poco menos del 1%. Me hizo pensar que el modelo falla, y de hecho, al probar el modelo en un nuevo conjunto independiente de tamaño ~ 40k, obtuve una puntuación del 63% (hasta ahora suena bien), pero una inspección más profunda de la matriz de confusión me ha demostrado que el El modelo solo tiene éxito para la clase 0, y falla en aproximadamente el 50% de los casos cuando se trata de decidir entre 1 y -1.

Salida de Python adjunta:

array([[ 7732,   185,  6259],
       [  390, 11506,   256],
       [ 7442,   161,  6378]])

Esto se debe naturalmente a que la clase 0 tiene propiedades especiales que hacen que sea mucho más fácil predecir. Sin embargo, ¿es cierto que el puntaje de Oob que he encontrado ya es una señal de que el modelo no es bueno? ¿Cuál es un buen puntaje oob para bosques aleatorios ? ¿Existe alguna ley general que ayude a determinar si un modelo es "bueno", utilizando el puntaje de Oob solo o en combinación con algunos otros resultados del modelo?


Editar: después de eliminar datos incorrectos (aproximadamente un tercio de los datos), las etiquetas fueron más o menos 2% para 0 y 49% para cada uno de -1 / + 1. El puntaje oob fue de 0.011 y el puntaje en los datos de la prueba fue de 0.49, con una matriz de confusión apenas sesgada hacia la clase 1 (aproximadamente 3/4 de las predicciones).

Llevar una vida de soltero
fuente
2
Para aclarar. ¿Estás usando scikit learn ? ¿Y está informando un puntaje de oob <.001? Luego, utilizando la función .score en los nuevos datos, ¿obtiene .63? En general, he encontrado que las puntuaciones de Oob reflejan o subestiman ligeramente las puntuaciones de validación cruzada. Creo que los puntajes en la clasificación de aprendizaje de scikit son la precisión media en todas las clases (si estoy leyendo los documentos, ¿no?), Por lo que no deberían compararse directamente con la precisión general / no media, pero esto depende de la implementación y no debería causar esto Una gran discrepancia.
Ryan Bressler
Sí, estoy usando scikit learn, el puntaje de Oob fue un poco inferior a 0.01 , y el puntaje en los datos de la prueba fue de aproximadamente .63.
Bach
¿Sus filas son independientes o tiene mediciones repetidas del mismo caso (o de otra manera datos jerárquicos / agrupados)? Además: aclare: ¿su "puntaje" de Oob es una medida de error o una medida de acuerdo?
Cbeleites descontento con SX
Mis filas no se repiten, pero pueden ser dependientes. Creo que scikit's oob_scorees una puntuación, es decir, una medida de acuerdo. Sin embargo, no pude encontrarlo documentado.
Bach
Una búsqueda rápida me llevó a la página de manual de bosque aleatorio, donde dice "oob_score: bool Si usar muestras de fábrica para estimar el error de generalización", así que esto me parece una medida de error. Si esto es cierto, su estimación de Oob es muy optimista, lo que sería un "síntoma" esperado de las filas dependientes.
Cbeleites descontento con SX

Respuestas:

4

RF de sklearn oob_score_(tenga en cuenta el subrayado final) en serio no es muy inteligible en comparación con R, después de leer el documento de sklearn y el código fuente. Mi consejo sobre cómo mejorar su modelo es el siguiente:

  1. La RF de sklearn solía usar el terrible valor predeterminado de max_features=1(como en "probar todas las funciones en cada nodo"). Entonces ya no se trata de una selección aleatoria de columnas (/ características) como un bosque aleatorio. Cambie esto a eg max_features=0.33(como R's mtry) y vuelva a ejecutar. Cuéntanos los nuevos puntajes.

  2. "La mayoría de las características han demostrado una importancia insignificante" . Luego, debe hacer la Selección de funciones, según el documento , para la clasificación. Vea el documento y otros artículos aquí en CrossValidated.SE. Realice el FS en un grupo de espera diferente (digamos 20-30%) que el resto del entrenamiento, usando p sklearn.cross_validation.train_test_split(). Ej. (Sí, el nombre es un poco engañoso). Ahora dinos los puntajes que obtienes después de FS?

  3. Usted dijo "después de eliminar datos incorrectos (aproximadamente un tercio de los datos), las etiquetas fueron más o menos 2% para 0 y 49% para cada uno de -1 / + 1" ; entonces tienes un desequilibrio de clase severo . Además: "la matriz de confusión muestra que el modelo solo tiene éxito para la clase 0 y falla en aproximadamente el 50% de los casos entre +1 y -1" . Este es un síntoma del desequilibrio de clase. O usa muestreo estratificado o entrena un clasificador con ejemplos para la clase +1 y -1. Puede hacer un clasificador OAA (One-Against-All) u OAO (One-Against-One). Pruebe tres clasificadores OAA, uno para cada clase. Finalmente dinos esos puntajes?

smci
fuente
66
Solo para su información, en scikit 0.16.1 el valor predeterminado para max_features es "auto" no 1 donde "auto" se traduce en sqrt (number_features).
firefly2442
1

No existe un buen oob_score, es la diferencia entre valid_score y oob_score lo que importa.

Piense en oob_score como una puntuación para algún subconjunto (digamos, oob_set) del conjunto de entrenamiento. Para saber cómo se crea, consulte esto .

oob_set se toma de tu conjunto de entrenamiento. Y ya tiene su conjunto de validación (digamos, valid_set).

Supongamos un escenario donde, su validation_score es 0.7365 y oob_score es 0.8329

En este escenario, su modelo funciona mejor en oob_set, que se toma directamente de su conjunto de datos de entrenamiento. Indicando, validation_set es para un período de tiempo diferente. (por ejemplo, training_set tiene registros para el mes de "enero" y validation_set tiene registros para el mes de "julio"). Entonces, más que una prueba para el rendimiento del modelo, oob_score es una prueba de "cuán representativa es su Validation_set".

Siempre debe asegurarse de tener un buen conjunto de validación representativo, porque su puntaje se utiliza como un indicador del rendimiento de nuestro modelo. Por lo tanto, su objetivo debería ser tener la menor diferencia posible entre oob_score y valid_score.

Generalmente uso oob_score con validation_score para ver qué tan bueno es mi validation_set. Aprendí esta técnica de Jeremy Howard .

Ankur Singh
fuente
0

P: ¿Cuál es un buen puntaje oob para bosques aleatorios con sklearn, clasificación de tres clases?

A: depende. En mi opinión, si las muestras de aprendizaje y prueba se extraen de la misma distribución, entonces, en mi opinión, OOB equivale a una validación cruzada de aproximadamente 3 veces. Entonces, si repetimos la misma pregunta pero con una "validación cruzada triple", la respuesta sería la misma, que es "generalmente, cuanto mayor sea la precisión, mejor, a menos que tenga miedo de sobreajustar su conjunto de aprendizaje porque alguien le dijo que las verdaderas muestras de prueba tienen una distribución diferente ".

¿Me puede dar su conjunto de datos? Puedo divertirme un poco y decirte lo que puedo hacer con él de forma gratuita.

cavernícola
fuente
0

una opinión diferente sobre la pregunta: para empezar, debe asociar una pérdida con cada clasificación errónea que haga. Este precio pagado / pérdida / penalización por clasificación errónea sería (probablemente) diferente para Falso Positivo (FP) vs Falso Negativo (FN). Algunas clasificaciones, por ejemplo, detección de cáncer, preferirían tener más FP que FN. Otros, digamos filtro de spam, preferirían permitir ciertos spam (FN) que bloquear correos (FP) de su amigo. Sobre la base de esta lógica, puede usar F1-score o Accuracy, lo que se adapte a su propósito (por ejemplo, podría estar feliz si mi filtro de spam no tiene FP y una puntuación de .1 ya que tengo un 10% menos de spam por los que preocuparme) Por otro lado, alguien más podría estar descontento con incluso .9 (90% de spam filtrado). ¿Cuál sería una buena puntuación entonces?)

Anurag Priyadarshi
fuente