Çapraz doğrulama, öğrenme eğrisi ve son değerlendirme için veri setinin nasıl bölüneceği?


70

Veri kümesini bölmek için uygun bir strateji nedir?

Ben şu yaklaşıma ilgili görüşlerinizi (değil gibi bireysel parametrelere test_sizeveya n_iterama kullanılırsa X, y, X_train, y_train, X_test, ve y_testuygun bir şekilde ve sıra mantıklı ise):

( bu örneği scikit-learn belgelerinden uzatarak)

1. Veri kümesini yükleyin

from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target

2. Eğitim ve test setine bölün (örneğin, 80/20)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

3. Tahmincisi seçin

from sklearn.svm import SVC
estimator = SVC(kernel='linear')

4. Çapraz doğrulama yineleyicisini seçin

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)

5. Hiperparametreleri ayarlayın

Çapraz doğrulama yineleyicisini eğitim setine uygulama

from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)

6. Öğrenme eğrisi ile hata ayıklama algoritması

X_trainrastgele bir antrenmana ve 10 kez ( n_iter=10) ayarlanan bir teste bölünür . Öğretim skoru, eğri üzerindeki her bir nokta model ilk eğitilmiş ve değerlendirildi 10 puan ortalamasıdır i eğitim örnekleri. Çapraz geçerlilik skoru eğrisindeki her nokta, ilk i eğitim örneklerinde modelin eğitildiği ve test setinin tüm örnekleri üzerinde değerlendirilen 10 puanın ortalamasıdır .

from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()

Öğrenme eğrisi

plot_learning_curve () , scikit-learn'ın (0.15-git) güncel sürümünde bulunabilir.

7. Test setinde son değerlendirme

classifier.score(X_test, y_test)

7a. İç içe çapraz doğrulama ile model seçiminde aşırı uydurma testi yapın (tüm veri kümesini kullanarak)

from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)

Ek soru: 7. adımı yuvalanmış çapraz doğrulama ile değiştirmek mantıklı mı? Veya iç içe geçmiş cv adım 7'yi tamamlayıcı olarak görülmeli

