피팅에 비해 총체적이지 않습니다 (정의에 따라 다름). 테스트 세트의 대상 정보가 유지됩니다. semi-supervised는 모델을 훈련시키기 위해 추가적인 합성 데이터 세트를 생성 할 수 있습니다. 기술 된 접근법에서, 원래의 훈련 데이터는 4 : 3의 비율로 합성과 비가 중으로 혼합된다. 따라서, 합성 데이터의 품질이 좋지 않으면, 그 접근법은 비참한 결과를 초래할 것입니다. 예측이 불확실한 문제에 대해서는 합성 데이터 세트의 정확도가 떨어질 것입니다. 기본 구조가 매우 복잡하고 시스템의 소음이 적 으면 합성 데이터를 생성하는 데 도움이 될 수 있습니다. 나는 반지도 학습이 기능 표현을 배우는 딥 러닝 (전문 지식이 아닌) 내에서 상당히 크다고 생각합니다.
나는 긍정적 인 결과없이 rf와 xgboost를 사용하여 여러 데이터 세트에 대한 반 감독 훈련으로 정확도를 높이려고 노력했습니다. [코드를 자유롭게 편집 할 수 있습니다.] 세미 감독을 사용하는 실제 정확도 향상은 카글 보고서에서 매우 적습니다.
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