Tengo un conjunto de datos de 140000 ejemplos y 30 características para las que estoy entrenando varios clasificadores para una clasificación binaria (SVM, Regresión Logística, Bosque Aleatorio, etc.)
En muchos casos, el ajuste de los hiperparámetros en todo el conjunto de datos mediante la búsqueda en cuadrícula o aleatoria es demasiado costoso en términos de tiempo.
Empecé a utilizar la siguiente técnica
- Submuestra de mi conjunto de datos
- Utilice la fracción obtenida para afinar los hiperparámetros en
- Utilizar los parámetros obtenidos para entrenar un modelo utilizando todo el conjunto de datos
Para evaluar cada conjunto de parámetros en el segundo paso utilizo sklearn
's GridSearchCV
con cv=10. Para evaluar el modelo final que creo en el tercer paso utilizo sklearn
's cross_val_predict
. En ese sentido evalúo mis modelos dejando un 10% de datos fuera, entreno en el resto y mido la precisión predictiva en el 10%, iterativamente 10 veces, tomando luego la media de las puntuaciones.
Lo que me preocupó es que la precisión de la predicción que obtengo del entrenamiento en todo mi conjunto de datos, es realmente cercana a la evaluación que obtengo al afinar los parámetros para el mejor conjunto de parámetros (cada conjunto de parámetros probado produce una puntuación obtenida del promedio de los resultados de la validación cruzada de 10 veces).
La mayoría de las veces la precisión que cross_val_predict
medido utilizando 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 descrito 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 las puntuaciones medias (de cross_val_predict
) que obtuve del entrenamiento 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 se puede ver el entrenamiento en todo el conjunto de datos mejora los resultados. También he validado que un modelo mal afinado (por ejemplo, utilizando los valores por defecto o valores aleatorios para C
y gamma
) conduce a una precisión de predicción mucho peor.
En general, creo que afinar los hiperparámetros en un subconjunto no es lo ideal, pero puede llevar a resultados relativamente buenos sin tener que esperar demasiado. Yo, por ejemplo, antes de utilizar ese enfoque usaba optunity
para ajustar el hiperparámetro en todo el conjunto de datos. Este procedimiento tardaba entre 3 y 5 días en completarse y producía resultados que o bien tenían una precisión muy buena o una recuperación muy buena, pero no ambas, de modo que aunque para cada clase la precisión o la recuperación eran muy altas (más altas que las que había conseguido cualquiera de mis otros clasificadores) la medida f1 era realmente baja. Por el contrario, el uso de este último enfoque conlleva algunas horas de entrenamiento y una mejor medida de f1.
Mis preocupaciones son:
¿Limito la precisión de mi clasificación? ¿Evito utilizar toda la potencia de predicción que puede ofrecer mi conjunto de datos afinando sólo un subconjunto? Si se produce ese perjuicio en el rendimiento, ¿está limitado de alguna manera por algún factor?