"Pembelajaran semi-diawasi" - apakah ini cocok?

21

Saya sedang membaca laporan dari solusi memenangkan kompetisi Kaggle ( Klasifikasi Malware ). Laporan ini dapat ditemukan di posting forum ini . Masalahnya adalah masalah klasifikasi (sembilan kelas, metrik adalah kehilangan logaritmik) dengan 10.000 elemen di set kereta, 10.000 elemen di set tes.

Selama kompetisi, model dievaluasi terhadap 30% dari set tes. Elemen penting lainnya adalah bahwa model yang berkinerja sangat baik (mendekati 100% akurasi)

Para penulis menggunakan teknik berikut:

Teknik lain yang penting kita datang adalah Semisupervised Learning. Kami pertama menghasilkan label palsu dari tes set dengan memilih probabilitas max model terbaik kami. Kemudian kita memprediksi tes diatur lagi dalam validasi mode cross dengan baik data kereta api dan data uji. Misalnya, kumpulan data uji dibagi menjadi 4 bagian A, B, C, dan D. Kami menggunakan seluruh data pelatihan, dan data uji A, B, C dengan label pseudo mereka, bersama-sama sebagai rangkaian pelatihan baru dan kami memperkirakan tes set D.

Metode yang sama digunakan untuk memprediksi A, B dan C. Pendekatan ini, ditemukan oleh Xiaozhou, bekerja sangat baik dan mengurangi kerugian validasi silang lokal, kerugian LB publik dan kerugian LB pribadi. Model pembelajaran Semisupervised terbaik dapat mencapai 0,0023 di LB log kerugian pribadi, yang merupakan skor terbaik atas semua solusi kami.

Saya benar-benar tidak melihat bagaimana hal itu dapat meningkatkan hasil. Apakah karena 30% dari set tes "bocor" dan itu adalah cara untuk menggunakan informasi ini?

Atau adakah alasan teoretis yang menjelaskan mengapa ini berhasil?

RUser4512
sumber

Jawaban:

8

Tampaknya tidak berlebihan. Secara intuitif, overfitting menyiratkan pelatihan untuk quirks (noise) dari set pelatihan dan karenanya menjadi lebih buruk pada set tes yang diadakan yang tidak berbagi quirks ini. Jika saya mengerti apa yang terjadi, mereka tidak melakukan hal yang tidak terduga - buruk pada data tes yang diadakan dan sehingga secara empiris mengesampingkan overfitting. (Mereka memiliki masalah lain, yang saya akan menyebutkan di akhir, tapi tidak overfitting.)

Jadi Anda benar bahwa ia mengambil keuntungan dari data pengujian yang tersedia (30%?). Pertanyaannya adalah: bagaimana caranya?

Jika data uji yang tersedia memiliki label yang terkait dengannya, Anda bisa dengan mudah memasukkannya ke dalam data pelatihan Anda dan memperbesar data pelatihan Anda, yang secara umum akan menghasilkan hasil yang lebih baik dengan cara yang jelas. Tidak ada prestasi nyata di sana.

Perhatikan bahwa label tidak harus dicantumkan secara eksplisit jika Anda memiliki akses ke skor akurasi. Anda bisa naik gradien akurasi dengan mengirimkan skor berulang kali, yang telah dilakukan orang-orang di masa lalu dengan kompetisi yang tidak dirancang dengan baik.

Mengingat bahwa data uji yang tersedia tidak memiliki label yang terkait dengannya - secara langsung atau tidak langsung - setidaknya ada dua kemungkinan lain:

Pertama, ini bisa menjadi metode peningkatan tidak langsung di mana Anda berfokus pada kasus-kasus di mana prediksi Anda dengan hanya data pelatihan tidak setuju dengan prediksi Anda dengan data uji berlabel pseudo yang disertakan.

