22 votos

¿El bosque aleatorio está sobreajustado?

Estoy experimentando con los bosques aleatorios con scikit-learn y estoy obteniendo grandes resultados de mi conjunto de entrenamiento, pero relativamente pobres resultados en mi conjunto de prueba ...

He aquí el problema (inspirado en el póquer) que intento resolver: Dadas las cartas ocultas del jugador A, las cartas ocultas del jugador B y un flop (3 cartas), ¿qué jugador tiene la mejor mano? Matemáticamente, se trata de 14 entradas (7 cartas - un rango y un palo para cada uno) 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%

Este es el código 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 pruebas, a pesar de un conjunto de entrenamiento relativamente grande y un número razonablemente pequeño de características...

49voto

MattoxBeckman Puntos 827

Se trata de un error de novato muy común cuando se utilizan modelos de radiofrecuencia (levanto la mano como antiguo autor). En muchos casos, el bosque que se construye utilizando el conjunto de datos de entrenamiento se ajustará casi perfectamente a los datos de entrenamiento (como usted está comprobando) cuando se considera en su totalidad. Sin embargo, a medida que el algoritmo construye el bosque, recuerda el error de predicción fuera de la bolsa (OOB), que es su mejor estimación del error de generalización.

Si vuelves a enviar los datos de entrenamiento al método de predicción (como estás haciendo) obtienes esta predicción casi perfecta (que es tremendamente optimista) en lugar del error OOB correcto. No haga esto. En su lugar, el objeto Forest entrenado debería haber recordado en su interior el error OOB. No estoy familiarizado con la implementación de scikit-learn pero mirando la documentación aquí parece que es necesario especificar oob_score=True al llamar al método de ajuste, y entonces el error de generalización se almacenará como oob_score_ en el objeto devuelto. En el paquete de R "randomForest", llamar al método predict sin argumentos en el objeto devuelto devolverá la predicción OOB en el conjunto de entrenamiento. Esto le permite definir el error utilizando alguna otra medida. Si vuelve a enviar el conjunto de entrenamiento al método predict obtendrá un resultado diferente, ya que utilizará todos los árboles. No sé si el método scikit-learn implementación lo hará o no.

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

16voto

JanithaR Puntos 141

Creo que la respuesta es el parámetro max_features: int, string o None, parámetro opcional (por defecto = "auto"). básicamente para este problema se debe establecer en None , de modo que cada árbol se construye con todas las entradas, ya que claramente no se puede construir un clasificador adecuado utilizando sólo una fracción de las tarjetas ( por defecto "auto" es la selección de sqrt(nfeatures) entradas para cada árbol)

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