“半监督学习”-过度拟合吗?


21

我正在阅读Kaggle竞赛获奖解决方案的报告(恶意软件分类)。该报告可在此论坛帖子中找到。问题是分类问题(九个类别,度量标准是对数损失),其中训练集中有10000个元素,测试集中有10000个元素。

在比赛期间,针对30%的测试集对模型进行了评估。另一个重要因素是模型的表现非常出色(准确性接近100%)

作者使用以下技术:

我们提出的另一项重要技术是半监督学习。我们首先通过选择最佳模型的最大概率来生成测试集的伪标签。然后,我们将使用训练数据和测试数据以交叉验证的方式再次预测测试集。例如,将测试数据集分为A,B,C和D四个部分。我们使用整个训练数据,并将测试数据A,B,C及其伪标签一起用作新的训练集,并预测测试设置D。

相同的方法用于预测A,B和C。这是由Xiaozhou发明的,效果出乎意料,并且可以减少局部交叉验证损失,公共LB损失和私人LB损失。最佳的半监督学习模型可以使私人LB对数丢失达到0.0023,这是我们所有解决方案中的最高分。

我真的不知道它如何改善结果。是因为30%的测试集被“泄漏”了,这是使用此信息的一种方式吗?

还是有任何理论上的原因可以解释其原理?

Answers:


8

它似乎并不过分。从直觉上讲,过度拟合意味着对训练集的怪癖(噪声)进行训练,因此在不共享这些怪癖的坚持型测试集上做得更糟。如果我了解发生了什么,他们就不会对保留的测试数据进行预想不到的处理,因此从经验上排除了过度拟合的可能性。(他们还有另一个问题,我将在结尾处提到,但这并不过分。)

所以您是正确的,它利用了可用的(30%?)测试数据。问题是:如何?

如果可用的测试数据具有与之相关的标签,则可以将其简单地合并到训练数据中并扩大训练数据,这通常会以明显的方式产生更好的结果。那里没有真正的成就。

请注意,如果您可以访问准确性得分,则不必明确列出标签。您可以通过重复提交分数来简单地提高准确性梯度,这是过去人们在竞赛设计不佳的情况下所做的。

鉴于可用的测试数据没有直接或间接与之关联的标签,至少还有另外两种可能性:

首先,这可能是一种间接的增强方法,您将注意力集中在仅包含训练数据的预测与包含伪标记的测试数据的预测不一致的情况下。

其次,这可能是直接的半监督学习。直观地:您可能正在使用未标记数据的密度来帮助确定监督方法的分类边界。请参阅半监督学习的Wikipedia定义中的插图(https://en.wikipedia.org/wiki/Semi-supervised_learning#/media/File:Example_of_unlabeled_data_in_semisupervised_learning.png)进行澄清。

但是,这并不意味着这里没有窍门。这个技巧来自训练和测试数据的定义。原则上,训练数据表示准备好部署模型时可能掌握的数据。测试数据表示将来的数据,一旦运行便会进入您的系统。

在这种情况下,对测试数据进行培训是未来泄漏,您正在利用尚未看到的数据。这是现实世界中的一个主要问题,其中某些变量可能要等到事后(例如调查完成后)才存在,或者可能在以后进行更新。

因此,他们在这里进行元游戏:他们的行为在比赛规则内是合法的,因为他们可以访问某些测试数据。但这在现实世界中是不合法的,在真实世界中,真正的考验是未来在新数据上的表现。


2

不,这并不过分。

我认为您在这里担心的是该模型使数据无心而没有建模。这取决于模型的复杂性(保持不变)和数据的大小。当模型过于复杂和/或训练数据太小时,就会发生这种情况,在此都不是。在半监督学习之后将测试错误(交叉验证错误)降到最低的事实表明,它并不太适合。

关于为什么这样的方法行之有效
的方法这里所使用的方法并不是世界一流的,我在很多机器学习比赛中都看到很多人这样做(很抱歉,我尝试过,但是无法回忆起我所看到的地方)。
当您预测一部分测试数据并将其包含在训练中时,该模型将具有新功能。在这种情况下,测试数据与训练数据一样大,难怪它们通过半监督学习获得了如此多的收益。

希望这能解释
谢谢


您需要明确定义“模型”。这很像整个广义自由度(pegasus.cc.ucf.edu/~lni/sta6236/Ye1998.pdf)问题,其中有人指出“最终模型”,这看起来很简单,但实际上具有过程中充满了很多复杂性。我的直觉是,您不能不理会其余的过程,而是指向“最终模型”,声称没有半监督步骤就不会比“最终模型”复杂,然后继续进行。正如您所说,样本外测试结果的改善一个很好的指标。
韦恩

2

它并不适合(取决于定义)。测试集的目标信息被保留。半监督允许生成额外的综合数据集以训练模型。在所描述的方法中,原始训练数据未加权与合成以4:3的比例混合。因此,如果综合数据的质量较差,则该方法将带来灾难性的后果。我猜想对于预测不确定的任何问题,综合数据集的准确性都会很差。我想,如果底层结构非常复杂且系统具有较低的噪声,则可能有助于生成合成数据。我认为半监督学习在深度学习(不是我的专业知识)中非常重要,在该学习中也要学习特征表示。

我试图通过对rf和xgboost的多个数据集进行半监督训练来提高准确性,但没有任何积极结果。[随意编辑我的代码。]我注意到在kaggle报告中使用半监督的准确性的实际提高是相当适度的,也许是随机的?

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)

在此处输入图片说明

#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

通过这个定义:“当统计模型描述随机误差或噪声而不是基本关系时,就会发生过度拟合。”(维基百科),解决方案并不是过度拟合。

但是在这种情况下:
-测试数据是项目流,而不是固定的项目集。

-预测过程不应包含学习阶段(例如由于性能问题)

,上述解决方案过于适合。因为建模的准确性远不止实际情况。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.