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 ...
Respuestas:
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=True
al 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 lascikit-learn
implementació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.
fuente
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)
fuente