"Aprendizaje semi supervisado": ¿esto es demasiado adecuado?

21

Estaba leyendo el informe de la solución ganadora de una competencia de Kaggle ( Clasificación de malware ). El informe se puede encontrar en esta publicación del foro . El problema era un problema de clasificación (nueve clases, la métrica era la pérdida logarítmica) con 10000 elementos en el conjunto de trenes, 10000 elementos en el conjunto de prueba.

Durante la competencia, los modelos fueron evaluados contra el 30% del conjunto de prueba. Otro elemento importante es que los modelos estaban funcionando muy bien (cerca del 100% de precisión)

Los autores utilizaron la siguiente técnica:

Otra técnica importante que presentamos es el aprendizaje semisupervisado. Primero generamos pseudo etiquetas del conjunto de pruebas eligiendo la probabilidad máxima de nuestro mejor modelo. Luego, pronosticamos el conjunto de prueba nuevamente de forma cruzada, tanto con los datos del tren como con los de la prueba. Por ejemplo, el conjunto de datos de prueba se divide en 4 partes A, B, C y D. Utilizamos todos los datos de entrenamiento, y los datos de prueba A, B, C con sus pseudo etiquetas, juntos como el nuevo conjunto de entrenamiento y predecimos la prueba. conjunto D.

El mismo método se usa para predecir A, B y C. Este enfoque, inventado por Xiaozhou, funciona sorprendentemente bien y reduce la pérdida de validación cruzada local, la pérdida de LB pública y la pérdida de LB privada. El mejor modelo de aprendizaje semisupervisado puede alcanzar 0.0023 en la pérdida de registro de LB privado, que es el mejor puntaje en todas nuestras soluciones.

Realmente no veo cómo puede mejorar los resultados. ¿Es porque el 30% del conjunto de prueba se "filtró" y era una forma de utilizar esta información?

¿O hay alguna razón teórica que explique por qué funciona?

RUser4512
fuente

Respuestas:

8

No parece ser demasiado ajustado. Intuitivamente, el sobreajuste implica entrenar a las peculiaridades (ruido) del conjunto de entrenamiento y, por lo tanto, hacerlo peor en un conjunto de prueba extendido que no comparte estas peculiaridades. Si entiendo lo que sucedió, no tuvieron un desempeño inesperado-pobre en los datos de prueba retenidos y eso excluye empíricamente el sobreajuste. (Tienen otro problema, que mencionaré al final, pero no es demasiado adecuado).

Entonces tiene razón en que aprovecha los datos de prueba disponibles (¿30%?). La pregunta es: ¿cómo?

Si los datos de prueba disponibles tienen etiquetas asociadas, simplemente podría agruparlos en sus datos de entrenamiento y ampliar sus datos de entrenamiento, lo que en general produciría mejores resultados de una manera obvia. Ningún logro real allí.

Tenga en cuenta que las etiquetas no tendrían que aparecer explícitamente si tiene acceso a una puntuación de precisión. Simplemente puede subir el gradiente de precisión enviando puntajes repetidamente, que es lo que la gente ha hecho en el pasado con competencias mal diseñadas.

Dado que los datos de prueba disponibles no tienen etiquetas asociadas, directa o indirectamente, existen al menos otras dos posibilidades:

Primero, este podría ser un método de impulso indirecto en el que te estás enfocando en casos donde tus predicciones con solo los datos de entrenamiento no están de acuerdo con tus predicciones con los datos de prueba pseudo etiquetados incluidos.

