«Apprentissage semi-supervisé» - est-ce trop adapté?

21

Je lisais le rapport de la solution gagnante d'un concours Kaggle ( Malware Classification ). Le rapport peut être trouvé dans cet article du forum . Le problème était un problème de classification (neuf classes, la métrique était la perte logarithmique) avec 10000 éléments dans le train, 10000 éléments dans le test.

Pendant la compétition, les modèles ont été évalués contre 30% de l'ensemble de test. Un autre élément important est que les modèles fonctionnaient très bien (près de 100% de précision)

Les auteurs ont utilisé la technique suivante:

Une autre technique importante que nous proposons est l'apprentissage semi-supervisé. Nous générons d'abord des pseudo étiquettes d'ensemble de test en choisissant la probabilité maximale de notre meilleur modèle. Ensuite, nous prédisons à nouveau l'ensemble de test de manière croisée avec les données de train et les données de test. Par exemple, l'ensemble de données de test est divisé en 4 parties A, B, C et D. Nous utilisons l'ensemble des données de formation et les données de test A, B, C avec leurs pseudo-étiquettes, ensemble en tant que nouvel ensemble de formation et nous prédisons le test définir D.

La même méthode est utilisée pour prédire A, B et C. Cette approche, inventée par Xiaozhou, fonctionne étonnamment bien et elle réduit la perte de validation croisée locale, la perte de LB publique et la perte de LB privée. Le meilleur modèle d'apprentissage semi-supervisé peut atteindre 0,0023 en perte de journal LB privé, ce qui est le meilleur score sur toutes nos solutions.

Je ne vois vraiment pas comment cela peut améliorer les résultats. Est-ce parce que 30% de l'ensemble de test a été "divulgué" et que c'était un moyen d'utiliser ces informations?

Ou y a-t-il une raison théorique expliquant pourquoi cela fonctionne?

RUser4512
la source

Réponses:

8

Il ne semble pas être trop adapté. Intuitivement, le surapprentissage implique de s'entraîner aux caprices (bruit) de l'ensemble d'entraînement et donc de faire pire sur un ensemble d'essai qui ne partage pas ces caprices. Si je comprends ce qui s'est passé, ils ne se sont pas comportés de manière inattendue sur les données de test retenues et de sorte que cela exclut empiriquement le sur-ajustement. (Ils ont un autre problème, que je mentionnerai à la fin, mais ce n'est pas trop adapté.)

Vous avez donc raison de tirer parti des données de test disponibles (30%?). La question est: comment?

Si les données de test disponibles sont associées à des étiquettes, vous pouvez simplement les regrouper dans vos données d'entraînement et agrandir vos données d'entraînement, ce qui en général donnerait de meilleurs résultats de manière évidente. Aucun réel accomplissement là-bas.

Notez que les étiquettes n'auraient pas à être explicitement répertoriées si vous avez accès à un score de précision. Vous pouvez simplement grimper le gradient de précision en soumettant des scores à plusieurs reprises, ce que les gens ont fait dans le passé avec des compétitions mal conçues.

Étant donné que les données de test disponibles n'ont pas d'étiquettes associées - directement ou indirectement - il existe au moins deux autres possibilités:

Tout d'abord, cela pourrait être une méthode de renforcement indirecte où vous vous concentrez sur les cas où vos prédictions avec uniquement les données de formation sont en désaccord avec vos prédictions avec les données de test pseudo-étiquetées incluses.

Deuxièmement, il pourrait s'agir d'un apprentissage semi-supervisé simple. Intuitivement: vous pourriez utiliser la densité de données non étiquetées pour aider à façonner les limites de classification d'une méthode supervisée. Voir l'illustration ( https://en.wikipedia.org/wiki/Semi-supervised_learning#/media/File:Example_of_unlabeled_data_in_semisupervised_learning.png ) dans la définition Wikipédia de l'apprentissage semi-supervisé pour clarifier.

MAIS cela ne signifie pas qu'il n'y a pas de truc ici. Et cette astuce vient de la définition des données de formation et de test. En principe, les données de formation représentent des données que vous pourriez avoir en main lorsque vous êtes prêt à déployer votre modèle. Et les données de test représentent les données futures qui entreront dans votre système une fois qu'il sera opérationnel.

Dans ce cas, la formation sur les données de test est une fuite du futur , où vous profitez de données que vous n'auriez pas encore vues. Il s'agit d'un problème majeur dans le monde réel, où certaines variables peuvent ne pas exister avant le fait (disons après qu'une enquête est terminée) ou peuvent être mises à jour à une date ultérieure.