(Kod, scikit-learn'da k-fold cross validasyon ile çalışıyor gibi görünüyor, fakat karıştır ve bölmeyle cvçalışmıyor. Kodun çalışması için yukarıda değiştirilmesi gerekiyor)

8. Tüm veri setinde son modeli eğitin

classifier.fit(X, y)

EDIT: Şimdi adım 7a'nın bu dizilimde pek bir anlam ifade etmediği cele'lerle hemfikirim. Yani bunu benimsemem.


Hangi doğruluk puanlama kuralını kullanıyorsunuz? Sınıflandırma doğruluğuysa, bu kadar hatalı bir puanlama kuralı gittiğiniz işlerin çoğunu geri alacaktır.
Frank Harrell,

Ben gerçekten sınıflandırma doğruluğu olan varsayılanı kullandım. F1'in daha uygun olacağını biliyorum. Ama burada sadece bölmeler Tamam kullanılırsa ilgileniyorum.
54'te tobip

3
F1'in eski bir konsept için yeni bir isim olduğuna neredeyse eminim. Eski şeyler için yeni isimler icat etmenin ters olduğunu düşünüyorum. Daha da önemlisi, yanlış özelliklerin seçilmesi ve tüm sürece iyi bir gürültü eklenmesiyle sonuçlanacak yanlış bir puanlama kuralıdır.
Frank Harrell

3
... her durumda F1, @FrankHarrell'in doğruluğu ile ilgili problemleri paylaşır: bunlar zor sınıflandırmaların test vakalarının kesirlerini saymaktan kaynaklanır. Frank'in uygun puanlama kurallarından birini elde etmek için SVM'nin olasılıksal çıktısına geçmeniz ve örneğin doğruluk yerine Brier'ın puanını (ortalama kare hatası) kullanmanız gerekir. Sanırım F1'in MSE tipi bir versiyonunu da türetebilirsiniz. Bu tür önlemler ayarlama aşaması için gerçekten daha iyi olmalıdır. Son performansı bildirmek için, topluluğunuz için performansı ifade etmenin tipik yollarına da (örneğin doğruluk, F1) ihtiyaç duyabilirsiniz.
00'te cbeleites

1
@ ta.ft: yaklaşımın yanlış olup olmadığı, neyin yanlış olduğunu düşündüğünüze bağlıdır: oranlarda yapılan ızgara araştırması, gülünç sayıda bağımsız vaka bulunmadığı sürece ciddi bir sapma riski taşır. Bu nedenle, birçok durumda, şebeke araştırmasının en uygun modeli sağladığı iddiası yanlıştır. Bununla birlikte, uygun bir yuvalanmış doğrulama yaparsanız, dış doğrulama seçilen "optimal" modelin performansının dürüst bir ölçüsünü verir. Yani bu yanlış değil. Şebeke araştırmasının en uygun modele sahip olduğunu garanti edemezsiniz. Edebiyat gelince, cevabımı güncelleyeceğim.
cbeleites,

Yanıtlar:


41

Adım 7a'da ne yapmak istediğinize emin değilim. Şu an anladığım gibi, bana mantıklı gelmiyor.

Açıklamanızı şöyle anlıyorum: 7. adımda, tutma performansını 4 - 6. adımları kapsayan bir çapraz doğrulama sonuçlarıyla karşılaştırmak istiyorsunuz (bu nedenle, bu yuvalanmış bir kurulum olacaktır).

Bu karşılaştırmanın neden anlamlı olmadığını düşündüğümün ana noktaları:

  • Bu karşılaştırma, pratikte karşılaştığım genel aşırı etkin doğrulama sonuçlarının iki ana kaynağını tespit edemiyor:

    • Hiyerarşik (kümelenmiş) bir veri yapısının neden olduğu ve bölünme için hesaba katılmamış olan eğitim ve test verileri arasındaki veri sızıntıları (bağımlılık). Alanımda, aynı hastanın veya bir deneyin biyolojik kopyalarının birden fazla (bazen binlerce) okuması (= veri matrisindeki satırlar) var. Bunlar bağımsız değildir, bu nedenle doğrulama bölmesinin hasta düzeyinde yapılması gerekir. Bununla birlikte, böyle bir veri sızıntısı meydana gelirse, bunu hem tutma setinin bölmesinde hem de çapraz doğrulama bölmesinde elde edersiniz. Tutma boğazı daha sonra, çapraz doğrulama kadar iyimser bir şekilde taraflı olun.

    • Tüm veri matrisinde yapılan verilerin ön işleme tabi tutulması, hesaplamaların her satır için bağımsız olmadığı, ancak çoğu / tüm satırların ön işleme için parametreleri hesaplamak için kullanılmasıdır. Tipik örnekler, örneğin "gerçek" sınıflandırmadan önce bir PCA projeksiyonu olabilir.
      Yine, bu hem bekletmenizi hem de dış çapraz doğrulama işlemini etkileyecektir, bu nedenle tespit edemezsiniz.

    Çalıştığım veriler için, her iki hata da yanlış sınıflandırmaların oranının büyüklük sırasına göre küçümsenmesine neden olabilir!

  • Test vakalarının performans tipi bu sayılan kesriyle sınırlıysanız, model karşılaştırmaları ya çok sayıda test vakasına ya da gerçek performansta gülünç derecede büyük farklılıklara ihtiyaç duyar. 2 sınıflandırıcıyı sınırsız eğitim verileriyle karşılaştırmak daha fazla okuma için iyi bir başlangıç ​​olabilir.

Bununla birlikte, model kalitesinin karşılaştırılması, "optimal" model için iç çapraz doğrulama iddialarını ve dış çapraz doğrulama ya da uzatma onayını anlamlıdır: tutarsızlık yüksekse, şebeke arama optimizasyonunuzun işe yarayıp yaramadığını sorgulayabilirsiniz. performans ölçüsünün yüksek varyansı nedeniyle yağsız varyans). Bu karşılaştırma, içsel tahminin diğerine kıyasla gülünç derecede iyi olduğunu tahmin ediyorsanız, sorunu tespit edebilmeniz daha kolaydır - eğer değilse, optimizasyonunuz için çok endişelenmenize gerek yoktur. Ancak, herhangi bir durumda, dış (7) performans ölçümünüz dürüst ve sağlam ise, en azından uygun olsun veya olmasın, elde edilen modelin faydalı bir tahminine sahipsiniz.

