„Częściowo nadzorowane uczenie się” - czy to jest zbyt dobre?

21

Czytałem raport o zwycięskim rozwiązaniu konkursu Kaggle ( klasyfikacja złośliwego oprogramowania ). Raport można znaleźć w tym poście na forum . Problemem był problem z klasyfikacją (dziewięć klas, metryką była strata logarytmiczna) ze 10000 elementami w zestawie pociągów, 10000 elementów w zestawie testowym.

Podczas zawodów modele były oceniane w stosunku do 30% zestawu testowego. Kolejnym ważnym elementem jest to, że modele działały bardzo dobrze (blisko 100% dokładności)

Autorzy zastosowali następującą technikę:

Kolejną ważną techniką, którą wymyśliliśmy, jest Semisupervised Learning. Najpierw generujemy pseudo etykiety zestawu testowego, wybierając maksymalne prawdopodobieństwo naszego najlepszego modelu. Następnie przewidujemy zestaw testowy ponownie w sposób krzyżowy z danymi pociągu i danymi testowymi. Na przykład zestaw danych testowych jest podzielony na 4 części A, B, C i D. Używamy całych danych treningowych, a dane testowe A, B, C wraz z ich pseudo etykietami, razem jako nowy zestaw szkoleniowy i przewidujemy test zestaw D.

Ta sama metoda jest stosowana do przewidywania A, B i C. To podejście, wynalezione przez Xiaozhou, działa zaskakująco dobrze i zmniejsza lokalną utratę krzyżowej walidacji, publiczną utratę LB i prywatną utratę LB. Najlepszy model uczenia się z półprzewodnikiem może osiągnąć 0,0023 straty w prywatnym dzienniku LB, co jest najlepszym wynikiem dla wszystkich naszych rozwiązań.

Naprawdę nie rozumiem, jak może poprawić wyniki. Czy to dlatego, że 30% zestawu testowego „wyciekło” i był to sposób na wykorzystanie tych informacji?

Czy może jest jakiś teoretyczny powód wyjaśniający, dlaczego to działa?

RUser4512
źródło

Odpowiedzi:

8

Nie wydaje się, aby był zbyt dobry. Intuicyjnie nadmierne dopasowanie pociąga za sobą dziwactwa (hałas) zestawu treningowego, a zatem pogarsza się w przypadku zestawu testowego, który nie dzieli tych dziwactw. Jeśli rozumiem, co się stało, nie zrobili nieoczekiwanie słabego wpływu na dane testowe, a zatem empirycznie wykluczają nadmierne dopasowanie. (Mają jeszcze jeden problem, o którym wspomnę na końcu, ale to nie jest zbyt mocne.)

Masz więc rację, że wykorzystuje dostępne (30%?) Dane testowe. Pytanie brzmi: jak?

Jeśli z dostępnymi danymi testowymi są powiązane etykiety, możesz po prostu połączyć je ze swoimi danymi treningowymi i powiększyć dane treningowe, co ogólnie przyniosłoby lepsze wyniki w oczywisty sposób. Nie ma tam prawdziwego osiągnięcia.

Pamiętaj, że etykiety nie musiałyby być wyraźnie wymienione, jeśli masz dostęp do oceny dokładności. Możesz po prostu wspiąć się na gradient dokładności, wielokrotnie przedstawiając wyniki, co ludzie robili w przeszłości przy źle zaprojektowanych zawodach.

Biorąc pod uwagę, że dostępne dane testowe nie są powiązane z etykietami - bezpośrednio lub pośrednio - istnieją co najmniej dwie inne możliwości:

Po pierwsze, może to być metoda pośredniego wzmocnienia, w której skupiasz się na przypadkach, w których twoje prognozy zawierające tylko dane treningowe nie zgadzają się z twoimi przewidywaniami z dołączonymi pseudo-etykietowanymi danymi testowymi.