Kedua, bisa berupa pembelajaran semi-diawasi langsung. Secara intuitif: Anda bisa menggunakan kepadatan data tanpa label untuk membantu membentuk batas-batas klasifikasi metode diawasi. Lihat ilustrasinya ( https://en.wikipedia.org/wiki/Semi-supervised_learning#/media/File:Example_of_unlabeled_data_in_semisupervised_learning.png ) dalam definisi Wikipedia tentang pembelajaran semi-diawasi untuk diklarifikasi.

TAPI ini tidak berarti bahwa tidak ada trik di sini. Dan trik itu datang dari definisi pelatihan dan data uji. Pada prinsipnya, data pelatihan mewakili data yang bisa Anda miliki saat Anda siap untuk menggunakan model Anda. Dan data uji mewakili data masa depan yang akan datang ke sistem Anda setelah operasional.

Dalam hal ini, pelatihan data uji adalah kebocoran dari masa depan , di mana Anda mengambil keuntungan dari data yang tidak akan melihat belum. Ini merupakan masalah besar di dunia nyata, di mana beberapa variabel mungkin tidak ada sampai setelah fakta (mengatakan setelah penyelidikan dilakukan) atau dapat diperbarui di kemudian hari.

Jadi mereka meta-game di sini: apa yang mereka lakukan adalah sah dalam aturan kompetisi, karena mereka diberi akses ke beberapa data uji. Tapi itu tidak sah di dunia nyata, di mana ujian sejati adalah seberapa baik hal ini di masa depan, data baru.

Wayne
sumber
2

Tidak, ini tidak terlalu cocok.

Saya pikir kekhawatiran Anda di sini adalah bahwa model ini dengan berpihak pada data alih-alih memodelkannya. Itu tergantung pada kompleksitas model (yang tetap sama) dan ukuran data. Ini terjadi ketika model terlalu kompleks dan / atau ketika data pelatihan terlalu kecil, tidak ada yang terjadi di sini. Fakta bahwa kesalahan tes (kesalahan validasi silang) diminimalkan setelah pembelajaran semi-diawasi harus menyiratkan bahwa itu tidak dilengkapi.

Tentang mengapa pendekatan seperti itu bahkan berhasil
. Pendekatan yang digunakan di sini bukan di luar dunia, saya telah melihat banyak orang melakukan ini dalam banyak kompetisi pembelajaran mesin (Maaf, saya sudah mencoba, tetapi tidak bisa mengingat di mana saya telah melihat ini).
Saat Anda memperkirakan sebagian data uji dan memasukkannya ke dalam pelatihan, model akan terpapar dengan fitur-fitur baru. Dalam hal ini, data uji adalah sebesar data pelatihan, tidak heran mereka memperoleh begitu banyak dengan pembelajaran semi-diawasi.

Semoga ini menjelaskan
Terima kasih

Vihari Piratla
sumber
Anda perlu mendefinisikan "model" dengan jelas. Ini mirip dengan keseluruhan Generalized Degrees of Freedom ( pegasus.cc.ucf.edu/~lni/sta6236/Ye1998.pdf ) masalah, di mana seseorang menunjuk ke "model akhir", yang tampaknya sederhana, tetapi yang sebenarnya memiliki banyak kompleksitas boneka ke dalam proses. Naluri saya adalah bahwa Anda tidak bisa mengabaikan proses dan menunjukkan "model akhir", mengklaim itu tidak lebih kompleks daripada "model akhir" tanpa langkah semi-diawasi, dan kemudian melanjutkan. Meningkatkan hasil tes out-of-sample adalah indikator yang baik, seperti yang Anda katakan.
Wayne
2

Itu tidak terlalu berlebihan (tergantung pada definisi). Informasi target set uji dipertahankan. Semi-diawasi memungkinkan untuk menghasilkan set data sintetis tambahan untuk melatih model. Dalam pendekatan yang dijelaskan, data pelatihan asli dicampur tidak tertimbang dengan sintetis dalam rasio 4: 3. Jadi, jika kualitas data sintetik buruk, pendekatannya akan menjadi bencana. Saya kira untuk masalah di mana prediksi tidak pasti, set data sintetis akan memiliki akurasi yang buruk. Jika struktur yang mendasarinya sangat kompleks dan sistem memiliki noise rendah, mungkin membantu untuk menghasilkan data sintetis, saya kira. Saya pikir pembelajaran semi-diawasi cukup besar dalam pembelajaran mendalam (bukan keahlian saya), di mana representasi fitur harus dipelajari juga.

Saya telah mencoba mereproduksi peningkatan akurasi dengan pelatihan semi-supervisi pada beberapa set data dengan rf dan xgboost tanpa hasil positif. [Jangan ragu untuk mengedit kode saya.] Saya melihat peningkatan akurasi yang sebenarnya menggunakan semi-diawasi cukup sederhana dalam laporan kaggle, mungkin acak?

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)

masukkan deskripsi gambar di sini

#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
Soren Havelund Welling
sumber
1

Dengan definisi ini: "Overfitting terjadi ketika model statistik menggambarkan kesalahan atau noise acak daripada hubungan yang mendasarinya." (Wikipedia), solusinya tidak overfitting.

Tetapi dalam situasi ini:
- Data uji adalah aliran item dan bukan set item tetap.
ATAU
- Proses prediksi tidak boleh mengandung fase pembelajaran (misalnya karena masalah kinerja)

. Solusi yang disebutkan adalah overfitting. Karena akurasi pemodelan lebih dari situasi nyata.

parvij
sumber