“半监督学习”——这是过拟合吗?

机器算法验证 机器学习 随机森林 助推 过拟合 半监督学习
2022-02-08 03:52:10

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

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

作者使用了以下技术:

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

使用相同的方法来预测 A、B 和 C。这种方法由 Xiaozhou 发明,效果非常好,它减少了局部交叉验证损失、公共 LB 损失和私有 LB 损失。最好的半监督学习模型可以在私有 LB 对数损失中达到 0.0023,这是我们所有解决方案中的最佳分数。

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

还是有任何理论上的理由来解释它为什么起作用?

4个回答

它似乎没有过度拟合。直观地说,过度拟合意味着对训练集的怪癖(噪声)进行训练,因此在不具有这些怪癖的保留测试集上表现更差。如果我理解发生了什么,他们在保留的测试数据上并没有出人意料地表现不佳,因此从经验上排除了过度拟合。(他们还有另一个问题,我会在最后提到,但它并没有过度拟合。)

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

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

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

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

首先,这可能是一种间接提升方法,您可以专注于仅使用训练数据的预测与包含伪标记测试数据的预测不一致的情况。

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

但这并不意味着这里没有技巧。这个技巧来自训练和测试数据的定义。原则上,训练数据代表您准备好部署模型时手头的数据。测试数据代表了系统运行后将进入您的系统的未来数据。

在这种情况下,对测试数据的训练是未来的一个漏洞,你正在利用你还没有看到的数据。这是现实世界中的一个主要问题,其中一些变量可能要到事实发生后(比如调查完成后)才存在,或者可能会在以后更新。

所以他们在这里进行元游戏:他们所做的在比赛规则范围内是合法的,因为他们获得了一些测试数据的访问权限。但这在现实世界中是不合法的,真正的测试是它在未来对新数据的表现如何。

不,它不是过拟合。

我认为您在这里担心的是该模型是对数据进行处理而不是对其进行建模。这取决于模型的复杂性(保持不变)和数据的大小。当模型太复杂和/或训练数据太小时,就会发生这种情况,这两种情况都不是。在半监督学习之后测试误差(交叉验证误差)最小化的事实应该意味着它没有过度拟合。

关于为什么这种方法甚至有效
这里使用的方法并不是世界范围内的,我在许多机器学习比赛中看到很多人这样做(对不起,我试过了,但不记得我在哪里看到过这个)。
当您预测一部分测试数据并将其包含在训练中时,模型将暴露于新特征。在这种情况下,测试数据和训练数据一样大,难怪他们通过半监督学习获得了这么多。

希望这能解释
谢谢

它不是严重的过度拟合(取决于定义)。测试集的目标信息被保留。半监督允许生成额外的合成数据集来训练模型。在所描述的方法中,原始训练数据以 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

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

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

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

上述解决方案是过度拟合。因为建模的准确性超过了真实情况。