"Apprendimento semi supervisionato": questo è troppo adatto?


21

Stavo leggendo il rapporto sulla soluzione vincente di una competizione Kaggle ( Classificazione malware ). Il rapporto può essere trovato in questo post del forum . Il problema era un problema di classificazione (nove classi, la metrica era la perdita logaritmica) con 10000 elementi nel set di treni, 10000 elementi nel set di test.

Durante la competizione, i modelli sono stati valutati rispetto al 30% del set di test. Un altro elemento importante è che i modelli si sono comportati molto bene (quasi al 100% di precisione)

Gli autori hanno usato la seguente tecnica:

Un'altra tecnica importante che apprendiamo è l'apprendimento semi-supervisionato. Generiamo innanzitutto pseudo etichette del set di test scegliendo la massima probabilità del nostro miglior modello. Quindi prevediamo di nuovo il set di test in modo incrociato con i dati del treno e i dati del test. Ad esempio, il set di dati di test è suddiviso in 4 parti A, B, C e D. Utilizziamo i dati di allenamento completi e i dati di test A, B, C con le loro pseudo etichette, insieme come nuovo set di training e prevediamo il test impostare D.

Lo stesso metodo viene utilizzato per prevedere A, B e C. Questo approccio, inventato da Xiaozhou, funziona sorprendentemente bene e riduce la perdita di convalida incrociata locale, la perdita di LB pubblica e la perdita di LB privata. Il miglior modello di apprendimento semi-supervisionato può raggiungere 0,0023 nella perdita di log LB privata, che è il miglior punteggio rispetto a tutte le nostre soluzioni.

Davvero non vedo come possa migliorare i risultati. È perché il 30% del set di test è stato "trapelato" ed è stato un modo per utilizzare queste informazioni?

O c'è qualche motivo teorico che spiega perché funziona?

Risposte:


8

Non sembra essere troppo adatto. Intuitivamente, il sovradimensionamento implica l'addestramento alle stranezze (rumore) del set di allenamento e quindi il peggio su un set di test resistito che non condivide queste stranezze. Se capisco cosa è successo, non hanno fatto inaspettatamente-scarsamente dati di test dati e quindi ciò esclude empiricamente l'eccessivo adattamento. (Hanno un altro problema, che citerò alla fine, ma non è troppo adatto.)

Quindi hai ragione sul fatto che sfrutta i dati di test disponibili (30%?). La domanda è: come?

Se ai dati di test disponibili sono associate etichette, potresti semplicemente inserirlo nei tuoi dati di allenamento e allargare i tuoi dati di allenamento, il che in generale produrrebbe risultati migliori in modo ovvio. Nessun risultato reale lì.

Nota che le etichette non dovrebbero essere esplicitamente elencate se hai accesso a un punteggio di precisione. Potresti semplicemente scalare il gradiente di precisione inviando ripetutamente i punteggi, che è quello che le persone hanno fatto in passato con competizioni mal progettate.

Dato che i dati di test disponibili non hanno etichette associate - direttamente o indirettamente - ci sono almeno altre due possibilità:

Innanzitutto, questo potrebbe essere un metodo di potenziamento indiretto in cui ti stai concentrando sui casi in cui le tue previsioni con solo i dati di allenamento non sono d'accordo con le tue previsioni con i dati di test pseudo-etichettati inclusi.

In secondo luogo, potrebbe essere un apprendimento semi-supervisionato semplice. Intuitivamente: potresti utilizzare la densità dei dati senza etichetta per aiutare a modellare i limiti di classificazione di un metodo supervisionato. Vedi l'illustrazione ( https://en.wikipedia.org/wiki/Semi-supervised_learning#/media/File:Example_of_unlabeled_data_in_semisupervised_learning.png ) nella definizione di Wikipedia di apprendimento semi-supervisionato per chiarire.

MA questo non significa che non ci sia un trucco qui. E questo trucco deriva dalla definizione di dati di allenamento e test. In linea di principio, i dati di training rappresentano i dati che potresti avere in mano quando sei pronto a distribuire il tuo modello. E i dati di test rappresentano i dati futuri che entreranno nel tuo sistema una volta operativo.

