Bagaimana cara membagi dataset untuk validasi silang, kurva pembelajaran, dan evaluasi akhir?

70

Apa strategi yang tepat untuk memisahkan dataset?

Saya meminta umpan balik pada pendekatan berikut (tidak pada parameter individu seperti test_sizeatau n_iter, tetapi jika saya menggunakan X, y, X_train, y_train, X_test, dan y_testtepat dan jika urutan masuk akal):

(memperluas contoh ini dari dokumentasi scikit-learn)

1. Muat dataset

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

2. Bagi pelatihan dan set tes (misalnya, 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. Pilih penduga

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

4. Pilih iterator cross-validasi

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

5. Setel hyperparameter

menerapkan iterator cross-validasi pada set pelatihan

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. Algoritme debug dengan kurva belajar

X_traindibagi secara acak menjadi pelatihan dan satu set tes 10 kali ( n_iter=10). Setiap titik pada kurva skor pelatihan adalah rata-rata 10 skor di mana model dilatih dan dievaluasi pada contoh pelatihan i pertama . Setiap titik pada kurva skor validasi silang adalah rata-rata 10 skor di mana model dilatih pada contoh pelatihan i pertama dan dievaluasi pada semua contoh set tes.

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()

Kurva belajar

plot_learning_curve () dapat ditemukan di versi dev saat ini scikit-learn (0,15-git).

7. Evaluasi akhir pada set tes

classifier.score(X_test, y_test)

7a. Tes terlalu pas dalam pemilihan model dengan validasi silang bersarang (menggunakan seluruh dataset)

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

Pertanyaan tambahan: Apakah masuk akal untuk mengganti langkah 7 dengan validasi silang bersarang? Atau harus bersarang cv dilihat sebagai pelengkap untuk langkah 7

(kode ini sepertinya bekerja dengan k-fold cross validation di scikit-learn, tetapi tidak dengan shuffle & split. Jadi cvperlu diubah di atas untuk membuat kode itu berfungsi)

8. Melatih model akhir pada seluruh dataset

classifier.fit(X, y)

EDIT: Saya sekarang setuju dengan cbeleites bahwa langkah 7a tidak masuk akal dalam urutan ini. Jadi saya tidak akan mengadopsi itu.

tobip
sumber
Aturan penilaian akurasi mana yang Anda gunakan? Jika akurasi klasifikasi, aturan penilaian yang tidak tepat seperti itu akan membatalkan banyak pekerjaan yang Anda lakukan.
Frank Harrell
Saya menggunakan default yang memang akurasi klasifikasi. Saya tahu, misalnya, F1 akan lebih tepat. Tapi di sini saya hanya tertarik jika splits digunakan OK.
tobip
3
Saya hampir yakin bahwa F1 adalah nama baru untuk konsep lama. Saya pikir itu kontraproduktif untuk menciptakan nama-nama baru untuk hal-hal lama. Lebih penting lagi, ini adalah aturan penilaian yang tidak tepat yang akan menghasilkan pemilihan fitur yang salah serta menambahkan banyak kebisingan ke seluruh proses.
Frank Harrell
3
... dalam hal apa pun F1 berbagi masalah akurasi @FrankHarrell menyinggung: ini berasal dari penghitungan pecahan kasus uji klasifikasi keras. Untuk mendapatkan salah satu dari aturan penilaian Frank yang tepat, Anda harus beralih ke output probabilistik dari SVM, dan kemudian misalnya menggunakan skor Brier (mean squared error) alih-alih keakuratan. Saya kira Anda juga bisa mendapatkan versi F1 tipe MSE. Langkah-langkah seperti itu memang harus lebih baik untuk langkah penyetelan. Untuk mengkomunikasikan kinerja akhir, Anda mungkin juga memerlukan cara khas (misalnya akurasi, F1) untuk mengekspresikan kinerja untuk komunitas Anda.
cbeleites
1
@ ta.ft: apakah pendekatannya salah atau tidak tergantung pada apa yang Anda anggap salah: pencarian grid pada proporsi memiliki risiko serius skimming varians kecuali Anda memiliki jumlah kasus independen yang sangat besar. Jadi, untuk banyak situasi, klaim bahwa pencarian kotak menghasilkan model optimal adalah salah. Namun, jika Anda melakukan validasi bertingkat yang tepat, validasi luar memberikan ukuran yang jujur ​​dari kinerja model "optimal" yang dipilih. Jadi itu tidak salah. Anda hanya tidak memiliki jaminan bahwa pencarian kotak mendapatkan model yang optimal. Sedangkan untuk literatur, saya akan memperbarui jawaban saya.
cbeleites

Jawaban:

41

Saya tidak yakin apa yang ingin Anda lakukan pada langkah 7a. Seperti yang saya pahami sekarang, itu tidak masuk akal bagi saya.

Begini cara saya memahami deskripsi Anda: pada langkah 7, Anda ingin membandingkan kinerja hold-out dengan hasil validasi silang yang mencakup langkah 4 - 6. (jadi ya, itu akan menjadi pengaturan bersarang).

Poin utama mengapa menurut saya perbandingan ini tidak masuk akal adalah:

  • Perbandingan ini tidak dapat mendeteksi dua sumber utama hasil validasi terlalu optimis yang saya temui dalam praktiknya:

    • kebocoran data (ketergantungan) antara data pelatihan dan tes yang disebabkan oleh struktur data hierarkis (alias berkerumun), dan yang tidak diperhitungkan dalam pemisahan. Di bidang saya, kami biasanya memiliki beberapa (kadang-kadang ribuan) bacaan (= baris dalam matriks data) dari pasien yang sama atau replikasi biologis percobaan. Ini tidak independen, sehingga pemisahan validasi perlu dilakukan di tingkat pasien. Namun, seperti kebocoran data terjadi, Anda akan memilikinya di pemisahan untuk set bertahan dan di pemisahan validasi silang. Hold-out wold kemudian menjadi sama optimisnya dengan validasi silang.

    • Preprocessing data dilakukan pada seluruh matriks data, di mana perhitungan tidak independen untuk setiap baris tetapi banyak / semua baris digunakan untuk menghitung parameter untuk preprocessing. Contoh-contoh tipikal adalah misalnya proyeksi PCA sebelum klasifikasi "aktual".
      Sekali lagi, itu akan memengaruhi validasi penahan dan lintas silang Anda, jadi Anda tidak bisa mendeteksinya.

    Untuk data yang saya gunakan, kedua kesalahan dapat dengan mudah menyebabkan fraksi kesalahan klasifikasi diremehkan oleh urutan besarnya!

  • Jika Anda dibatasi untuk fraksi yang dihitung ini dari jenis kinerja kasus, perbandingan model membutuhkan jumlah kasus uji yang sangat besar atau perbedaan yang sangat besar dalam kinerja sebenarnya. Membandingkan 2 pengklasifikasi dengan data pelatihan tanpa batas mungkin merupakan awal yang baik untuk membaca lebih lanjut.

Namun, membandingkan kualitas model yang diklaim oleh validasi silang dalam untuk model "optimal" dan validasi silang luar atau validasi tahan memang masuk akal: jika perbedaannya tinggi, patut dipertanyakan apakah optimasi pencarian grid Anda berhasil (Anda mungkin memiliki varians skim karena varians tinggi ukuran kinerja). Perbandingan ini lebih mudah karena Anda dapat menemukan masalah jika Anda memiliki perkiraan bagian dalam yang sangat baik dibandingkan dengan yang lain - jika tidak, Anda tidak perlu terlalu khawatir tentang pengoptimalan. Tetapi bagaimanapun juga, jika pengukuran luar (7) kinerja Anda jujur ​​dan baik, Anda setidaknya memiliki perkiraan yang berguna dari model yang diperoleh, apakah itu optimal atau tidak.

IMHO mengukur kurva belajar adalah masalah yang berbeda. Saya mungkin akan mengatasinya secara terpisah, dan saya pikir Anda perlu mendefinisikan lebih jelas untuk apa Anda memerlukan kurva belajar (apakah Anda memerlukan kurva belajar untuk kumpulan data dari masalah, data, dan metode klasifikasi yang diberikan atau kurva pembelajaran untuk kumpulan data ini dari masalah yang diberikan, data, dan klasifikasi mehtod), dan banyak keputusan lebih lanjut (misalnya bagaimana menangani kompleksitas model sebagai fungsi dari ukuran sampel pelatihan? Optimalkan sekali lagi, gunakan hyperparameters tetap, putuskan berfungsi untuk memperbaiki hyperparameters tergantung pada ukuran pelatihan yang ditetapkan?)

(Data saya biasanya memiliki begitu sedikit kasus independen untuk mendapatkan pengukuran kurva belajar yang cukup tepat untuk menggunakannya dalam praktik - tetapi Anda mungkin lebih baik jika 1200 baris Anda sebenarnya independen)


pembaruan: Apa yang "salah" dengan contoh scikit-learn?

Pertama-tama, tidak ada yang salah dengan validasi silang bersarang di sini. Validasi bersarang adalah yang paling penting untuk optimasi data-driven, dan validasi silang adalah pendekatan yang sangat kuat (terutama jika diulang / diulang).

Kemudian, apakah ada yang salah sama sekali tergantung pada sudut pandang Anda: selama Anda melakukan validasi bersarang jujur ​​(menjaga data uji luar benar-benar independen), validasi luar adalah ukuran yang tepat dari kinerja model "optimal". Tidak ada yang salah dengan itu.

Tetapi beberapa hal bisa dan memang salah dengan pencarian kisi-kisi ukuran kinerja tipe proporsi ini untuk penyetelan hyperparameter dari SVM. Pada dasarnya mereka berarti bahwa Anda mungkin (mungkin?) Tidak dapat mengandalkan optimisasi. Namun demikian, selama pemisahan luar Anda dilakukan dengan benar, bahkan jika modelnya bukan yang terbaik, Anda memiliki perkiraan yang jujur ​​tentang kinerja model yang Anda dapatkan.

Saya akan mencoba memberikan penjelasan intuitif mengapa pengoptimalan mungkin bermasalah:

  • Secara matematis / statistik berbicara, masalah dengan proporsi adalah bahwa proporsi yang diukur tunduk pada varians yang sangat besar karena ukuran sampel uji hingga (tergantung juga pada kinerja sebenarnya dari model, ):p^np
    Var(p^)=p(1p)n

    Anda perlu jumlah kasus yang sangat besar (setidaknya dibandingkan dengan jumlah kasus yang biasanya saya miliki) untuk mencapai presisi yang dibutuhkan (bias / indra varian) untuk memperkirakan daya ingat, presisi (pengertian kinerja pembelajaran mesin). Ini tentu saja berlaku juga untuk rasio yang Anda hitung dari proporsi tersebut. Lihatlah interval kepercayaan untuk proporsi binomial. Mereka sangat besar! Seringkali lebih besar dari peningkatan kinerja yang sebenarnya di atas grid hyperparameter. Dan secara statistik, pencarian grid adalah masalah perbandingan banyak yang masif: semakin banyak poin dari grid yang Anda evaluasi, semakin tinggi risiko menemukan beberapa kombinasi hiperparameter yang secara tidak sengaja terlihat sangat bagus untuk pemisahan kereta / tes yang Anda evaluasi. Inilah yang saya maksud dengan skimming varians.

  • Secara intuitif, pertimbangkan perubahan hiperparameter hipotetis, yang perlahan-lahan menyebabkan model memburuk: satu uji kasus bergerak menuju batas keputusan. Ukuran kinerja proporsi 'sulit' tidak mendeteksi hal ini sampai kasing melewati batas dan berada di sisi yang salah. Namun, mereka segera menetapkan kesalahan penuh untuk perubahan kecil yang tak terhingga dalam hyperparameter.
    Untuk melakukan optimasi numerik, Anda perlu ukuran kinerja untuk berperilaku baik. Itu berarti: baik bagian yang gelisah (tidak dapat dibedakan secara terus-menerus) dari ukuran kinerja tipe proporsi maupun fakta bahwa selain lompatan itu, perubahan yang sebenarnya terjadi tidak terdeteksi tidak cocok untuk optimisasi.
    Aturan penilaian yang tepat didefinisikan dengan cara yang sangat cocok untuk optimasi. Mereka memiliki maksimum global ketika probabilitas yang diprediksi cocok dengan probabilitas sebenarnya untuk setiap kasus milik kelas yang bersangkutan.

  • Untuk SVM Anda memiliki masalah tambahan yang tidak hanya ukuran kinerja tetapi juga model bereaksi dengan gaya gelisah ini: perubahan kecil dari hyperparameter tidak akan mengubah apa pun. Model hanya berubah ketika hyperparameters berubah cukup untuk menyebabkan beberapa kasus berhenti menjadi vektor dukungan atau menjadi vektor dukungan. Sekali lagi, model seperti itu sulit untuk dioptimalkan.

Literatur:


Pembaruan II: Skimming variance

apa yang Anda mampu dalam hal perbandingan model jelas tergantung pada jumlah kasus independen. Mari kita membuat beberapa simulasi cepat dan kotor tentang risiko skimming varians di sini:

scikit.learnmengatakan bahwa mereka memiliki 1797 dalam digitsdata.

  • asumsikan 100 model dibandingkan, misalnya kisi untuk 2 parameter.10×10
  • menganggap bahwa kedua parameter (rentang) tidak mempengaruhi model sama sekali,
  • yaitu, semua model memiliki kinerja sebenarnya yang sama, katakanlah, 97% (kinerja khas untuk digitskumpulan data).

  • Jalankan simulasi "pengujian model ini" dengan ukuran sampel = 1797 baris dalam kumpulan data104digits

    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")
    

Berikut distribusi untuk kinerja terbaik yang diamati:

simulasi varian skimming

Garis merah menandai kinerja sebenarnya dari semua model hipotetis kami. Rata-rata, kami mengamati hanya 2/3 dari tingkat kesalahan sebenarnya untuk yang tampaknya terbaik dari 100 model yang dibandingkan (untuk simulasi kami tahu bahwa mereka semua bekerja sama dengan prediksi yang benar 97%).

Simulasi ini jelas sangat disederhanakan:

  • Selain varians ukuran sampel uji, setidaknya ada varians karena ketidakstabilan model, jadi kami meremehkan varians di sini
  • Parameter tuning yang mempengaruhi kompleksitas model biasanya akan mencakup set parameter di mana model tidak stabil dan dengan demikian memiliki varian tinggi.
  • Untuk digit UCI dari contoh, basis data asli memiliki ca. 11000 digit ditulis oleh 44 orang. Bagaimana jika data dikelompokkan menurut orang yang menulis? (Yaitu lebih mudah untuk mengenali 8 yang ditulis oleh seseorang jika Anda tahu bagaimana orang itu menulis, katakanlah, 3?) Ukuran sampel efektif kemudian mungkin serendah 44.
  • Hyperparameters model tuning dapat menyebabkan korelasi antara model (pada kenyataannya, yang akan dianggap berperilaku baik dari perspektif optimasi numerik). Sulit untuk memprediksi pengaruh itu (dan saya menduga ini tidak mungkin tanpa mempertimbangkan jenis classifier yang sebenarnya).

Secara umum, bagaimanapun, baik jumlah kasus uji independen dan jumlah model perbandingan yang tinggi meningkatkan bias. Juga, makalah Cawley dan Talbot memberikan perilaku yang diamati secara empiris.

cbeleites
sumber
@cites: Jika pencarian kotak mungkin bukan metode yang tepat untuk menemukan model optimal, metode apa yang harus saya pilih?
tobip
1
@ ta.ft: dua pendekatan adalah a) menggabungkan sebanyak mungkin pengetahuan eksternal tentang aplikasi dan data Anda ke dalam pemodelan untuk secara drastis mengurangi jumlah model yang perlu dibandingkan (= putuskan hiperparameter alih-alih mengoptimalkan). Mungkin secara keseluruhan lebih baik untuk mengubah ke classifier yang memiliki hiperparameter yang secara intrinsik bermakna, yaitu di mana Anda dapat mengetahui dari aplikasi dan tipe data seperti apa seharusnya hyperparameter. b) membandingkan beberapa model yang tersisa dengan aturan penilaian yang tepat. Misalnya skor Briers memiliki sifat varians yang jauh lebih baik untuk banyak pengklasifikasi.
cbeleites
1
Anda juga dapat menolak untuk mengoptimalkan sama sekali (melalui keputusan (a)). Jika Anda mendapatkan klasifikasi yang cukup baik dan dapat menyatakan bahwa Anda tidak memiliki kesempatan untuk membuktikan keunggulan klasifikasi lain mengingat ukuran sampel yang tersedia (mis. Lakukan beberapa perhitungan McNemar demo, cari ukuran sampel yang diperlukan untuk perbandingan perbandingan untuk klasifikasi yang lebih baik - ada peluang bagus bahwa ini akan menjadi sangat besar bahkan untuk perbaikan hipotetis yang sangat besar), Anda dapat berargumen bahwa optimisasi tidak masuk akal dan hanya menciptakan risiko overfitting.
cbeleites
Saya tidak setuju dengan Anda tentang "skimming variance". Jika Anda memiliki banyak poin di grid untuk optimisasi hyperparameter, suatu titik mungkin beruntung dalam satu lipatan CV; tetapi jika sudah, misalkan 10 kali lipat CV, itu masih tidak mungkin satu set parameter secara tidak sengaja akan beruntung di semua 10 lipatan CV.
RNA
1
@RNA: Probabilitas untuk menjadi "beruntung" di semua lipatan terhubung langsung ke jumlah kasus (di semua 10 lipatan), dan biasanya hanya rata-rata di atas semua lipatan yang dipertimbangkan. Saya memperbarui jawaban dengan simulasi pengambilan hipotesis dari yang terbaik dari 100 model (katakanlah, 2 hiperparameter dengan 10 langkah masing-masing), yang sudah dikaitkan dengan bias yang cukup besar untuk skenario contoh (tingkat kesalahan terlalu rendah dengan 1/3) . Banyak orang di sini jarang memiliki beberapa ribu kasus independen di tangan - misalnya saya jarang memiliki bahkan 44 orang yang menulis digit untuk set data digit UCI penuh.
cbeleites