"Teilüberwachtes Lernen" - ist das übertrieben?


21

Ich las den Bericht über die Siegerlösung eines Kaggle-Wettbewerbs ( Malware Classification ). Der Bericht ist in diesem Forumsbeitrag zu finden . Das Problem war ein Klassifizierungsproblem (neun Klassen, die Metrik war der logarithmische Verlust) mit 10000 Elementen in der Zugmenge, 10000 Elementen in der Testmenge.

Während des Wettbewerbs wurden die Modelle mit 30% des Testsatzes bewertet. Ein weiteres wichtiges Element ist, dass die Modelle sehr gut abschnitten (nahezu 100% Genauigkeit).

Die Autoren verwendeten die folgende Technik:

Eine weitere wichtige Technik, die wir entwickeln, ist semisupervised learning. Wir generieren zuerst Pseudo-Labels von Testmengen, indem wir die maximale Wahrscheinlichkeit unseres besten Modells wählen. Dann prognostizieren wir den Testsatz erneut in einer Kreuzvalidierungsweise mit sowohl Zugdaten als auch Testdaten. Beispielsweise wird der Testdatensatz in 4 Teile A, B, C und D aufgeteilt. Wir verwenden die gesamten Trainingsdaten und die Testdaten A, B, C mit ihren Pseudomarkierungen zusammen als neuen Trainingssatz und sagen den Test voraus set D.

Die gleiche Methode wird verwendet, um A, B und C vorherzusagen. Dieser von Xiaozhou erfundene Ansatz funktioniert überraschend gut und reduziert den Verlust der lokalen Kreuzvalidierung, den Verlust der öffentlichen LB und den Verlust der privaten LB. Das beste teilüberwachte Lernmodell kann einen privaten LB-Protokollverlust von 0,0023 erzielen. Dies ist die beste Punktzahl für alle unsere Lösungen.

Ich sehe wirklich nicht, wie es die Ergebnisse verbessern kann. Liegt es daran, dass 30% des Testsatzes "durchgesickert" waren und diese Informationen auf diese Weise verwendet wurden?

Oder gibt es einen theoretischen Grund, warum es funktioniert?

Antworten:


8

Es scheint nicht überpassend zu sein. Intuitiv bedeutet eine Überanpassung, dass die Macken (Geräusche) des Trainingssatzes trainiert werden und sich daher bei einem durchgehaltenen Testsatz, der diese Macken nicht teilt, verschlechtern. Wenn ich verstehe, was passiert ist, haben sie nicht unerwartet schlechte Ergebnisse mit durchgehaltenen Testdaten erzielt, sodass eine Überanpassung empirisch ausgeschlossen ist. (Sie haben ein anderes Problem, das ich am Ende erwähnen werde, aber es ist nicht überpassend.)

Sie haben also Recht, dass es die verfügbaren (30%?) Testdaten nutzt. Die Frage ist: wie?

Wenn den verfügbaren Testdaten Beschriftungen zugeordnet sind, können Sie sie einfach in Ihre Trainingsdaten einfügen und Ihre Trainingsdaten vergrößern, was im Allgemeinen auf offensichtliche Weise zu besseren Ergebnissen führen würde. Keine wirkliche Leistung dort.

Beachten Sie, dass die Beschriftungen nicht explizit aufgelistet werden müssen, wenn Sie Zugriff auf eine Genauigkeitsbewertung haben. Sie können den Genauigkeitsgradienten einfach durch wiederholtes Einreichen von Punktzahlen erhöhen, was in der Vergangenheit bei schlecht konzipierten Wettbewerben der Fall war.

Da die verfügbaren Testdaten weder direkt noch indirekt mit Labels verknüpft sind, gibt es mindestens zwei weitere Möglichkeiten:

Erstens könnte dies eine indirekte Auffrischungsmethode sein, bei der Sie sich auf Fälle konzentrieren, in denen Ihre Vorhersagen mit nur den Trainingsdaten nicht mit Ihren Vorhersagen mit den enthaltenen pseudo-markierten Testdaten übereinstimmen.

