¿El bosque al azar está sobreajustado?

19

Estoy experimentando con bosques aleatorios con scikit-learn y obtengo excelentes resultados de mi conjunto de entrenamiento, pero resultados relativamente pobres en mi conjunto de pruebas ...

Aquí está el problema (inspirado en el póker) que estoy tratando de resolver: Dadas las cartas de mano del jugador A, las cartas de mano del jugador B y un flop (3 cartas), ¿qué jugador tiene la mejor mano? Matemáticamente, esto es 14 entradas (7 cartas - un rango y un palo para cada una) y una salida (0 o 1).

Estos son algunos de mis resultados hasta ahora:

Training set size: 600k, test set size: 120k, number of trees: 25
Success rate in training set: 99.975%
Success rate in testing set: 90.05%

Training set size: 400k, test set size: 80k, number of trees: 100
Success rate in training set: 100%
Success rate in testing set: 89.7%

Training set size: 600k, test set size: 120k, number of trees: 5
Success rate in training set: 98.685%
Success rate in testing set: 85.69%

Aquí está el código relevante utilizado:

from sklearn.ensemble import RandomForestClassifier
Forest = RandomForestClassifier(n_estimators = 25) #n_estimator varies
Forest = Forest.fit(inputs[:trainingSetSize],outputs[:trainingSetSize])
trainingOutputs = Forest.predict(inputs[:trainingSetSize])
testOutputs = Forest.predict(inputs[trainingSetSize:])

Parece que, independientemente del número de árboles utilizados, el rendimiento en el conjunto de entrenamiento es mucho mejor que en el conjunto de prueba, a pesar de un conjunto de entrenamiento relativamente grande y un número razonablemente pequeño de características ...

Uwat
fuente
2
No estoy viendo alrededor de una docena de 'diales' para bosques aleatorios aquí. ¿Validación cruzada? ¿Primas bayesianos? ¿Naturaleza del remuestreo? ¿Conjunto de entrenamiento para cada árbol? ¿Qué porcentaje del subconjunto de cada árbol? ... hay muchos más que podrían enumerarse, pero mi punto es que tiene otras entradas para considerar.
EngrStudent - Reinstale a Monica el
1
¿Podría explicar el problema a quienes no conocen el póker? ¿Existe un cálculo fácil para el puntaje de póker? entonces es más fácil entender si hay algo fundamentalmente incorrecto con el uso de RF ... No conozco el póker, pero sospecho que RF probablemente es el enfoque incorrecto, es decir, el primer paso en RF es usar solo una fracción de las entradas, mientras que me parece que no hay forma de construir un buen clasificador utilizando solo un subconjunto de las entradas: todas las entradas son necesarias.
seanv507

Respuestas:

45

Este es un error de novato común cuando uso modelos RF (pondré mi mano como un perpetrador anterior). El bosque que construyes usando el conjunto de entrenamiento en muchos casos se ajustará a los datos de entrenamiento casi perfectamente (como lo estás encontrando) cuando se considera en su totalidad. Sin embargo, a medida que el algoritmo construye el bosque, recuerda el error de predicción fuera de bolsa (OOB), que es su mejor suposición del error de generalización.

Si envía los datos de entrenamiento nuevamente al método de predicción (como lo hace), obtiene esta predicción casi perfecta (que es tremendamente optimista) en lugar del error OOB correcto. No hagas esto. En cambio, el objeto Forest entrenado debería haber recordado dentro de él el error OOB. No estoy familiarizado con la implementación de scikit-learn, pero al mirar la documentación aquí parece que debe especificar oob_score=Trueal llamar al método de ajuste, y luego el error de generalización se almacenará comooob_score_en el objeto devuelto. En el paquete R "randomForest", llamar al método de predicción sin argumentos en el objeto devuelto devolverá la predicción OOB en el conjunto de entrenamiento. Eso le permite definir el error utilizando alguna otra medida. Enviar el entrenamiento nuevamente al método de predicción le dará un resultado diferente, ya que usará todos los árboles. No sé si la scikit-learnimplementación hará esto o no.

Es un error enviar los datos de entrenamiento nuevamente al método de predicción para probar la precisión. Sin embargo, es un error muy común, así que no te preocupes.

Bogdanovist
fuente
1
¡Gracias! Sin embargo, todavía tengo una preocupación: con 400k ejemplos de entrenamiento y 50 árboles, obtuve el 89.6% correcto, mientras que con tantos datos y el doble de árboles, obtuve el 89.7% correcto ... ¿Esto sugiere que la RF no es buena? método para esto? Usé una red neuronal MLP en el pasado y alcancé una precisión de ~ 98.5% en el conjunto de pruebas ...
Uwat
55
Eso es posible, aunque parece que no estás usando suficientes árboles. Por lo general, necesitas miles. Tenga en cuenta que el número de árboles no es un parámetro para sintonizar en el algoritmo de RF, más siempre es mejor, pero una vez que tiene 'suficiente' (para determinar empíricamente) el error OOB no mejora con más árboles. Incluso para pequeños conjuntos de datos simples, cualquier cosa menos de 500 árboles no es suficiente.
Bogdanovist
1
Hay algunas advertencias menores de que "más siempre es mejor" para la cantidad de árboles, pero tengo entendido que necesita miles de millones de árboles antes de comenzar a recibir un golpe de rendimiento. En mi experiencia, tantos árboles como usted tenga los recursos de CPU y la paciencia para generar lo mejor, aunque con rendimientos decrecientes una vez que la curva OBB (ntrees) se estabiliza.
Bogdanovist
12

Creo que la respuesta es el parámetro max_features: int, string o None, parámetro opcional (predeterminado = "auto"). Básicamente, para este problema, debe establecerlo en Ninguno, de modo que cada árbol se construya con todas las entradas, ya que claramente no se puede construir un clasificador adecuado utilizando solo una fracción de las tarjetas (el valor predeterminado "auto" es seleccionar sqrt (nfeatures) entradas para cada árbol)

seanv507
fuente
1
¡Eso fue todo! 95% de precisión con 50 árboles y 600k ejemplos de entrenamiento.
Uwat
2
Tenga en cuenta que en este punto apenas está utilizando un bosque aleatorio, pero como han dicho otras respuestas, no es el clasificador ideal para este problema exacto.
Richard Rast