“Yarı denetimli öğrenme” - bu çok mu fazla?


21

Bir Kaggle yarışmasının ( Malware Classification ) kazanan çözümünün raporunu okuyordum . Rapor bu forum gönderisinde bulunabilir . Sorun, tren setinde 10000 element, test setinde 10000 element olan bir sınıflandırma problemiydi (dokuz sınıf, metrik logaritmik kayıptı).

Yarışma sırasında, modeller test setinin% 30'una karşı değerlendirildi. Bir diğer önemli unsur, modellerin çok iyi performans göstermesidir (% 100 doğruluğa yakın)

Yazarlar aşağıdaki tekniği kullandılar:

Karşılaştığımız bir diğer önemli teknik ise yarı-destekli öğrenme. İlk olarak, en iyi modelimizin maksimum olasılığını seçerek sahte test setleri üretiyoruz. Daha sonra, test setinin hem tren verisi hem de test verisi ile çapraz doğrulama yönteminde tekrar olacağını tahmin ediyoruz. Örneğin, test verileri seti 4 bölüm A, B, C ve D'ye bölünmüştür. Tüm eğitim verilerini kullanıyoruz ve A, B, C test verilerini sözde etiketleri ile birlikte yeni eğitim seti olarak kullanıyoruz ve testi öngörüyoruz. D.

Aynı yöntem A, B ve C'yi tahmin etmek için kullanılır. Xiaozhou tarafından icat edilen bu yaklaşım şaşırtıcı derecede iyi çalışıyor ve yerel çapraz doğrulama kaybını, kamu LB kaybını ve özel LB kaybını azaltır. En iyi yarı eğitimli öğrenme modeli, tüm çözümlerimizde en iyi puan olan özel LB log kaybında 0.0023 elde edebilir.

Sonuçları nasıl iyileştirebileceğini gerçekten anlamıyorum. Test setinin% 30'unun "sızdırıldığı" ve bu bilgiyi kullanmanın bir yolu olduğu için mi?

Yoksa neden işe yaradığını açıklayan teorik bir sebep var mı?

Yanıtlar:


8

Fazla yorucu görünmüyor. Sezgisel olarak, overfitting, eğitim setinin tuhaflıklarına (gürültüsüne) yönelik eğitim anlamına gelir ve bu nedenle bu tuhaflıkları paylaşmayan bir deneme testinde daha da kötüleştiğini gösterir. Ne olduğunu anlarsam, beklenmedik bir şekilde, yapılan test verilerini kötü bir şekilde yapmadılar ve bu yüzden ampirik olarak fazla uydurma dışladı. (Sonunda bahsedeceğim başka bir sorunu var, ama çok da uygun değil.)

Bu nedenle, mevcut (% 30?) Test verilerinden yararlandığı konusunda haklısınız. Soru şudur: nasıl?

Mevcut test verilerinde bununla ilgili etiketler varsa, basitçe egzersiz verilerinize ekleyebilir ve genel olarak bariz bir şekilde daha iyi sonuçlar verecek egzersiz verilerinizi büyütebilirsiniz. Orada gerçek bir başarı yok.

Bir doğruluk puanına erişiminiz varsa etiketlerin açıkça listelenmesi gerekmeyeceğini unutmayın. Kesin olarak, geçmişte insanların kötü tasarlanmış yarışmalarla yaptıklarını yaptıkları puanları sunarak doğruluk derecesini kolayca yükseltebilirsiniz.

Mevcut test verilerinin kendisiyle ilişkili etiketlere sahip olmadığı göz önüne alındığında - doğrudan veya dolaylı olarak - en az iki olasılık daha vardır:

Birincisi, bu, yalnızca eğitim verileriyle ilgili tahminlerinizin, sözde etiketli test verileriyle ilgili tahminlerinize uymadığı durumlara odaklandığınız dolaylı bir yükseltme yöntemi olabilir.

İkincisi, basit yarı denetimli öğrenme olabilir. Sezgisel: Denetlenen bir yöntemin sınıflandırma sınırlarını şekillendirmek için etiketlenmemiş verilerin yoğunluğunu kullanıyor olabilirsiniz. Netleştirmek için Wikipedia'da yarı denetimli öğrenim tanımındaki ( https://en.wikipedia.org/wiki/Semi-supervised_learning#/media/File:Example_of_unlabeled_data_in_semisupervised_learning.png ) resmine bakın .

AMA bu, burada bir numara olmadığı anlamına gelmez. Ve bu numara, eğitim ve test verilerinin tanımından geliyor. Prensip olarak, eğitim verileri modelinizi dağıtmaya hazır olduğunuzda elde edebileceğiniz verileri temsil eder. Test verileri, çalıştırıldıktan sonra sisteminize gelecek olan verileri temsil eder.

