Model seçimi ve çapraz doğrulama: Doğru yol


34

CrossValidated'da model seçimi ve çapraz onaylama konusunda sayısız konu vardır. Burda biraz var:

Bununla birlikte, bu konulara verilen cevaplar oldukça geneldir ve çoğunlukla geçerlilik testi ve model seçimine yönelik özel yaklaşımlarla ilgili konuları vurgulamaktadır.

İşleri mümkün olduğunca somut hale getirmek için, örneğin bir RBF çekirdeğine sahip bir SVM ile çalıştığımızı söyleyin: ve X ve y etiket özelliklerinin veri kümesine sahibim.K(x,x)=(γ|xx|)2

  1. Modelimin mümkün olan en iyi değerlerini bulun ( andγC )
  2. SVM'yi veri setimle eğitin (son dağıtım için)
  3. Genelleme hatasını ve bu hatanın etrafındaki belirsizliği (sapma) tahmin edin

Bunu yapmak için kişisel olarak bir ızgara araştırması yapardım, örneğin her olası ve kombinasyonunu denerim . Basit olması için aşağıdaki aralıkları varsayabiliriz:Cγ

  • C{10,100,1000}
  • γ{0.1,0.2,0.5,1.0}

Daha spesifik olarak, tam veri setimi kullanarak aşağıdakileri yaparım:

  1. Her ( , ) çifti için, veri setimde kat çapraz doğrulama (örn. ) yinelemelerini (örn. 100 rastgele tekrar), veri setime tekrar yapıyorum, yani SVM'mi katları üzerinde eğitiyorum ve soldaki kattaki hata, tüm kıvrımlarını yineleyerek . Genel olarak, 100 x 10 = 1000 test hatası toplarım.CγKK=10K1K
  2. Böyle bir ( , ) çifti için, bu 1000 test hatasının ortalamasını ve varyansını hesaplarım .CγμM,σM

Şimdi nihai SVM'mi tam veri setinde eğitmek için kullanacağım en iyi modeli (en iyi çekirdek parametreleri) seçmek istiyorum. Benim anlayış vardı modelinin seçilmesi olmasıdır düşük hata ortalama ve varyansını ve doğru seçim olacaktır ve bu model en o olan zaman eğitim ile modelin genelleme hatası önyargı ve varyans benim en iyi tahminlerdir tam veri kümesi.μMσMμMσM

ANCAK, yukarıdaki konu başlıklarındaki cevapları okuduktan sonra, dağıtım için ve / veya hatasını (genelleme performansı) tahmin etmek için en iyi SVM'yi seçmek için bu yöntemin hatalı olduğu ve daha iyi bir seçim yolu olduğu izlenimini alıyorum. en iyi SVM ve hatayı bildirmek. Eğer öyleyse, bunlar nedir? Somut bir cevap arıyorum lütfen.

Bu sorunun tutunan, nasıl özellikle ben seçebilir iyi modeli ve düzgün bir genelleme hatası tahmin ?


İşleri olabildiğince somut hale getirmek için lütfen bize söyleyin: Veri setinizde istatistiksel olarak bağımsız kaç vaka var? Optimizasyon için değerlendirdiğiniz hedef fonksiyon nedir / Ne tür hata ölçüsü kullanıyorsunuz? Seçilen hata ölçüsünün parametre kılavuzunuz üzerinde tutarlı bir davranış sergilediğini gerçekten gözlemliyor musunuz? Sınıflandırma hakkında konuşuyorsanız ve hata ölçüsünüz buna izin verir: yinelenen çapraz doğrulama sonuçları sonlu örneklem büyüklüğü nedeniyle beklediğiniz varyansla nasıl karşılaştırır (ancak ölçemez)?
cbeleites

İlginç bulabileceğiniz bir makale: optimalprediction.com/files/pdf/V2A5.pdf
user31256

2
Çok açık ve ayrıntılı bir soru için +1 ve veri bilim topluluğuyla ilgili çok alakalı bir soru için +1.
NickBraunagel

Yanıtlar:


20

JMLR'deki makalem bu kesin soruyu ele alıyor ve soruda önerilen prosedürün (veya en azından bir tanesinin) neden iyimser önyargılı performans tahminleri ile sonuçlandığını gösteriyor:

Gavin C. Cawley, Nicola LC Talbot, "Model Seçiminde Aşırı Uygunluk ve Performans Değerlendirmede Sonraki Seçim Yanılgısı", Makine Öğrenimi Araştırma Dergisi, 11 (Temmuz): 2079-2107, 2010. ( www )

Hatırlanması gereken en önemli şey, çapraz doğrulamanın, modelin kendisinden ziyade, bir model üretme yöntemi için genelleme performansını tahmin etmek için bir teknik olduğudur. Bu nedenle, çekirdek parametrelerinin seçilmesi, model üretme sürecinin bir parçasıysa, model seçim sürecini de çapraz doğrulamanız gerekir, aksi takdirde iyimser bir önyargılı performans tahmini ile sonuçlanacaksınız (önerdiğiniz prosedürde olduğu gibi).

X öznitelikleri ve istenen yanıtlardan oluşan bir veri kümesinde yer alan ve hiper parametrelerinin ayarlanması da dahil olmak üzere bu veri kümesi için uygun modeli döndüren bir fit_model işlevine sahip olduğunuzu varsayalım (bu durumda çekirdek ve normalleştirme parametreleri). Hiper parametrelerin bu şekilde ayarlanması birçok yolla gerçekleştirilebilir, örneğin X ve T üzerindeki çapraz doğrulama hatasını en aza indirir.

Adım 1 - fit_model işlevini kullanarak modeli mevcut tüm verilere yerleştirin. Bu size operasyonda kullanacağınız modeli verir.

