มันไม่ได้ทำยอดรวมเกินความเหมาะสม (ขึ้นอยู่กับคำจำกัดความ) ข้อมูลเป้าหมายของชุดทดสอบจะถูกเก็บรักษาไว้ การควบคุมแบบกึ่งอนุญาตให้สร้างชุดข้อมูลสังเคราะห์พิเศษเพื่อฝึกฝนโมเดล ในวิธีการที่อธิบายไว้ข้อมูลการฝึกอบรมดั้งเดิมจะถูกนำมาผสมกันโดยไม่ถ่วงกับสังเคราะห์ในอัตราส่วน 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