2012-06-13 14 views
5

Soy nuevo en R y SVM y estoy tratando de perfil svm función del paquete e1071. Sin embargo, no puedo encontrar ningún conjunto de datos grande que me permita obtener un buen rango de resultados de los perfiles que varían el tamaño de los datos de entrada. ¿Alguien sabe cómo trabajar svm? ¿Qué conjunto de datos debo usar? ¿Algún parámetro particular al svm que lo hace trabajar más?Profiling SVM (e1071) en R

Copio algunos comandos que estoy usando para probar el rendimiento. Tal vez sea más útil y más fácil de conseguir lo que estoy tratando aquí:

#loading libraries 
library(class) 
library(e1071) 
#I've been using golubEsets (more examples availables) 
library(golubEsets) 

#get the data: matrix 7129x38 
data(Golub_Train) 
n <- exprs(Golub_Train) 

#duplicate rows(to make the dataset larger) 
n<-rbind(n,n) 

#take training samples as a vector 
samplelabels <- as.vector(Golub_Tra[email protected]@data$ALL.AML) 

#calculate svm and profile it 
Rprof('svm.out') 
svmmodel1 <- svm(x=t(n), y=samplelabels, type='C', kernel="radial", cross=10) 
Rprof(NULL) 

sigo aumentando el conjunto de datos de duplicación de filas y columnas, pero me alcanza el límite de memoria en lugar de hacer svm trabaja más duro ...

+1

Duplicar puntos de entrenamiento no hace el problema más difícil. Como la mayoría de SVM requiere que todo el conjunto de datos se ajuste a la memoria principal, tiene sentido que eventualmente se produzcan errores de memoria. – karenu

+0

Entonces, ¿cómo puedo probar con un gran conjunto de datos adecuado? ¿Conoces algún ejemplo que pueda usar? – Manolete

+0

Sí, si ve mi respuesta, he enumerado una cantidad de conjuntos de datos disponibles. Además, debe realizar la optimización de los parámetros para encontrar los mejores parámetros; encontrará que a medida que busca los parámetros que le brindan la mayor precisión, a algunos les tomará más tiempo entrenar que a otros. Consulte la Guía práctica del autor de libsvm: http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFYQFjAA&url=http%3A%2F%2Fwww.csie.ntu .edu.tw% 2F ~ cjlin% 2Fpapers% 2Fguide% 2Fguide.pdf & ei = WtLhT46NO-jw0gG30pHVAw & usg = AFQjCNFol0McRktHC6gsBxKXqQMvmQUFeg – karenu

Respuesta

8

En términos de "trabajo de salida SVM": lo que hará que SVM trabaje "más duro" es un modelo más complejo que no se separa fácilmente, una mayor dimensionalidad y un conjunto de datos más grande y más denso.

rendimiento SVM se degrada con:

  • aumenta el tamaño del conjunto de datos (número de puntos de datos)
  • Sparsity disminuye (menor número de ceros)
  • aumenta dimensionalidad (número de atributos)
  • NO se utilizan núcleos lineales (y los parámetros del kernel pueden hacer que la evaluación del kernel sea más compleja)

parámetros que varían

¿Hay parámetros que se pueden cambiar para hacer SVM tomar más tiempo. Por supuesto, los parámetros afectan la calidad de la solución que obtendrá y es posible que no tenga sentido su uso.

Al usar C-SVM, variando C dará como resultado diferentes tiempos de ejecución. (El parámetro similar en nu-SVM es nu) Si el conjunto de datos es razonablemente separable, hacer que C sea más pequeño dará como resultado un tiempo de ejecución más largo porque el SVM permitirá que más puntos de entrenamiento se conviertan en vectores de soporte. Si el conjunto de datos no es muy separable, hacer C más grande causará tiempos de ejecución más largos porque esencialmente le está diciendo a SVM que quiere una solución de margen estrecho que se ajuste a los datos y que tome mucho más tiempo calcular cuando los datos no son fáciles separar.

Con frecuencia, al realizar una búsqueda de parámetros, se encuentran parámetros que aumentarán el tiempo de cálculo sin un aumento apreciable en la precisión.

Los otros parámetros son parámetros del kernel y si los modifica para aumentar la complejidad del cálculo del kernel, naturalmente aumentará el tiempo de ejecución de SVM. El kernel lineal es simple y será el más rápido; los granos no lineales, por supuesto, tomarán más tiempo. Es posible que algunos parámetros no aumenten la complejidad de cálculo del kernel, pero obligarán a un modelo mucho más complejo, lo que puede llevar mucho más tiempo a SVM para encontrar la solución óptima.

conjuntos de datos de empleo:

El UCI Machine Learning Repository es una gran fuente de conjuntos de datos.

La MNIST handwriting recognition dataset es una buena opción para usar: puede seleccionar al azar subconjuntos de datos para crear conjuntos de datos de mayor tamaño. Tenga en cuenta que los datos en el enlace contienen todos los dígitos, SVM es, por supuesto, binario, por lo que tendría que reducir los datos a solo dos dígitos o hacer algún tipo de SVM de varias clases.

Puede fácilmente generar conjuntos de datos también. Para generar un conjunto de datos lineal, seleccione aleatoriamente un vector normal en un hiperplano, luego genere un punto de datos y determine de qué lado del hiperplano cae para etiquetarlo. Agregue un poco de aleatoriedad para permitir que los puntos dentro de una cierta distancia del hiperplano a veces se etiqueten de manera diferente. Aumente la complejidad aumentando la superposición entre clases. O genere algunos números de grupos de puntos normalmente distribuidos, etiquetados como 1 o -1, de modo que las distribuciones se superpongan en los bordes. El ejemplo clásico no lineal es un tablero de ajedrez. Genere puntos y etiquételos en un patrón de tablero de ajedrez. Para hacerlo más difícil, aumente la cantidad de cuadrados, aumente las dimensiones y aumente la cantidad de puntos de datos. Deberá usar un kernel no lineal para eso, por supuesto.

+0

Muchas gracias por su gran explicación. Lo aprecio. He actualizado mi pregunta para ver si esto ayuda – Manolete

+0

karenu ¿Y la matriz de entrada? Realmente estoy luchando por comprender cuándo y por qué necesito aplicar la transposición. He visto varios ejemplos, y cada uno está haciendo algo diferente. ¿Cómo puedo saber cuándo necesito aplicar la t() la matriz de entrada? – Manolete

Cuestiones relacionadas