Actualmente estoy experimentando con gridsearch para entrenar una máquina de vectores de soporte. Entiendo que, si tengo el parámetro gamma y C, la función R tune.svm realiza una validación cruzada de 10 veces para todas las combinaciones de estos 2 parámetros.
Como no sabía cómo comenzar, intenté obtener información al respecto, por ejemplo, wikipedia 2 sugiere valores que no son lineales, por ejemplo, C en el rango {10, 100, 1000}.
Hasta ahora uso los ejemplos de mi segundo enlace de wikipedia, que es:
gammas = 2^(-15:3)
costs = 2^(-5:15)
Lo que da como resultado 399 combinaciones.
Esto lleva mucho, mucho tiempo (~ 2000 muestras). Por ejemplo, para el núcleo "radial", mi mejor resultado es gamma = 0.5 y cost = 2.
¿No podría obtener el mismo resultado si solo usara valores como (1, 2, 3, 4, ... 10) para costos y (0, 0.5, 1, 1.5, 2) para gammas? Sé que este ejemplo está construido porque ya sé el resultado.
Mi pregunta:
¿Pero por qué esta escala exponencial?
Hay tantos valores entre 0 y 1 que creo que esto es una pérdida de tiempo de cálculo y tan pocos números muy grandes que de todos modos no podría encontrar un resultado muy exacto. Solo tendría sentido para mí si esto se usara para encontrar un rango más pequeño, digamos que luego sabemos que el mejor costo es 2 ^ 3 y luego buscamos alrededor de eso. Pero en ninguna parte se menciona que se realiza de esa manera.
Respuestas:
La razón de la cuadrícula exponencial es que tanto C como gamma son parámetros de escala que actúan de manera multiplicativa, por lo que es probable que duplicar gamma tenga un efecto aproximadamente tan grande (pero en la otra dirección) como reducirlo a la mitad. Esto significa que si usamos una cuadrícula de valores que aumentan exponencialmente, hay aproximadamente la misma cantidad de "información" sobre los hiperparámetros obtenidos por la evaluación del criterio de selección del modelo en cada punto de la cuadrícula.
Por lo general, busco en una cuadrícula basada en potencias enteras de 2, lo que parece funcionar bastante bien (estoy trabajando en un documento sobre la optimización de la búsqueda de cuadrícula; si usa una cuadrícula demasiado fina, puede terminar ajustando demasiado el criterio de selección de modelo , por lo que una cuadrícula bastante gruesa resulta buena para la generalización y el gasto computacional).
En cuanto al amplio rango, desafortunadamente los valores óptimos de hiperparámetros dependen de la naturaleza del problema y del tamaño del conjunto de datos y no se pueden determinar a priori. La razón de la grilla grande, aparentemente derrochadora, es asegurarse de que se puedan encontrar buenos valores automáticamente, con alta probabilidad.
Si el gasto computacional es un problema, en lugar de usar la búsqueda de cuadrícula, puede usar el algoritmo simplex de Nelder-Mead para optimizar el error de validación cruzada. Este es un algoritmo de optimización que no requiere información de gradiente, por lo que es bastante sencillo de usar para cualquier problema en el que actualmente se utiliza la búsqueda de cuadrícula. No soy un usuario de R, pero Nelder-Mead se implementa en R vía
optim
.fuente
Esto se llama el problema de "ajuste de parámetros" para SVM. Uno de los enfoques más fáciles es tomar la mediana de cada uno para obtener los mayores niveles de precisión de predicción de clase obtenidos a medida que avanza por los pliegues de CV.
Además, como regla general, use un clasificador más simple para determinar si sus datos son linealmente separables. Si la vecina k-más cercana (kNN) o la regresión lineal funcionan mejor, entonces no debería usar un enfoque más costoso (computacionalmente) como SVM. SVM se puede usar fácilmente en exceso, así que asegúrese de evaluar la regresión lineal, kNN, análisis discriminante lineal, bosques aleatorios, etc.
fuente