“ การเรียนรู้แบบมีผู้ควบคุมกึ่ง” - การทำเกินนี้หรือไม่


21

ฉันอ่านรายงานเกี่ยวกับวิธีแก้ปัญหาการชนะของการแข่งขัน Kaggle ( การจำแนกประเภทมัลแวร์ ) รายงานสามารถพบได้ในโพสต์ฟอรั่มนี้ ปัญหาคือปัญหาการจัดหมวดหมู่ (เก้าคลาสตัวชี้วัดคือการสูญเสียลอการิทึม) ที่มี 10,000 องค์ประกอบในชุดรถไฟ 10,000 ชิ้นส่วนในชุดทดสอบ

ในระหว่างการแข่งขันแบบจำลองจะถูกประเมินเทียบกับ 30% ของชุดทดสอบ องค์ประกอบที่สำคัญอีกประการหนึ่งคือโมเดลมีประสิทธิภาพดีมาก (ใกล้เคียงกับความแม่นยำ 100%)

ผู้เขียนใช้เทคนิคต่อไปนี้:

อีกเทคนิคที่สำคัญที่เราเกิดขึ้นคือการเรียนรู้แบบ Semisupervised ก่อนอื่นเราสร้างฉลากเทียมของชุดทดสอบโดยเลือกความน่าจะเป็นสูงสุดของแบบจำลองที่ดีที่สุดของเรา จากนั้นเราคาดการณ์ชุดการทดสอบอีกครั้งในรูปแบบการตรวจสอบความถูกต้องทั้งข้อมูลรถไฟและข้อมูลการทดสอบ ตัวอย่างเช่นชุดข้อมูลการทดสอบแบ่งออกเป็น 4 ส่วน A, B, C และ D เราใช้ข้อมูลการฝึกอบรมทั้งหมดและทดสอบข้อมูล A, B, C พร้อมป้ายกำกับหลอกของพวกเขาพร้อมกันเป็นชุดฝึกอบรมใหม่และเราทำนายการทดสอบ ชุด D

วิธีเดียวกันนี้ใช้ในการทำนาย A, B และ C วิธีการนี้คิดค้นโดย Xiaozhou ทำงานได้ดีอย่างน่าประหลาดใจและช่วยลดการสูญเสียการตรวจสอบข้ามท้องถิ่นการสูญเสีย LB สาธารณะและการสูญเสีย LB ส่วนตัว รูปแบบการเรียนรู้ที่ดีที่สุดแบบ Semisupervised สามารถบรรลุ 0.0023 ในการสูญเสียบันทึกส่วนตัว LB ซึ่งเป็นคะแนนที่ดีที่สุดเหนือโซลูชันทั้งหมดของเรา

ฉันไม่เห็นว่ามันจะปรับปรุงผลลัพธ์ได้อย่างไร เป็นเพราะชุดทดสอบ 30% "รั่ว" และเป็นวิธีการใช้ข้อมูลนี้หรือไม่

หรือมีเหตุผลทางทฤษฎีที่อธิบายว่าทำไมมันได้ผล?

คำตอบ:


8

ดูเหมือนว่าจะไม่ได้รับข้อมูลมากเกินไป โดยสังหรณ์ใจ overfitting หมายถึงการฝึกอบรมเพื่อ quirks (เสียง) ของชุดฝึกอบรมและทำให้แย่ลงในชุดการทดสอบที่จัดขึ้นที่ไม่ได้ใช้ร่วม quirks เหล่านี้ หากฉันเข้าใจสิ่งที่เกิดขึ้นพวกเขาไม่ได้ทำข้อมูลการทดสอบที่ไม่ได้รับการจัดอันดับโดยไม่คาดคิดและเพื่อให้กฎเชิงประจักษ์เกินความเหมาะสม (พวกเขามีปัญหาอื่นที่ฉันจะพูดถึงในตอนท้าย แต่มันไม่ได้เป็นมากเกินไป)

