(定義による)過剰なフィッティングではありません。テストセットのターゲット情報は保持されます。半教師付きにより、モデルをトレーニングするための追加の合成データセットを生成できます。記述されたアプローチでは、元のトレーニングデータは比率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