Tengo un conjunto de datos de 140000 ejemplos y 30 características para las que estoy entrenando a varios clasificadores para una clasificación binaria (SVM, Regresión logística, Bosque aleatorio, etc.)
En muchos casos, el ajuste de hiperparámetros en todo el conjunto de datos mediante Grid o Búsqueda aleatoria es demasiado costoso en cuanto al tiempo.
Empecé a usar la siguiente técnica
- Sub muestra mi conjunto de datos
- Use la fracción obtenida para ajustar los hiperparámetros en
- Use los parámetros obtenidos para entrenar un modelo usando todo el conjunto de datos
Para evaluar cada conjunto de parámetros en el segundo paso, uso sklearn
's GridSearchCV
con cv = 10. Para evaluar el modelo final que creo en el tercer paso que uso sklearn
's cross_val_predict
. En ese sentido, evalúo mis modelos dejando un 10% por ciento de datos, entreno en el resto y mido la precisión predictiva en el 10%, iterativamente 10 veces, luego tomo el promedio de los puntajes.
Lo que me hizo preocuparme es que la precisión de predicción que obtengo del entrenamiento en todo mi conjunto de datos, está muy cerca de la evaluación que obtengo al ajustar los parámetros para el mejor conjunto de parámetros (cada conjunto de parámetros probados genera una puntuación obtenida de un promedio de 10- resultados de validación cruzados).
La mayoría de las veces, la precisión que se cross_val_predict
midió con todos los ejemplos de entrenamiento (conjunto de datos completo) está un poco por encima de lo que arrojó la evaluación de los mejores parámetros.
Para ilustrar esto, aquí está la evaluación de un conjunto de parámetros (en un conjunto de datos más pequeño que el que describí anteriormente, pero el efecto es el mismo)
Best parameters set found on development set:
{'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
Scores for all sets of parameters
0.851 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.5}
0.852 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.1}
0.829 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.001}
0.853 (+/-0.006) for {'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
...
Y aquí están los puntajes promedio (de cross_val_predict
) que obtuve de la capacitación en todo mi conjunto de datos utilizando los mejores parámetros
precision recall f1-score support
0 0.86 0.85 0.86 15417
1 0.86 0.87 0.87 16561
avg / total 0.86 0.86 0.86 31978
acc score: 0.863750078179
roc au score: 0.863370490059
[[13147 2270]
[ 2087 14474]]
Como puede ver, la capacitación en todo el conjunto de datos mejora los resultados. También he validado que el modelo mal ajustado (por ejemplo, utilizando los valores predeterminados o valores aleatorios para C
y gamma
) conduce a una precisión de predicción mucho peor.
En general, creo que ajustar los hiperparámetros en un subconjunto no es ideal, pero puede conducir a resultados relativamente buenos sin tener que esperar demasiado. Por ejemplo, antes de usar ese enfoque, utilicé el optunity
paquete para ajustar el hiperparámetro en todo el conjunto de datos. Este procedimiento tardaría entre 3 y 5 días en completarse y produciría resultados que tuvieran una muy buena precisión o un muy buen recuerdo, pero no ambos, por lo que, aunque para cada clase, la precisión o el recuerdo fueron realmente altos (más altos que cualquiera de mis otros clasificadores habían logrado) la medida f1 era realmente baja. Por el contrario, el uso del enfoque posterior conduce a algunas horas de entrenamiento y a una mejor medición de f1.
Mis preocupaciones son:
¿Limito la precisión de mi clasificación? ¿Evito usar todo el poder de predicción que puede ofrecer mi conjunto de datos sintonizando solo un subconjunto? Si está ocurriendo tal daño de rendimiento, ¿está de alguna manera limitado por algún factor?