Estoy usando modelos SVM para hacer pronósticos a corto plazo de contaminantes del aire. Para entrenar un nuevo modelo, necesito encontrar metaparámetros apropiados para un modelo SVM (me refiero a C, gamma, etc.).
La documentación de Libsvm (y muchos otros libros que he leído) sugiere usar la búsqueda de cuadrícula para encontrar estos parámetros, por lo que básicamente entreno el modelo para cada combinación de estos parámetros de un conjunto determinado y elijo el mejor modelo.
¿Hay alguna forma mejor de encontrar metaparámetros óptimos (o casi óptimos)? Para mí es principalmente una cuestión de tiempo de cálculo: una búsqueda en cuadrícula de este problema lleva aproximadamente dos horas (después de hacer algunas optimizaciones).
Ventajas de la búsqueda en la cuadrícula:
- Se puede paralelizar fácilmente: si tiene 20 CPU, se ejecutará 20 veces más rápido, paralelizar otros métodos es más difícil
- Verifica grandes partes del espacio de metaparámetros, por lo que si hay una buena solución, la encontrará.
Si supone que hay una función relativamente suave subyacente en la cuadrícula de parámetros, entonces hay ciertas cosas que puede hacer. Por ejemplo, una heurística simple es comenzar con una grilla de parámetros muy gruesa y luego usar una grilla más fina alrededor de la mejor configuración de parámetros de la grilla gruesa.
Esto tiende a funcionar bastante bien en la práctica, con advertencias, por supuesto. Primero es que el espacio no es necesariamente liso, y podría haber óptimos locales . La grilla gruesa puede pasar por alto estos y podría terminar con una solución subóptima. También tenga en cuenta que si tiene relativamente pocas muestras en su conjunto de espera, entonces puede tener una gran cantidad de configuraciones de parámetros que dan la misma puntuación (error o cualquier métrica que esté usando). Esto puede ser particularmente problemático si está aprendiendo en varias clases (por ejemplo, utilizando el método de uno contra todos ), y solo tiene unos pocos ejemplos de cada clase en su conjunto de espera. Sin embargo, sin recurrir a técnicas desagradables de optimización no lineal, esto probablemente sirva como un buen punto de partida.
Hay un buen conjunto de referencias aquí . En el pasado, he adoptado el enfoque de que puede estimar razonablemente un buen rango de hiperparámetros del núcleo mediante la inspección del núcleo (por ejemplo, en el caso del núcleo RBF, asegurando que el histograma de los valores del núcleo proporcione una buena distribución de valores, en lugar de estar sesgado hacia 0 o 1, y también puede hacerlo automáticamente sin demasiado trabajo), lo que significa que puede reducir el rango antes de comenzar. Luego puede enfocar su búsqueda en cualquier otro parámetro, como el parámetro de regularización / capacidad. Sin embargo, por supuesto, esto solo funciona con núcleos precalculados, aunque puede estimar esto en un subconjunto aleatorio de puntos si no desea utilizar núcleos precalculados, y creo que ese enfoque también estaría bien.
fuente
Utilizo recocido simulado para buscar parámetros.
El comportamiento se rige por algunos parámetros:
k
es la constante de Boltzmann.T_max
es tu temperatura inicialT_min
es tu umbral final.mu_T
(μ
) es cuánto baja la temperatura (T->T/μ
)i
es el número de iteraciones a cada temperaturaz
es un tamaño de paso: usted determina qué significa exactamente eso. Me muevo al azar dentroold*(1±z)
.p = e^{-(E_{i+1} - E_i)/(kT)}
.T->T/μ
cadai
iteración hasta que golpeeT_min
.Juega un poco con los parámetros y deberías poder encontrar un conjunto que funcione bien y rápido.
Y el Biblioteca Científica GNU incluye recocido simulado.
fuente
Si alguien está interesado aquí están algunos de mis pensamientos sobre el tema:
fuente
Si el núcleo es radial, puede usar esta heurística para obtener unσ - La optimización de C es mucho más fácil entonces.
fuente