4 votos

Métodos para combinar (e1071 svm) modelos en R para generar un modelo más completo y preciso

Estoy usando la función svm del paquete e1071 en R para generar un modelo de máquina de vectores de soporte. Tengo un conjunto de datos muy grande y, por el momento, mientras estoy en modo exploratorio, quiero simplemente leer pequeñas porciones de los datos que pueden ser modeladas en mi máquina única.

Después de obtener los resultados del modelo, me gustaría leer más datos y generar otro modelo de SVM, etc. hasta que todos los datos estén modelados, lo que generará alrededor de 50 modelos diferentes. Luego me gustaría fusionar todos estos modelos / resultados juntos de alguna manera para obtener un gran modelo que se aproxime a lo que lograría si pudiera ajustar todos los datos a la vez.

Sé que hay múltiples formas de hacer esto, teóricamente. Pero, manteniéndome en el modelado SVM, ¿cuáles son mis opciones en R? (Quiero seguir utilizando el paquete e1071 porque tiene algunas cosas que no vi en los otros)

Si importa, mis datos no son genómicos y tienen un alto peso (lo que significa que estoy modelando V/F, y generalmente encuentro un F, pero los datos del conjunto de características no son dispersos).

A continuación se muestra un "pseudocódigo" de lo que estoy proponiendo / esperando, en caso de que eso ayude a aclarar las cosas:

require(e1071)
modelSet = NULL
for (i in c(1:50) ) { ## imagine que hay 50 archivos
  dF <- read.csv(paste("file",i,"csv", sep=".") )
  modelSet[[i]] <- svm(myOutput ~ ., data= dF, probability= TRUE)
}
## Ahora me gustaría encontrar una forma de fusionar todos los 50 modelos de "modelSet" juntos
## para hacer un modelo compuesto derivado de los 50 archivos de datos.

¡Gracias!
Mike

2voto

Steve Puntos 256

Primero, asegúrate de mezclar tus datos antes de separarlos en las 50 particiones. Si los datos originales están ordenados, esto puede hacer una gran diferencia en el rendimiento de tu modelo final. También asegúrate de que tus 50 particiones estén estratificadas, lo que significa que tengan aproximadamente la misma cantidad de ejemplares por clase que el conjunto de datos en general. Luego procede a entrenar tus 50 modelos (cómo manejas la selección de hiperparámetros es un problema más grande). Cuando quieras hacer una predicción, haz una de las siguientes opciones, todas variaciones de boosting:

1) Boosting de decisión dura: Evalúa los 50 modelos y trata la salida de cada modelo como un voto. La clase que reciba más votos gana. El problema con este enfoque es que cada modelo recibe un voto igual, independientemente de la confianza de su predicción.

2) Boosting de decisión suave: Evalúa los 50 modelos con el parámetro decision.values = TRUE. Esto le indica a e1071 que devuelva el valor de decisión además de la etiqueta de clase. Promedia los valores de decisión devueltos por cada uno de los 50 modelos y haz una predicción basada en el promedio. El problema con este enfoque es que los valores de decisión no necesariamente estarán escalados de manera igual en todos los modelos. En otras palabras, un valor de decisión de 1.618 no necesariamente significará lo mismo en los 50 modelos.

3) Boosting de decisión suave con meta-modelo logístico: Entrena y evalúa los modelos con el parámetro probability = TRUE. Esto ajustará una regresión logística sobre el modelo SVM que escala la salida para estar en el rango [0, 1]. Esto es una especie de solución chapucera pero puede ayudar con el problema de escalado de la opción 2.

Una última palabra de precaución - dices que solo te importan 20 características pero cada característica puede tener más de 1000 niveles. Por tu uso de la palabra "niveles", asumo que estas características son discretas. ¿Son ordinales o categóricas? En otras palabras, ¿hay un orden en los niveles? ¿Está el nivel 1 más cerca del nivel 2 que del nivel 3? Si es así, probablemente estás listo. Si no, quizás quieras considerar recodificar lo categórico usando codificación one-hot.

0voto

SkinnyGeek1010 Puntos 299

Te recomendaría combinar predicciones, no modelos. Por ejemplo, después de tener 50 modelos, puedes aplicar todos ellos en los datos de prueba. Entonces obtendrás 50 conjuntos de predicciones. Y todos estos conjuntos de predicciones podrías utilizarlos como entrada para entrenar otro clasificador/modelo (también podría ser SVM).

Esto se describe con más detalle en el curso "Machine Learning Práctico" en Coursera de la Universidad Johns Hopkins: https://www.coursera.org/course/predmachlearn.

Hay un video sobre "combinación de predictores", y su presentación de diapositivas está disponible, por ejemplo, aquí: https://rpubs.com/pr9115/JLeek_025_CombiningPredictors

0voto

Prez Puntos 16

Mi solución es, si es aceptable, mejor componer todas las observaciones en un solo conjunto de datos y optar por muestreo estratificado, lo cual podría no ser posible cuando los datos están separados en diferentes archivos. Luego construir SVM sobre eso.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X