In tal caso, l'addestramento sui dati dei test è una perdita dal futuro , in cui stai sfruttando i dati che non avresti ancora visto. Questo è un grosso problema nel mondo reale, in cui alcune variabili potrebbero non esistere fino a dopo il fatto (diciamo dopo che è stata effettuata un'indagine) o potrebbero essere aggiornate in un secondo momento.

Quindi sono meta-giochi qui: ciò che hanno fatto è legittimo all'interno delle regole della competizione, perché hanno avuto accesso ad alcuni dei dati di test. Ma non è legittimo nel mondo reale, dove il vero test è quanto bene in futuro, sui nuovi dati.


2

No, non è troppo adatto.

Penso che la tua preoccupazione qui sia che il modello stia ampliando i dati invece di modellarli. Ciò dipende dalla complessità del modello (che è rimasto lo stesso) e dalle dimensioni dei dati. Succede quando il modello è troppo complesso e / o quando i dati di allenamento sono troppo piccoli, nessuno dei due casi è il caso qui. Il fatto che l'errore di test (errore di convalida incrociata) sia ridotto al minimo dopo l'apprendimento semi supervisionato dovrebbe implicare che non sia stato adattato eccessivamente.

Sul perché un tale approccio funziona anche
L'approccio usato qui non è fuori dal mondo, ho visto molte persone farlo in molte competizioni di apprendimento automatico (mi dispiace, ci ho provato, ma non riesco a ricordare dove l'ho visto).
Quando si prevede una parte dei dati di test e si include quello nella formazione, il modello verrà esposto a nuove funzionalità. In questo caso, i dati del test sono grandi quanto quelli dell'allenamento, non sorprende che stiano guadagnando così tanto con l'apprendimento semi-supervisionato.

Spero che questo spieghi
Grazie


Devi definire chiaramente "il modello". Questo è molto simile all'intero problema dei gradi di libertà generalizzati ( pegasus.cc.ucf.edu/~lni/sta6236/Ye1998.pdf ), in cui qualcuno indica il "modello finale", che sembra essere semplice, ma che in realtà ha molta complessità inserita nel processo. Il mio istinto è che non puoi semplicemente ignorare il resto del processo e puntare al "modello finale", affermare che non è più complesso del "modello finale" senza il passaggio semi-supervisionato, e quindi procedere. Il miglioramento dei risultati dei test fuori campione è un buon indicatore, come dici tu.
Wayne,

2

Non è eccessivo adattamento eccessivo (a seconda della definizione). Le informazioni sul target del set di test vengono conservate. Semi-supervisionato consente di generare un set di dati sintetici extra su cui addestrare il modello. Nell'approccio descritto, i dati di allenamento originali sono miscelati non ponderati con sintetici in rapporto 4: 3. Pertanto, se la qualità dei dati sintetici è scarsa, l'approccio risulterebbe disastroso. Immagino per qualsiasi problema in cui le previsioni sono incerte, il set di dati sintetici sarebbe di scarsa precisione. Se la struttura sottostante è molto complessa e il sistema ha un basso livello di rumore, credo che possa aiutare a generare dati sintetici. Penso che l'apprendimento semi-supervisionato sia piuttosto grande nell'ambito del deep learning (non della mia esperienza), dove anche la rappresentazione delle caratteristiche deve essere appresa.

Ho provato a riprodurre una maggiore accuratezza con un addestramento semi-supervisionato su diversi set di dati sia con rf che con xgboost senza alcun risultato positivo. [Sentiti libero di modificare il mio codice.] Ho notato che l'effettivo miglioramento della precisione usando semi-supervisionato è abbastanza modesto nel rapporto Kaggle, forse casuale?

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)

inserisci qui la descrizione dell'immagine

#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

1

Con questa definizione: "L'overfitting si verifica quando un modello statistico descrive errori o rumori casuali invece della relazione sottostante." (Wikipedia), la soluzione non è eccessiva.

Ma in questa situazione:
- I dati di test sono un flusso di articoli e non un insieme fisso di articoli.
OPPURE
- Il processo di previsione non deve contenere una fase di apprendimento (ad esempio a causa di problemi di prestazioni)

La soluzione citata è troppo adatta. Perché l'accuratezza della modellazione è più che situazioni reali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.