Bu durumda, test verileri hakkında eğitim, henüz görmeyeceğiniz verilerden yararlandığınız gelecekteki bir sızıntıdır . Bu, bazı değişkenlerin gerçeğin sonuna kadar (bir soruşturma yapıldıktan sonra söylenebilir) mevcut olamayacağı veya daha sonraki bir tarihte güncellenebileceği, gerçek dünyada önemli bir konudur.

Yani burada meta-oyun oynuyorlar: Yaptıkları, yarışma kuralları dahilinde meşru, çünkü bazı test verilerine erişim hakkı vardı. Fakat gerçek dünyada, gerçek testin gelecekte ne kadar iyi olduğu, yeni veriler üzerinde olması meşru değil.


2

Hayır, fazla uygun değil.

Bence buradaki endişeniz, modelin modellemek yerine verileri duyduğudur. Bu, modelin karmaşıklığına (aynı kaldı) ve verilerin boyutuna bağlıdır. Model çok karmaşık olduğunda ve / veya eğitim verileri çok küçük olduğunda, ikisi de burada böyle olmaz. Yarı denetimli öğrenmeden sonra test hatasının (çapraz doğrulama hatası) en aza indirilmiş olması, fazla uyuşmadığı anlamına gelmelidir.

Neden böyle bir yaklaşımın işe yaradığı konusunda
burada kullanılan yaklaşım dünya dışı değil, birçok makine öğrenme yarışmasında bunu yapan pek çok insan gördüm (Üzgünüm, denedim ama bunu nerede gördüğümü hatırlayamıyorum).
Test verilerinin bir bölümünü tahmin ettiğinizde ve eğitimde bu modeli eklediğinizde, model yeni özelliklere maruz kalır. Bu durumda, test verileri eğitim verileri kadar büyüktür, yarı denetimli öğrenme ile fazla kazanmalarına şaşmamalı.

Umarım bu
teşekkür açıklar


"Modeli" açıkça tanımlamanız gerekir. Bu, birisinin basit olduğu anlaşılan ancak gerçekte sahip olduğu “nihai modeli” işaret ettiği tüm Genelleştirilmiş Serbestlik Dereceleri ( pegasus.cc.ucf.edu/~lni/sta6236/Ye1998.pdf ) sorununa benzer. Sürecin içine çok karmaşıklık doldu. İçgüdülerim, sürecin geri kalanını görmezden gelemeyeceğiniz ve "son model" e işaret edemeyeceğiniz, yarı denetimli adım olmadan "son modelden" daha karmaşık olmadığını iddia edebileceğiniz ve ardından devam edebileceğinizdir. Out-of-numune iyileştirilmesi test sonuçları ise dediğiniz gibi iyi bir göstergesi.
Wayne,

2

Uygun değildir (tanımına bağlı olarak) brüt değildir. Test setinin hedef bilgisi korunur. Yarı denetimli, modeli eğitmek için ekstra bir sentetik veri seti oluşturmayı sağlar. Tanımlanan yaklaşımda, orijinal eğitim verileri 4: 3 oranında sentetik ile ağırlıksız karıştırılır. Dolayısıyla, sentetik verinin kalitesi düşükse, yaklaşım feci olur. Tahminlerin kesin olmadığı herhangi bir problem için, sentetik veri setinin düşük doğrulukta olacağını tahmin ediyorum. Altta yatan yapı çok karmaşıksa ve sistemde düşük gürültü varsa, sentetik veri oluşturmaya yardımcı olabilir, sanırım. Yarı denetimli öğrenmenin, özellik sunumunun da öğrenileceği derin öğrenme (benim uzmanlığım değil) içinde oldukça büyük olduğunu düşünüyorum.

Olumlu bir sonuç vermeden hem rf hem de xgboost ile birkaç veri setinde yarı denetimli eğitim ile artan doğruluğu yeniden üretmeye çalıştım. [Kodumu düzenlemekten çekinmeyin.] Yarı denetimli kullanarak doğruluktaki gerçek iyileşmenin, kaggle raporunda oldukça mütevazı olduğunu, belki de rastgele olduğunu fark ettim.

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)

görüntü tanımını buraya girin

#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

Bu tanım gereği: “Bir istatistiksel model, altta yatan ilişki yerine rastgele hata ya da gürültüyü tanımladığında aşırı uydurma meydana gelir.” (Wikipedia), çözüm aşırı uydurma değildir.

Ancak bu durumda:
- Test verileri sabit bir öğe kümesi değil bir öğe akışıdır.
VEYA
- Tahmin süreci, öğrenme aşamasını içermemelidir (örneğin performans sorunları nedeniyle)

. Çünkü modellemenin doğruluğu gerçek durumlardan daha fazladır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.