Po drugie, może to być proste, częściowo nadzorowane uczenie się. Intuicyjnie: możesz wykorzystać gęstość nieznakowanych danych, aby pomóc w ukształtowaniu granic klasyfikacji nadzorowanej metody. Zobacz ilustrację ( https://en.wikipedia.org/wiki/Semi-supervised_learning#/media/File:Example_of_unlabeled_data_in_semisupervised_learning.png ) w definicji Wikipedii częściowo nadzorowanego uczenia się w celu wyjaśnienia.

Ale to nie znaczy, że nie ma tu żadnej sztuczki. Ta sztuczka pochodzi z definicji danych treningowych i testowych. Zasadniczo dane szkoleniowe reprezentują dane, które możesz mieć pod ręką, gdy będziesz gotowy do wdrożenia swojego modelu. Dane testowe reprezentują przyszłe dane, które pojawią się w twoim systemie, gdy będzie on operacyjny.

W takim przypadku szkolenie z danych testowych to wyciek z przyszłości , w której korzystasz z danych, których jeszcze nie widziałeś. Jest to poważny problem w świecie rzeczywistym, w którym niektóre zmienne mogą nie istnieć przed faktem (powiedzmy po zakończeniu badania) lub mogą zostać zaktualizowane w późniejszym terminie.

Są więc meta-grą tutaj: to, co zrobili, jest zgodne z regułami konkurencji, ponieważ otrzymali dostęp do niektórych danych testowych. Ale nie jest to uzasadnione w prawdziwym świecie, gdzie prawdziwym testem jest to, jak dobrze sobie radzi w przyszłości, na nowych danych.

Wayne
źródło
2

Nie, to nie jest zbyt dobre.

Myślę, że martwisz się tym, że model zapisuje dane w pamięci zamiast je modelować. Zależy to od złożoności modelu (który pozostał ten sam) i wielkości danych. Dzieje się tak, gdy model jest zbyt skomplikowany i / lub gdy dane szkoleniowe są zbyt małe, co nie ma tu miejsca. Fakt, że błąd testu (błąd weryfikacji krzyżowej) jest minimalizowany po nauce częściowo nadzorowanej, powinien oznaczać, że nie jest on nadmiernie dopasowany.

Dlaczego takie podejście w ogóle działa
. Zastosowane tutaj podejście nie jest pozaziemskie, widziałem wiele osób robiących to w wielu konkursach uczenia maszynowego (Przepraszam, próbowałem, ale nie mogę sobie przypomnieć, gdzie to widziałem).
Gdy przewidujesz część danych testowych i uwzględnisz ją w szkoleniu, model będzie narażony na nowe funkcje. W tym przypadku dane testowe są tak duże, jak dane treningowe, nic dziwnego, że zdobywają tak wiele dzięki częściowo nadzorowanemu uczeniu się.

Mam nadzieję, że to wyjaśnia
Dzięki

Vihari Piratla
źródło
Musisz jasno zdefiniować „model”. Jest to bardzo podobne do całego problemu Uogólnionego stopnia wolności ( pegasus.cc.ucf.edu/~lni/sta6236/Ye1998.pdf ), w którym ktoś wskazuje na „ostateczny model”, który wydaje się prosty, ale w rzeczywistości ma w tym procesie jest dużo złożoności. Instynktownie twierdzę, że nie można po prostu zignorować reszty procesu i wskazać „ostateczny model”, twierdząc, że nie jest on bardziej złożony niż „ostateczny model” bez częściowo nadzorowanego kroku, a następnie kontynuować. Jak mówisz, poprawa wyników badań poza próbą jest dobrym wskaźnikiem.
Wayne
2

Nie jest to rażące dopasowanie (w zależności od definicji). Informacje docelowe zestawu testowego są zachowane. Częściowo nadzorowany pozwala wygenerować dodatkowy zestaw danych syntetycznych do trenowania modelu. W opisywanym podejściu oryginalne dane treningowe są mieszane nieważone z syntetycznym w stosunku 4: 3. Tak więc, jeśli jakość danych syntetycznych jest niska, podejście okazałoby się katastrofalne. Myślę, że w przypadku jakiegokolwiek problemu, w którym prognozy są niepewne, syntetyczny zestaw danych byłby słabej dokładności. Jeśli podstawowa struktura jest bardzo złożona, a system ma niski poziom hałasu, może to pomóc w generowaniu syntetycznych danych. Myślę, że częściowo nadzorowane uczenie się jest dość duże w ramach głębokiego uczenia się (nie mojej wiedzy specjalistycznej), gdzie należy nauczyć się reprezentacji funkcji.

Próbowałem odtworzyć zwiększoną dokładność z częściowo nadzorowanym treningiem na kilku zestawach danych zarówno z rf, jak i xgboost, bez żadnego pozytywnego wyniku. [Nie wahaj się edytować mojego kodu.] Zauważyłem, że faktyczna poprawa dokładności za pomocą częściowo nadzorowanego jest dość skromna w raporcie kaggle, może przypadkowym?

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)

wprowadź opis zdjęcia tutaj

#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
źródło
1

Zgodnie z tą definicją: „Nadmierne dopasowanie występuje, gdy model statystyczny opisuje losowy błąd lub szum zamiast podstawowej relacji.” (Wikipedia), rozwiązanie nie jest nadmierne.

Ale w tej sytuacji:
- Dane testowe to strumień przedmiotów, a nie stały zestaw przedmiotów.
LUB
- Proces prognozowania nie powinien zawierać fazy uczenia się (na przykład z powodu problemów z wydajnością)

. Wspomniane rozwiązanie jest zbyt dobre. Ponieważ dokładność modelowania to coś więcej niż rzeczywiste sytuacje.

parvij
źródło