Il s'agit donc de méta-jeux ici: ce qu'ils ont fait est légitime dans les règles de la compétition, car ils ont eu accès à certaines des données de test. Mais ce n'est pas légitime dans le monde réel, où le véritable test est de savoir comment il le fera à l'avenir, sur de nouvelles données.

Wayne
la source
2

Non, ce n'est pas trop.

Je pense que votre souci ici est que le modèle écoute les données au lieu de les modéliser. Cela dépend de la complexité du modèle (qui est resté le même) et de la taille des données. Cela se produit lorsque le modèle est trop complexe et / ou lorsque les données d'entraînement sont trop petites, ce qui n'est pas le cas ici. Le fait que l'erreur de test (erreur de validation croisée) soit minimisée après l'apprentissage semi-supervisé devrait impliquer qu'elle n'est pas sur-ajustée.

Pourquoi une telle approche fonctionne-t-elle?
L'approche utilisée ici n'est pas hors du monde, j'ai vu beaucoup de gens le faire dans de nombreux concours d'apprentissage automatique (Désolé, j'ai essayé, mais je ne me souviens pas où j'ai vu cela).
Lorsque vous prévoyez une partie des données de test et que vous l'incluez dans la formation, le modèle sera exposé à de nouvelles fonctionnalités. Dans ce cas, les données de test sont aussi grandes que les données de formation, pas étonnant qu'elles gagnent autant par un apprentissage semi-supervisé.

J'espère que cela explique
Merci

Vihari Piratla
la source
Vous devez définir clairement "le modèle". Cela ressemble beaucoup au problème des degrés de liberté généralisés ( pegasus.cc.ucf.edu/~lni/sta6236/Ye1998.pdf ), où quelqu'un pointe vers le "modèle final", qui semble simple, mais qui a en fait beaucoup de complexité insérée dans le processus. Mon instinct est que vous ne pouvez pas simplement ignorer le reste du processus et pointer vers le "modèle final", prétendre qu'il n'est pas plus complexe que le "modèle final" sans l'étape semi-supervisée, puis continuer. L'amélioration des résultats des tests hors échantillon est un bon indicateur, comme vous le dites.
Wayne
2

Ce n'est pas un sur-ajustement brut (selon la définition). Les informations cibles de l'ensemble de tests sont conservées. Semi-supervisé permet de générer un jeu de données synthétique supplémentaire pour former le modèle. Dans l'approche décrite, les données de formation originales sont mélangées non pondérées avec synthétiques dans un rapport 4: 3. Ainsi, si la qualité des données synthétiques est mauvaise, l'approche se révélera désastreuse. Je suppose que pour tout problème où les prédictions sont incertaines, l'ensemble de données synthétiques serait de mauvaise précision. Si la structure sous-jacente est très complexe et que le système a un faible bruit, cela peut aider à générer des données synthétiques, je suppose. Je pense que l'apprentissage semi-supervisé est assez important dans l'apprentissage profond (pas mon expertise), où la représentation des fonctionnalités doit également être apprise.

J'ai essayé de reproduire une précision accrue avec une formation semi-supervisée sur plusieurs ensembles de données avec rf et xgboost sans aucun résultat positif. [N'hésitez pas à modifier mon code.] Je constate que l'amélioration réelle de la précision en utilisant semi-supervisé est assez modeste dans le rapport kaggle, peut-être aléatoire?

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)

entrez la description de l'image ici

#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
la source
1

Selon cette définition: "Le sur-ajustement se produit lorsqu'un modèle statistique décrit une erreur ou un bruit aléatoire au lieu de la relation sous-jacente." (Wikipedia), la solution n'est pas un sur-ajustement.

Mais dans cette situation:
- Les données de test sont un flux d'éléments et non un ensemble fixe d'éléments.
OU
- Le processus de prédiction ne doit pas contenir de phase d'apprentissage (par exemple en raison de problèmes de performances)

La solution mentionnée est trop adaptée. Parce que la précision de la modélisation est plus que des situations réelles.

parvij
la source