SVM con tamaños de grupo desiguales en los datos de entrenamiento


12

Estoy tratando de construir un SVM a partir de datos de entrenamiento donde un grupo está representado más que el otro. Sin embargo, los grupos estarán igualmente representados en los datos de la prueba eventual. Por lo tanto, me gustaría usar el class.weightsparámetro de la e1071interfaz del paquete R libsvmpara equilibrar la influencia de los dos grupos en los datos de entrenamiento.

Como no estaba seguro de cómo se deberían especificar exactamente estos pesos, configuré una pequeña prueba:

  1. Genere algunos datos nulos (características aleatorias; relación 2: 1 entre etiquetas de grupo)
  2. Ajuste un svm con el class.weightsconjunto de parámetros.
  3. Predecir un conjunto de nuevos conjuntos de datos nulos y ver las proporciones de clase.
  4. Replica todo el proceso muchas veces para diferentes conjuntos de entrenamiento nulo.

Aquí está el código R que estoy usando:

nullSVM <- function(n.var, n.obs) {
    # Simulate null training data
    vars   = matrix(rnorm(n.var*n.obs), nrow=n.obs)
    labels = rep(c('a', 'a', 'b'), length.out=n.obs)
    data   = data.frame(group=labels, vars)

    # Fit SVM
    fit = svm(group ~ ., data=data, class.weights=c(a=0.5, b=1))

    # Calculate the average fraction of 'a' we would predict from null test data
    mean(replicate(50, table(predict(fit, data.frame(matrix(rnorm(n.var*n.obs), nrow=n.obs))))[1])) / n.obs
}

library(e1071)
set.seed(12345)
mean(replicate(50, nullSVM(50, 300)))

De todo esto esperaba una salida ~ 0.5, sin embargo, eso no es lo que obtuve:

> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987

El class.weightsparametro está trabajando, especie de , ya que el menor peso que a, cuanto más bajo es representado en esta simulación (y si omite class.weightsvuelve cercano a 1) ... pero yo no entiendo por qué el simple uso de pesos de 1: 2 ( para datos de entrenamiento que son 2: 1) no me lleva al 50%.

Si no entiendo los SVM, ¿alguien puede explicar este punto? (o enviar algunas referencias?)

Si lo estoy haciendo mal, ¿alguien puede decirme la forma correcta de usar el class.weightsparámetro?

¿Podría ser posiblemente un error? (Creo que no, ya que entiendo que este software y el libsvm subyacente son bastante maduros)


No tengo experiencia con libsvm pero con LiblineaR, los pesos de clase son cruciales. Sin configurarlo correctamente, obtendrá resultados subóptimos si sus clases están muy desequilibradas. Sugeriría: Obtenga un conjunto de datos real con clases desequilibradas y pruebe diferentes valores de class.weights (en LiblineaR wi). LiblineaR es un orden de magnitud más rápido para un núcleo lineal y también ha penalizado los métodos. En mi experiencia, primero encuentras un peso decente en la clase y luego optimizas C.
marbel

Respuestas:


7

Creo que puede depender de los valores de C y la cantidad de patrones que tenga. El SVM intenta encontrar el margen máximo discriminante, por lo que si tiene datos escasos, es posible que el SVM encuentre la solución de margen duro sin que ninguno de los multiplicadores de Lagrange alcance sus límites superiores (en cuyo caso, la proporción de penalizaciones para cada la clase es esencialmente irrelevante ya que los valores de holgura son pequeños o cero. Intente aumentar el número de patrones de entrenamiento y vea si eso tiene un efecto (ya que eso hace que sea menos probable que la solución de margen duro se pueda encontrar dentro de las restricciones de la caja) .

Más importante aún, los valores óptimos de C dependen de los datos, no solo puede establecerlos en algunos valores predeterminados, sino optimizarlos minimizando el error de omisión o algún límite de generalización. Si tiene clases desequilibradas, puede fijar la relación de valores para cada clase y optimizar la penalización promedio sobre todos los patrones.


Esto tiene sentido. Cuando reduzco el número de características y aumento el número de observaciones en esta simulación, el valor de salida se acerca a 0.5. Sin embargo, nunca llega allí, incluso con 900 filas y solo 1 columna.
John Colby

Por supuesto, en datos reales siempre uso el caretpaquete o la tune()función incorporada para el ajuste de parámetros del modelo, por lo que me gusta especialmente su segunda idea sobre cómo lidiar con esto en la práctica ajustando el esquema de remuestreo para favorecer a la clase minoritaria. Muy apreciado.
John Colby

Me alegra que tu sugerencia haya sido útil. Hay un documento sobre cómo establecer la relación óptima que también podría ser útil theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf Sin embargo, la corrección teórica óptima no siempre es óptima en la práctica, por lo que los mejores resultados podrían en realidad se puede obtener ajustando los dos parámetros de C separados sin forzar una relación particular, pero ponderando los patrones de acuerdo con la clase al evaluar el criterio de selección del modelo de dejar uno fuera.
Dikran Marsupial

2
También agregaría, en estos días tiendo a usar la regresión de cresta del núcleo en lugar de SVM, ya que no tiene este tipo de problemas contraintuitivos debido a la discontinuidad en la derivada de la función de pérdida. Muy a menudo, si ajusta un SVM L2 correctamente, termina con un valor muy pequeño de C y todos los datos son SV, en cuyo punto tiene un modelo KRR de todos modos. Cuanto más los usé, menos útiles he encontrado los SVM en la práctica, aunque las ideas teóricas que han aportado han sido vitales.
Dikran Marsupial

0

en el entrenamiento, svm encuentra vectores de soporte para hacer un límite discriminativo y cuando hay suficientes vectores de soporte para todos los datos de clases para hacerlo, no sería un problema. En la precisión de los resultados del conjunto de pruebas, debe tener en cuenta la cantidad de datos de igualdad para todas las clases en el mundo real y para obtener resultados reales, debe manipular los datos y considerarlos adecuadamente en una situación real.


Esta respuesta no está clara en este momento: consideré darle una edición de copia, pero hay varios lugares donde no estaba seguro de lo que pretendía. La puntuación y la gramática son importantes para transmitir el significado.
Silverfish
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.