En segundo lugar, podría ser un aprendizaje semi-supervisado directo. Intuitivamente: podría estar utilizando la densidad de datos sin etiquetar para ayudar a configurar los límites de clasificación de un método supervisado. Vea la ilustración ( https://en.wikipedia.org/wiki/Semi-supervised_learning#/media/File:Example_of_unla Label_data_in_semisupervised_learning.png ) en la definición de Wikipedia de aprendizaje semi-supervisado para aclarar.

PERO esto no significa que no haya un truco aquí. Y ese truco proviene de la definición de entrenamiento y datos de prueba. En principio, los datos de entrenamiento representan datos que podría tener a mano cuando esté listo para implementar su modelo. Y los datos de prueba representan datos futuros que entrarán en su sistema una vez que esté operativo.

En ese caso, la capacitación en datos de prueba es una fuga del futuro , en el que está aprovechando datos que aún no habría visto. Este es un problema importante en el mundo real, donde algunas variables pueden no existir hasta después del hecho (por ejemplo, después de que se realiza una investigación) o pueden actualizarse en una fecha posterior.

Entonces, son meta-juegos aquí: lo que hicieron es legítimo dentro de las reglas de la competencia, porque se les dio acceso a algunos de los datos de prueba. Pero no es legítimo en el mundo real, donde la verdadera prueba es qué tan bien lo hace en el futuro, con los nuevos datos.

Wayne
fuente
2

No, no está sobreajustando.

Creo que su preocupación aquí es que el modelo está alentando los datos en lugar de modelarlos. Eso depende de la complejidad del modelo (que permaneció igual) y del tamaño de los datos. Ocurre cuando el modelo es demasiado complejo y / o cuando los datos de entrenamiento son demasiado pequeños, ninguno de los cuales es el caso aquí. El hecho de que el error de prueba (error de validación cruzada) se minimice después del aprendizaje semi-supervisado debería implicar que no está sobreajustado.

Sobre por qué tal enfoque funciona incluso
El enfoque utilizado aquí no está fuera del mundo, he visto a muchas personas haciendo esto en muchas competiciones de aprendizaje automático (Lo siento, lo intenté, pero no puedo recordar dónde he visto esto).
Cuando predice una parte de los datos de prueba e incluye eso en la capacitación, el modelo estará expuesto a nuevas características. En este caso, los datos de la prueba son tan grandes como los datos de entrenamiento, no es de extrañar que estén ganando tanto con el aprendizaje semi-supervisado.

Espero que esto explique
Gracias

Vihari Piratla
fuente
Debe definir "el modelo" claramente. Esto es muy parecido a la cuestión general de Grados de libertad generalizados ( pegasus.cc.ucf.edu/~lni/sta6236/Ye1998.pdf ), donde alguien señala el "modelo final", que parece ser simple, pero que en realidad tiene mucha complejidad metida en el proceso. Mi instinto es que no puede ignorar el resto del proceso y señalar el "modelo final", afirmar que no es más complejo que el "modelo final" sin el paso semi-supervisado, y luego proceder. La mejora de los resultados de las pruebas fuera de la muestra es un buen indicador, como usted dice.
Wayne
2

No es excesivo el ajuste (según la definición). Se conserva la información del objetivo del conjunto de prueba. Los semi-supervisados ​​permiten generar un conjunto de datos sintéticos adicionales para entrenar el modelo. En el enfoque descrito, los datos de entrenamiento originales se mezclan sin ponderar con sintéticos en una proporción de 4: 3. Por lo tanto, si la calidad de los datos sintéticos es deficiente, el enfoque resultaría desastroso. Supongo que para cualquier problema donde las predicciones sean inciertas, el conjunto de datos sintéticos sería de baja precisión. Supongo que si la estructura subyacente es muy compleja y el sistema tiene poco ruido, puede ayudar a generar datos sintéticos. Creo que el aprendizaje semi-supervisado es bastante importante dentro del aprendizaje profundo (no es mi experiencia), donde también se debe aprender la representación característica.

He intentado reproducir una mayor precisión con entrenamiento semi supervisado en varios conjuntos de datos con rf y xgboost sin ningún resultado positivo. [Siéntase libre de editar mi código.] Noté que la mejora real de la precisión usando semi-supervisado es bastante modesta en el informe de kaggle, ¿tal vez al azar?

rm(list=ls())
#define a data structure
fy2 = function(nobs=2000,nclass=9) sample(1:nclass-1,nobs,replace=T)
fX2 = function(y,noise=.05,twist=8,min.width=.7) {
  x1 = runif(length(y)) * twist
  helixStart = seq(0,2*pi,le=length(unique(y))+1)[-1]
  x2 = sin(helixStart[y+1]+x1)*(abs(x1)+min.width) + rnorm(length(y))*noise
  x3 = cos(helixStart[y+1]+x1)*(abs(x1)+min.width) + rnorm(length(y))*noise
  cbind(x1,x2,x3)
}

#define a wrapper to predict n-1 folds of test set and retrain and predict last fold  
smartTrainPred = function(model,trainX,trainy,testX,nfold=4,...) {
  obj = model(trainX,trainy,...)
  folds = split(sample(1:dim(trainX)[1]),1:nfold)
  predDF = do.call(rbind,lapply(folds, function(fold) {
    bigX      = rbind(trainX ,testX[-fold,])
    bigy      = c(trainy,predict(obj,testX[-fold,]))
    if(is.factor(trainy)) bigy=factor(bigy-1)
    bigModel  = model(bigX,bigy,...)
    predFold  = predict(bigModel,testX[fold,])
    data.frame(sampleID=fold, pred=predFold)
  }))
  smartPreds = predDF[sort(predDF$sampleID,ind=T)$ix,2]
}

library(xgboost)
library(randomForest)

#complex but perfect separatable
trainy = fy2(); trainX = fX2(trainy)
testy  = fy2();  testX = fX2(testy )
pairs(trainX,col=trainy+1)

ingrese la descripción de la imagen aquí

#try with randomForest
rf = randomForest(trainX,factor(trainy))
normPred = predict(rf,testX)
cat("\n supervised rf", mean(testy!=normPred))
smartPred = smartTrainPred(randomForest,trainX,factor(trainy),testX,nfold=4)
cat("\n semi-supervised rf",mean(testy!=smartPred))

#try with xgboost
xgb = xgboost(trainX,trainy,
              nrounds=35,verbose=F,objective="multi:softmax",num_class=9)
normPred = predict(xgb,testX)
cat("\n supervised xgboost",mean(testy!=normPred))

smartPred = smartTrainPred(xgboost,trainX,trainy,testX,nfold=4,
                           nrounds=35,verbose=F,objective="multi:softmax",num_class=9)
cat("\n semi-supervised xgboost",mean(testy!=smartPred))



printing prediction error:
 supervised rf 0.007
 semi-supervised rf 0.0085
 supervised xgboost 0.046
 semi-supervised xgboost 0.049
Soren Havelund Welling
fuente
1

Según esta definición: "El sobreajuste ocurre cuando un modelo estadístico describe un error aleatorio o ruido en lugar de la relación subyacente" (wikipedia), la solución no es sobreajustar.

Pero en esta situación:
- Los datos de prueba son una secuencia de elementos y no un conjunto fijo de elementos.
O
- El proceso de predicción no debe contener una fase de aprendizaje (por ejemplo, debido a problemas de rendimiento).

La solución mencionada es demasiado adecuada. Porque la precisión del modelado es más que situaciones reales.

parvij
fuente