Apa strategi yang tepat untuk memisahkan dataset?
Saya meminta umpan balik pada pendekatan berikut (tidak pada parameter individu seperti test_size
atau n_iter
, tetapi jika saya menggunakan X
, y
, X_train
, y_train
, X_test
, dan y_test
tepat 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_train
dibagi 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()
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 cv
perlu 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.
Jawaban:
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^ n p
Var(p^)=p(1−p)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:
Gneiting, T. & Raftery, AE: Aturan Pemberian Skor Tepat, Prediksi, dan Estimasi, Jurnal Asosiasi Statistik Amerika, 102, 359-378 (2007). DOI: 10.1198 / 016214506000001437
Brereton, R .: Chemometrics untuk pengenalan pola, Wiley, (2009).
menunjukkan perilaku gelisah SVM sebagai fungsi dari hyperparameters.
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.learn
mengatakan bahwa mereka memiliki 1797 dalamdigits
data.yaitu, semua model memiliki kinerja sebenarnya yang sama, katakanlah, 97% (kinerja khas untuk
digits
kumpulan data).Jalankan simulasi "pengujian model ini" dengan ukuran sampel = 1797 baris dalam kumpulan data104
digits
Berikut distribusi untuk kinerja terbaik yang diamati:
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:
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.
sumber