ดังนั้นคุณถูกต้องว่าจะใช้ประโยชน์จากข้อมูลการทดสอบที่มีอยู่ (30%?) คำถามคือได้อย่างไร

หากข้อมูลการทดสอบที่มีอยู่มีป้ายกำกับที่เกี่ยวข้องคุณสามารถรวมเข้ากับข้อมูลการฝึกอบรมของคุณและขยายข้อมูลการฝึกอบรมซึ่งโดยทั่วไปจะให้ผลลัพธ์ที่ดีกว่าในวิธีที่ชัดเจน ไม่มีความสำเร็จที่แท้จริง

โปรดทราบว่าป้ายกำกับนั้นไม่จำเป็นต้องมีการระบุไว้อย่างชัดเจนหากคุณเข้าถึงคะแนนความแม่นยำ คุณสามารถไต่ระดับความแม่นยำโดยการส่งคะแนนซ้ำ ๆ ซึ่งเป็นสิ่งที่ผู้คนเคยทำในอดีตด้วยการแข่งขันที่ออกแบบมาไม่ดี

เนื่องจากข้อมูลการทดสอบที่มีอยู่ไม่มีฉลากที่เกี่ยวข้องทั้งทางตรงและทางอ้อมมีความเป็นไปได้อื่น ๆ อย่างน้อยสองรายการ:

ขั้นแรกนี้อาจเป็นวิธีการเพิ่มทางอ้อมที่คุณมุ่งเน้นไปที่กรณีที่การทำนายของคุณมีเพียงข้อมูลการฝึกอบรมที่ไม่เห็นด้วยกับการคาดการณ์ของคุณด้วยข้อมูลการทดสอบที่มีป้ายกำกับหลอกรวมอยู่ด้วย