Zweitens könnte es sich um einfaches, halbüberwachtes Lernen handeln. Intuitiv: Sie können die Dichte unbeschrifteter Daten verwenden, um die Klassifizierungsgrenzen einer überwachten Methode zu bestimmen. Siehe die Abbildung ( https://en.wikipedia.org/wiki/Semi-supervised_learning#/media/File:Example_of_unlabeled_data_in_semisupervised_learning.png ) in der Wikipedia-Definition des halbüberwachten Lernens, um dies zu verdeutlichen.

ABER das heißt nicht, dass es hier keinen Trick gibt. Und dieser Trick ergibt sich aus der Definition von Trainings- und Testdaten. Grundsätzlich handelt es sich bei den Trainingsdaten um Daten, die Sie haben könnten, wenn Sie bereit sind, Ihr Modell bereitzustellen. Und Testdaten stellen zukünftige Daten dar, die in Ihr System eingehen, sobald es betriebsbereit ist.

In diesem Fall ist das Training zu Testdaten ein Leck aus der Zukunft , in dem Sie Daten nutzen, die Sie noch nicht gesehen haben. Dies ist ein großes Problem in der realen Welt, in der einige Variablen möglicherweise erst nachträglich existieren (etwa nach Abschluss einer Untersuchung) oder zu einem späteren Zeitpunkt aktualisiert werden.

Hier handelt es sich also um Meta-Gaming: Was sie getan haben, ist im Rahmen der Wettbewerbsregeln legitim, da ihnen Zugriff auf einige der Testdaten gewährt wurde. Aber es ist in der realen Welt nicht legitim, wo der wahre Test ist, wie gut es in der Zukunft mit neuen Daten abschneidet.


2

Nein, es ist nicht überpassend.

Ich glaube, Sie machen sich Sorgen, dass das Modell die Daten nicht modelliert, sondern nach Herzenslust erstellt. Das hängt von der Komplexität des Modells (die gleich geblieben ist) und der Größe der Daten ab. Dies passiert, wenn das Modell zu komplex ist und / oder wenn die Trainingsdaten zu klein sind, was hier nicht der Fall ist. Die Tatsache, dass der Testfehler (Kreuzvalidierungsfehler) nach dem halbüberwachten Lernen minimiert wird, sollte bedeuten, dass er nicht überpasst ist.

Warum ein solcher Ansatz überhaupt funktioniert
Der hier verwendete Ansatz ist nicht verrückt. Ich habe viele Leute gesehen, die dies in vielen maschinellen Lernwettbewerben taten.
Wenn Sie einen Teil der Testdaten vorhersagen und in das Training einbeziehen, ist das Modell neuen Funktionen ausgesetzt. In diesem Fall sind die Testdaten so groß wie die Trainingsdaten, kein Wunder, dass sie durch teilüberwachtes Lernen so viel gewinnen.

Hoffe das erklärt
Danke


Sie müssen "das Modell" klar definieren. Dies ähnelt in etwa dem gesamten Problem der verallgemeinerten Freiheitsgrade ( pegasus.cc.ucf.edu/~lni/sta6236/Ye1998.pdf ), bei dem jemand auf das "endgültige Modell" verweist, das einfach zu sein scheint, das es jedoch tatsächlich gibt viel Komplexität steckt in dem Prozess. Mein Instinkt ist, dass Sie den Rest des Prozesses nicht einfach ignorieren und auf das "endgültige Modell" verweisen können, behaupten, es sei nicht komplexer als das "endgültige Modell" ohne den halbüberwachten Schritt und fahren dann fort. Die Verbesserung der Testergebnisse außerhalb der Stichprobe ist , wie Sie sagen, ein guter Indikator.
Wayne

2

Es ist nicht grob überpassend (abhängig von der Definition). Die Zielinformationen des Testsatzes bleiben erhalten. Halbüberwachtes Erstellen eines zusätzlichen synthetischen Datensatzes zum Trainieren des Modells. Bei dem beschriebenen Ansatz werden ursprüngliche Trainingsdaten ungewichtet mit synthetischen im Verhältnis 4: 3 gemischt. Wenn also die Qualität der synthetischen Daten schlecht ist, würde sich der Ansatz als katastrophal herausstellen. Ich vermute, für jedes Problem, bei dem Vorhersagen unsicher sind, wäre der synthetische Datensatz von geringer Genauigkeit. Wenn die zugrunde liegende Struktur sehr komplex ist und das System ein geringes Rauschen aufweist, kann es wahrscheinlich hilfreich sein, synthetische Daten zu generieren. Ich denke, dass semi-betreutes Lernen innerhalb des Tiefenlernens ziemlich groß ist (nicht meine Expertise), wo die Repräsentation von Merkmalen auch erlernt werden soll.

Ich habe versucht, eine erhöhte Genauigkeit mit halbüberwachtem Training an mehreren Datensätzen mit RF und XGBOOST zu reproduzieren, ohne dass dies zu einem positiven Ergebnis geführt hätte. [Fühlen Sie sich frei, meinen Code zu bearbeiten.] Ich stelle fest, dass die tatsächliche Verbesserung der Genauigkeit bei Verwendung von halbüberwachtem Code im Kaggle-Bericht recht bescheiden ist, vielleicht zufällig?

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)

Bildbeschreibung hier eingeben

#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

Nach dieser Definition: "Überanpassung tritt auf, wenn ein statistisches Modell zufällige Fehler oder Rauschen anstelle der zugrunde liegenden Beziehung beschreibt." (Wikipedia) ist die Lösung nicht überanpassend.

Aber in dieser Situation:
- Testdaten sind ein Datenstrom von Elementen und keine feste Menge von Elementen.
ODER
- Vorhersageprozess sollte keine Lernphase enthalten (z. B. aufgrund von Leistungsproblemen)

Die erwähnte Lösung ist überpassend. Weil die Genauigkeit der Modellierung mehr ist als reale Situationen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.