Adım 2 - Performans değerlendirmesi. Mevcut tüm verileri kullanarak tekrarlanan çapraz doğrulama yapın. Her katmanda, veriler bir eğitim setine ve bir test setine bölünmüştür. Eğitim setini kullanarak modeli takın (takılan model için hiper-parametre değerlerini kaydedin) ve test setindeki performansı değerlendirin. Tüm test kümelerinde ortalamayı performans tahmini olarak kullanın (ve değerlerin dağılımına da bakın).

Adım 3 - Hiper-parametre ayarlarının değişkenliği - 3. adımda toplanan hiper-parametre değerlerinin analizini yapın. Ancak, hiper-parametrelerde özel bir şey olmadığını belirtmeliyim, bunlar sadece tahmin edilen modelin parametreleridir (dolaylı olarak) ) verilerden. Hesaplamalı / matematiksel uygunluk için parametreler yerine hiper parametreler olarak değerlendirilirler, ancak böyle olması gerekmez.

Buradaki çapraz doğrulama kullanılmasındaki sorun, eğitim ve test verilerinin bağımsız örnekler olmamasıdır (verileri paylaştığı için), bu, performans tahmini ve hiper parametrelerin varyansının tahmininin önyargılı olabileceği anlamına gelir (örn. her kattan gerçekten bağımsız veri örnekleri için olacağından daha küçük). Tekrarlanan çapraz onaylama yerine, muhtemelen bunun yerine önyükleme kullanırım ve eğer hesaplamalı olarak mümkün olsaydı ortaya çıkan modelleri alırdım.

Kilit nokta, tarafsız bir performans tahmini elde etmek için, nihai modeli (fit_model) oluşturmak için kullandığınız prosedürün, çapraz doğrulama prosedürünün her katında bağımsız olarak tamamen tekrarlanması gerektiğidir.


Bu harika bir cevap. Ne zaman diyorsun rather than repeated cross-validation you would go for bootstrapping- Tam olarak fark nedir? Hem veri bölünmesi çoklu tekrarlama içermektedir trainve testdaha sonra içinde eğitim trainve değerlendirilmesi testonlar değil mi?
Josh,

4
Önyükleme (değiştirme ile örnekleme), çok sayıda yeniden örnekleme yapmanın daha doğal bir yoludur, çünkü tekrarlanan çapraz onaylamadan daha randomize edilmiştir. Torbalı parçaların kullanımının önyüklemesi için, performans tahmini olarak torbanın dışı hatasıyla birlikte hoş bir özelliktir. İkisi arasında seçim yapmak için çok büyük bir miktar yok.
Dikran Marsupial

Thanks @Dikran - Bu, beni örneğin bootstrapping kullandığını farz ederek, tekrarlar arasındaki ortalama ve varyansı göz önünde bulundurarak nasıl iyi bir model seçer diye düşündürdü ? (yani hangi model seçim protokolünü izlerdiniz?). Bu soru tam olarak bu soruyu ortaya koyuyor . Bu konuya girişinizi almak son derece değerli olacaktır!
Josh

@DikranMarsupial 1-3 arasındaki adımlar için kod (örneğin, Python veya R) gönderebilir misiniz? Somut kod görünce bu tür prosedürleri anlamak çok daha kolay buluyorum.
tobip

1
Anahtar mesaj: "Önemli nokta, tarafsız bir performans tahmini elde etmek için, nihai modeli (fit_model) oluşturmak için kullandığınız prosedürün , çapraz doğrulama prosedürünün her katında bağımsız olarak tamamen tekrarlanması gerekir ." Bu tam mesaj İstatistiki Öğrenmenin Elemanları bölümünde de verilmektedir (bkz. Bölüm 7.10.2): web.stanford.edu/~hastie/Papers/ESLII.pdf
NickBraunagel

0

γC

Bu hiperparametreleri optimize eden ve bunlarla bir SVM'yi eğiten bir prosedür aynı zamanda sadece bir makine öğrenme algoritmasıdır . Yalnızca SVM'nin (destek vektörleri) dahili parametrelerini optimize etmek yerine, hiperparametreleri de optimize eder.

Şimdi [bağımsız olarak çözülebilecek] iki sorunun var:

Karıştırma yapmadığınızdan emin olmak için Çapraz doğrulama yanlış kullanımını (en iyi hipermetre değeri için raporlama performansı) okuyun .


Sorunuzun somut sorununa özel (muhtemelen optimal değil) bir çözüm:

k = 5
loss_CV = zeros(k)
for i in 1:k 
    Xi_train, Xi_test = folds(X,k)[i]
    loss = zeros((3,3))
    for lambda in {0.1,0.2,0.5,1.0}
        for C in {10,100,1000}
            for j in 1:k
                Xj_train, Xj_test = folds(Xi_train,k)[j]
                model = SVM(Xj_train,lambda, C)
                loss[lambda,C] += test_error(model,Xj_test)
    lambda, C = argmax(loss)
    model = SVM(Xi_train,lambda, C)
    loss_CV += test_error(model,Xi_test)

loss = zeros((3,3))
for lambda in {0.1,0.2,0.5,1.0}
    for C in {10,100,1000}
        for j in 1:k
            Xj_train, Xj_test = folds(Xi_train,k)[j]
            model = SVM(Xj_train,lambda, C)
            loss[lambda,C] += test_error(model,Xj_test)
lambda, C = argmax(loss)
model = SVM(Xi_train,lambda, C)

Burada, model"en iyi modeliniz" ve loss_CV"genelleme hatasının doğru bir tahmini" (yukarı doğru eğilimli olmasına rağmen, pastayı yiyip yiyemezsiniz).

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.