ประการที่สองอาจเป็นการเรียนรู้แบบกึ่งตรงไปตรงมา โดยสังหรณ์ใจ: คุณสามารถใช้ความหนาแน่นของข้อมูลที่ไม่มีป้ายกำกับเพื่อช่วยกำหนดขอบเขตการจำแนกประเภทของวิธีการกำกับดูแล ดูภาพประกอบ ( https://en.wikipedia.org/wiki/Semi-supervised_learning#/media/File:Example_of_unlabeled_data_in_semisupervised_learning.png ) ในนิยามของวิกิพีเดียในการเรียนรู้แบบกึ่งภายใต้การดูแล

แต่นี่ไม่ได้หมายความว่าไม่มีเคล็ดลับอยู่ที่นี่ และเคล็ดลับนั้นมาจากคำนิยามของการฝึกอบรมและทดสอบข้อมูล โดยหลักการแล้วข้อมูลการฝึกอบรมแสดงถึงข้อมูลที่คุณมีอยู่ในมือเมื่อคุณพร้อมที่จะปรับใช้โมเดลของคุณ และข้อมูลการทดสอบแสดงถึงข้อมูลในอนาคตที่จะเข้าสู่ระบบของคุณเมื่อมันทำงาน

ในกรณีดังกล่าวการฝึกอบรมเกี่ยวกับข้อมูลทดสอบนั้นรั่วไหลจากอนาคตซึ่งคุณกำลังใช้ประโยชน์จากข้อมูลที่คุณยังไม่เคยเห็น นี่เป็นปัญหาสำคัญในโลกแห่งความเป็นจริงซึ่งตัวแปรบางอย่างอาจไม่มีอยู่จนกระทั่งหลังจากความจริง (พูดหลังจากการสอบสวนเสร็จสิ้น) หรืออาจได้รับการปรับปรุงในภายหลัง

ดังนั้นพวกเขาจึงเป็นเกมเมตาที่นี่: สิ่งที่พวกเขาทำนั้นถูกต้องตามกฎของการแข่งขันเพราะพวกเขาได้รับอนุญาตให้เข้าถึงข้อมูลทดสอบบางอย่าง แต่มันไม่ถูกต้องในโลกแห่งความเป็นจริงซึ่งการทดสอบที่แท้จริงคือข้อมูลใหม่ในอนาคต


2

ไม่มันไม่ได้ทำให้อ้วนมากไป

ฉันคิดว่าคุณกังวลอยู่ที่นี่คือรูปแบบที่กำลัง byhearting ข้อมูลแทนการสร้างแบบจำลอง ขึ้นอยู่กับความซับซ้อนของแบบจำลอง (ซึ่งยังคงเหมือนเดิม) และขนาดของข้อมูล มันเกิดขึ้นเมื่อแบบจำลองนั้นซับซ้อนเกินไปและ / หรือเมื่อข้อมูลการฝึกอบรมมีขนาดเล็กเกินไปซึ่งไม่เป็นเช่นนั้น ความจริงที่ว่าข้อผิดพลาดในการทดสอบ (ข้อผิดพลาดการตรวจสอบข้าม) จะลดลงหลังจากการเรียนรู้แบบกึ่งผู้สอนควรบอกเป็นนัยว่ามันไม่ได้ติดตั้งมากเกินไป

ทำไมวิธีการแบบนี้ถึง
ใช้งานได้วิธีการที่ใช้ที่นี่ไม่ได้อยู่นอกโลกฉันได้เห็นผู้คนมากมายที่ทำสิ่งนี้ในการแข่งขันการเรียนรู้ด้วยเครื่องจักรจำนวนมาก (ขออภัยฉันลองแล้ว แต่ไม่สามารถจำได้
เมื่อคุณทำนายส่วนหนึ่งของข้อมูลการทดสอบและรวมไว้ในการฝึกอบรมโมเดลจะได้สัมผัสกับคุณสมบัติใหม่ ในกรณีนี้ข้อมูลการทดสอบมีขนาดใหญ่เท่ากับข้อมูลการฝึกอบรมไม่น่าแปลกใจที่พวกเขาจะได้รับประโยชน์มากมายจากการเรียนรู้แบบกึ่งภายใต้การดูแล

หวังว่านี่จะอธิบายคำ
ขอบคุณ


คุณต้องกำหนด "โมเดล" อย่างชัดเจน นี่คล้ายกับองศาความเป็นอิสระทั่วไปทั้งหมด ( pegasus.cc.ucf.edu/~lni/sta6236/Ye1998.pdf ) ปัญหาซึ่งมีคนชี้ไปที่ "รุ่นสุดท้าย" ซึ่งดูเหมือนจะง่าย แต่จริง ๆ แล้วมี ความซับซ้อนมากมายถูกยัดลงในกระบวนการ สัญชาตญาณของฉันคือคุณไม่สามารถเพิกเฉยต่อกระบวนการที่เหลือและชี้ไปที่ "รุ่นสุดท้าย" โดยอ้างว่ามันไม่ซับซ้อนกว่า "รุ่นสุดท้าย" โดยไม่มีขั้นตอนที่ควบคุมดูแลแล้วดำเนินการต่อ การปรับปรุงผลการทดสอบนอกตัวอย่างเป็นตัวบ่งชี้ที่ดีอย่างที่คุณพูด
Wayne

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

ตามคำนิยามนี้: "การเกิด overfitting เกิดขึ้นเมื่อแบบจำลองทางสถิติอธิบายถึงข้อผิดพลาดหรือเสียงรบกวนแบบสุ่มแทนความสัมพันธ์ที่ซ่อนอยู่" (วิกิพีเดีย) ทางออกไม่ได้เกิดขึ้นมากเกินไป

แต่ในสถานการณ์เช่นนี้:
- ข้อมูลการทดสอบเป็นรายการสตรีมไม่ใช่รายการคงที่
หรือ
- กระบวนการคาดคะเนไม่ควรมีขั้นตอนการเรียนรู้ (เช่นเนื่องจากปัญหาด้านประสิทธิภาพการทำงาน)

วิธีแก้ปัญหาที่กล่าวถึงนี้เป็นการ overfitting เพราะความแม่นยำของการสร้างแบบจำลองเป็นมากกว่าสถานการณ์จริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.