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 gini
como 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).
fuente
scikit
'soob_score
es una puntuación, es decir, una medida de acuerdo. Sin embargo, no pude encontrarlo documentado.Respuestas:
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: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 egmax_features=0.33
(como R'smtry
) y vuelva a ejecutar. Cuéntanos los nuevos puntajes."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?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?
fuente
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 .
fuente
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.
fuente
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?)
fuente