IMHO öğrenme eğrisini ölçmek henüz farklı bir problemdir. Muhtemelen ayrı olarak bununla başa olurum ve daha net (sizin için öğrenme eğrisi gerekiyor için size öğrenme eğrisi ne gerek tanımlamak gerek bir problemin birden, veri veri seti ve sınıflandırma yöntemiyle veya öğrenme eğrisi Verili problemin, veri ve sınıflandırma mehtod'un bu veri seti için ve bir dizi başka karar (örneğin, eğitim örnek büyüklüğünün bir fonksiyonu olarak model karmaşıklığı ile nasıl başa çıkılır? Her şeyi yeniden optimize edin, sabit hipermetreler kullanın, karar verin. Eğitim seti büyüklüğüne bağlı olarak hiperparametreleri düzeltme işlevi

(Verilerim genellikle öğrenme eğrisinin ölçümünü pratikte kullanmak için yeterince hassas bir şekilde alabilmeniz için çok az bağımsız vakaya sahiptir - ancak 1200 satırınız gerçekten bağımsızsa daha iyi olabilirsiniz)


güncelleme: scikit-learn örneğinde "yanlış" olan nedir?

Her şeyden önce, burada iç içe çapraz doğrulama ile hiçbir şey yanlış değildir. İç içe doğrulama, veri odaklı optimizasyon için son derece önemlidir ve çapraz doğrulama çok güçlü bir yaklaşımdır (özellikle yinelendiğinde / tekrarlandığında).

Öyleyse, herhangi bir şeyin yanlış olup olmadığı sizin bakış açınıza bağlıdır: dürüst bir yuvalanmış doğrulama (dış test verilerini tamamen bağımsız tutma) yaptığınız sürece, dış doğrulama "optimal" modelin performansının uygun bir ölçüsüdür. Bunda yanlış bir şey yok.

Ancak SVM'nin hiperparametre ayarlaması için bu oran tipi performans ölçütlerinin ızgara aramasıyla ilgili birçok şey yanlış olabilir ve yanlış gidebilir. Temel olarak, (muhtemelen?) Optimizasyona güvenemeyeceğiniz anlamına gelir. Bununla birlikte, dış bölümünüz uygun bir şekilde yapıldığı sürece, model mümkün olan en iyi olmasa bile, sahip olduğunuz modelin performansı hakkında dürüst bir tahminde bulunuyorsunuz.

Optimizasyonun neden sorunlu olduğu konusunda sezgisel açıklamalar vermeye çalışacağım:

  • Matematiksel / istatistiksel açıdan konuşursak, oranlarla ilgili sorun, ölçülen oranların ( sonlu test numunesi boyutu (modelin gerçek performansına bağlı olarak, ): nedeniyle büyük bir değişime maruz kalmasıdır.p^np
    Var(p^)=p(1p)n

    Hatırlama, kesinlik (makine öğrenimi performans anlayışı) tahmininde gerekli kesinliği (önyargı / varyans anlayışı) elde etmek için gülünç derecede çok sayıda vakaya (en azından genellikle sahip olabileceğim vaka sayısına kıyasla) ihtiyacınız var. Bu, elbette bu oranlardan hesapladığınız oranlar için de geçerlidir. Binom oranlarının güven aralıklarına bakınız. Şok edici derecede büyükler! Genellikle, hiperparametre ızgarası üzerindeki performanstaki gerçek iyileşmeden daha büyüktür. Ve istatistiksel olarak konuşursak, şebeke arama çok büyük bir karşılaştırma problemidir: değerlendirdiğiniz şebekenin puanları arttıkça, değerlendirmekte olduğunuz tren / test bölümü için yanlışlıkla çok iyi görünen bazı hiperparametrelerin kombinasyonunu bulma riski de artar. Kayma sapma ile kastettiğim budur.

  • Sezgisel olarak, modelin yavaş yavaş bozulmasına neden olan hiperparametrede varsayımsal bir değişim düşünün: bir test durumu karar sınırına doğru ilerler. “Zor” oranlı performans ölçütleri, durum sınırı geçip yanlış tarafta olana kadar bunu tespit etmemektedir. Sonra, derhal, hiperparametrede sonsuz küçük bir değişiklik için tam bir hata atarlar.
    Sayısal optimizasyon yapabilmek için iyi performans gösterilmesi için performans ölçüsüne ihtiyacınız vardır. Bu şu anlama gelir: Ne orandaki performans ölçüsünün ürkek (sürekli farklılaşmaz) kısmı ne de bu atlama dışında gerçekte meydana gelen değişikliklerin tespit edilmemesi optimizasyon için uygun değildir.
    Uygun puanlama kuralları, özellikle optimizasyon için uygun bir şekilde tanımlanır. Öngörülen olasılıklar, söz konusu sınıfa ait her durum için gerçek olasılıklarla eşleştiğinde küresel maksimum değerlerine sahiptir.

  • SVM'ler için, sadece performans ölçütleri değil, aynı zamanda modelin de bu ürkeklik tarzında tepki vermesi gibi ek bir probleminiz var: hiperparametrede küçük değişiklikler hiçbir şeyi değiştirmeyecek. Model, yalnızca hiperparametreler bazı durumlarda ya destek vektörü olmayı ya da destek vektörü olmayı durduracak kadar değiştiğinde değişir. Yine, bu modellerin optimize edilmesi zor.

Edebiyat:


Güncelleme II: Kaymağını sapma değişimi

Model karşılaştırması açısından karşılayabileceğiniz şey, açıkça bağımsız dava sayısına bağlıdır. Burada kaymağını sapma riski hakkında hızlı ve kirli bir simülasyon yapalım:

scikit.learn1797'nin digitsveride olduğunu söylüyor .

  • 100 modelin karşılaştırıldığını varsayın, örneğin 2 parametre için ızgara.10×10
  • Her iki parametrenin de (aralıkların) modelleri hiç etkilemediğini varsayalım,
  • yani, tüm modeller% 97 ile aynı gerçek performansa sahiptir ( digitsveri kümesi için tipik performans ).

  • Çalışma örnek boyutu "bu modellerde test" simülasyonunu = 1797 satır veri setinin104digits

    p.true = 0.97 # hypothetical true performance for all models
    n.models = 100 # 10 x 10 grid
    
    n.rows = 1797 # rows in scikit digits data
    
    sim.test <- replicate (expr= rbinom (n= nmodels, size= n.rows, prob= p.true), 
                           n = 1e4)
    sim.test <- colMaxs (sim.test) # take best model
    
    hist (sim.test / n.rows, 
          breaks = (round (p.true * n.rows) : n.rows) / n.rows + 1 / 2 / n.rows, 
          col = "black", main = 'Distribution max. observed performance',
          xlab = "max. observed performance", ylab = "n runs")
    abline (v = p.outer, col = "red")
    

İşte en iyi gözlenen performansın dağılımı:

kaymağını sapma simülasyonu

Kırmızı çizgi, tüm varsayımsal modellerimizin gerçek performansını gösterir. Ortalama olarak, karşılaştırılan 100 modelin görünüşte en iyisi için gerçek hata oranının sadece 2 / 3'ünü gözlemliyoruz (simülasyon için hepsinin% 97 doğru tahminle eşit şekilde performans gösterdiğini biliyoruz).

Bu simülasyon açıkça çok basitleştirilmiştir:

  • Test numunesi büyüklüğü varyansına ek olarak, model kararsızlığından dolayı en azından varyans var, bu yüzden burada varyansı hafife alıyoruz
  • Model karmaşıklığını etkileyen parametrelerin ayarlanması tipik olarak, modellerin dengesiz olduğu ve bu nedenle de yüksek değişkenliğe sahip olan parametre kümelerini kapsayacaktır.
  • Örnekteki UCI haneleri için, orijinal veri tabanında ca. 44 kişi tarafından yazılmış 11000 hane. Veriler yazan kişiye göre kümelenirse ne olur? (Yani, o kişinin nasıl yazdığını biliyorsan, biri tarafından yazılmış bir 8'i tanımak daha mı kolay, yani, 3?) Etkili örneklem büyüklüğü, 44 kadar düşük olabilir.
  • Tuning modeli hiperparametreleri, modeller arasında korelasyona yol açabilir (aslında, sayısal bir optimizasyon bakış açısıyla iyi davranılmış sayılır). Bunun etkisini tahmin etmek zordur (ve gerçek sınıflayıcı türünü dikkate almadan bunun imkansız olduğunu düşünüyorum).

Bununla birlikte, genel olarak, düşük sayıda bağımsız test vakası ve yüksek sayıda karşılaştırılmış model yanlılığı arttırmaktadır. Ayrıca, Cawley ve Talbot makalesi ampirik olarak gözlemlenen davranışlar verir.


@cbleites: Şebeke araştırması en uygun modeli bulmak için uygun bir yöntem değilse, hangi yöntemi seçmeliyim?
tobip

1
@ ta.ft: iki yaklaşım a) karşılaştırılması gereken modellerin sayısını büyük ölçüde azaltmak için, uygulamanız ve verileriniz hakkında modelleme ile ilgili çok fazla dış bilgi içermesidir (= optimizasyon yerine hiperparametrelere karar verin). Genel olarak anlamlı hiperparametrelere sahip bir sınıflandırıcıya geçmek, yani hiperparametrenin (yaklaşık olarak) ne olması gerektiğini uygulamadan ve veri tipinden öğrenebileceğiniz genel olarak daha iyi olabilir. b) kalan birkaç modeli uygun puanlama kuralı ile karşılaştırın. Örneğin Briers skoru, birçok sınıflandırıcı için çok daha iyi varyans özelliklerine sahiptir.
cbeleites,

1
Ayrıca, optimize etmeyi de tamamen reddedebilirsiniz (kararlar (a) ile). Yeterince iyi bir sınıflandırıcı elde ederseniz ve mevcut örneklem büyüklüğü verilen başka bir sınıflandırıcıya üstünlük gösterme şansınız olmadığını iddia edebilirsiniz (örneğin, bazı demo McNemar hesaplamaları yapın, hipotetik daha iyi bir sınıflandırıcı için oran karşılaştırmaları için gerekli örneklem büyüklüğüne bakın - var) Bunların gülünç büyük hipotetik gelişmeler için bile gülünç derecede büyük olması için iyi bir şans), optimizasyonun bir anlam ifade etmediğini ve fazla abartma riski yarattığını iddia edebilirsiniz.
cbeleites,

"Kaymağını sapma" konusunda sana katılıyorum. Kılavuzda, hiperparametre optimizasyonu için çok fazla puanınız varsa, bir puan CV'nin bir katında fırsatçı olarak şanslı olabilir; ancak varsa, diyelim ki 10 kat CV, hala bir parametre setinin CV'nin 10 katının hepsinde şanslı olması muhtemel değildir.
RNA

1
@RNA: Tüm kıvrımlarda "şanslı" olma olasılığı, toplam vaka sayısına (10 katın hepsinde) doğrudan bağlıdır ve tipik olarak, sadece tüm bu kıvrımlara göre ortalaması kabul edilir. Cevabı, örnek senaryo için dikkate değer bir önyargıyla zaten ilişkilendirilmiş olan 100 modelin en iyisinin (her biri 10 adımda 2 hiperparametre) varsayımsal bir seçiminin simülasyonuyla güncelledim (hata oranı 1/3 ile çok düşük) . Buradaki çoğu insan nadiren birkaç bin bağımsız vakaya sahiptir - örneğin, tam UCI rakamları veri seti için rakam yazan 44 kişiyi bile nadiren kullanırım.
cbeleites,
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.