Akankah kinerja validasi silang menjadi indikasi akurat untuk memprediksi kinerja sebenarnya pada kumpulan data independen?


9

Saya merasa bahwa pertanyaan ini terkait dengan teori di balik validasi silang. Saya mempresentasikan temuan empiris saya di sini dan menulis pertanyaan terkait dengan teori validasi silang di sana .

Saya memiliki dua model M1 dan M2, saya menggunakan set data yang sama untuk melatih mereka dan melakukan validasi silang menggunakan set data yang sama untuk menemukan parameter optimal untuk setiap model. Say akhirnya saya menemukan bahwa M1 di bawah parameter optimalnya, berkinerja lebih baik daripada M2 di bawah parameter optimalnya dalam hal skor validasi silang 10 kali lipat. Sekarang jika saya memiliki satu set data uji independen dengan prediktor dan label dan set data uji ini dihasilkan dari distribusi yang sama dari set data pelatihan saya, maka sebelum saya menerapkan 2 model yang telah disesuaikan ini pada set data pengujian baru, dapatkah saya klaim atau haruskah saya berharap untuk melihat bahwa M1 akan tetap berkinerja lebih baik daripada M2 dibandingkan dengan kumpulan data pengujian yang baru?

Saya sedang bermain contoh Kaggle Titanic. Saya memiliki 2 model xgboost, M1 disetel dengan baik dan M2 kurang disetel dalam arti bahwa M1 memiliki validasi silang 10 kali lebih baik pada perangkat data pelatihan. Tetapi ketika saya mengirimkan keduanya, saya menemukan bahwa model yang kurang baik sebenarnya memiliki skor yang lebih baik pada set data uji. Bagaimana bisa? Dan jika itu benar, lalu apa yang harus kita cari ketika kita memasukkan data ke model yang berbeda dan menyesuaikan parameter model?

Berikut adalah hasil pengiriman spesifik saya: Saya melakukan pencarian grid acak

params_fixed = {'silent': 1,'base_score': 0.5,'reg_lambda': 1,
'max_delta_step': 0,'scale_pos_weight':1,'nthread': 4,
'objective': 'binary:logistic'}
params_grid = {'max_depth': list(np.arange(1,10)),
'gamma': [0,0.05,0.1,0.3, 0.5,0.7,0.9],
'n_estimators':[1,2,5,7,10,15,19,25,30,50], 
'learning_rate': [0.01,0.03,0.05,0.1,0.3,0.5,0.7,0.9,1],
'subsample': [0.5,0.7,0.9], 'colsample_bytree': [0.5,0.7,0.9], 
'min_child_weight': [1,2,3,5], 'reg_alpha': [1e-5, 1e-2, 0.1, 0.5,1,10]
}
rs_grid = RandomizedSearchCV(
          estimator=XGBClassifier(**params_fixed, seed=seed),
          param_distributions=params_grid,
          n_iter=5000,   
          cv=10,
          scoring='accuracy',
          random_state=seed
)

Setiap kali saya mengubah variabel n_iter. Pertama, saya atur n_iter=10, itu memberi saya satu set nilai dari parameter hiper itu, sebut saja vektor ini dan skor cv (tingkat akurasi) adalah 0,83389 , maka saya menggunakan untuk melatih model saya dan menghasilkan prediksi pada tes independen kumpulan data, dan ketika saya kirim ke Kaggle menghasilkan akurasi yang sebenarnya pada kumpulan data uji 0.79426α1α1

Kedua, saya atur n_iter=100, itu memberi saya dan skor cv adalah 0,83614 , yaitu, lebih tinggi dari yang pertama, masuk akal, tetapi ketika saya mengirim ke Kaggle, 0,78469 , lebih rendah dari yang pertama.α2

Ketiga, saya atur n_iter = 1000, itu memberi saya dan skor cv adalah 0,83951 , yaitu, lebih tinggi dari yang kedua, masuk akal, tetapi ketika saya kirimkan ke Kaggle, 0,77990 , lebih rendah dari yang kedua.α3

Keempat, saya atur n_iter = 5000, itu memberi saya dan skor cv adalah 0,84512 , yaitu, lebih tinggi dari yang ketiga, masuk akal, tetapi ketika saya mengirim ke Kaggle, 0,72249 , lebih rendah dari yang ketiga.α4

Ini benar-benar frustrasi. Model semakin baik dan lebih baik pada skor validasi silang tetapi ketika dilakukan pada set data independen yang sebenarnya, kinerjanya semakin buruk. Apakah saya menafsirkan skor CV dengan cara yang berlawanan? Saya melihat beberapa makalah menyebutkan bahwa skor CV bisa terlalu optimis untuk menyimpulkan skor tes yang sebenarnya. Namun, bahkan jika itu benar, maka saya pikir skor CV untuk semua 4 model saya harus semua optimis tentang nilai ujian sejati mereka sendiri, yaitu, urutannya harus dipertahankan. Tetapi ketika menerapkan pada set data uji nyata, urutannya terbalik.

Satu-satunya alasan yang dapat saya bayangkan adalah, set data uji memiliki distribusi yang berbeda dari set data pelatihan. Namun, jika memang benar demikian, maka saya percaya tidak ada metode di bawah matahari yang dapat menyembuhkan masalah ini.

Jawaban:


3

Pertama, jawaban pragmatis: jangan mengabaikan kemungkinan bahwa set tes berasal dari distribusi yang agak berbeda dari set data yang Anda gunakan untuk pelatihan dan validasi silang. Anda mungkin berpikir itu seharusnya tidak terjadi, tetapi dalam praktiknya hal itu tampaknya terjadi.

Yang mengatakan, mari kita pergi dengan hipotesis Anda dan menganggap bahwa set tes berasal dari distribusi yang sama persis dengan sisa data Anda. Dalam hal itu, validasi silang dapat membuat Anda tersesat tentang model mana yang lebih baik, jika Anda menggunakan validasi silang untuk memilih parameter-hiper.

Anda dapat menggunakan validasi silang untuk (a) memilih parameter-hiper, atau (b) memperkirakan keakuratan model Anda - tetapi tidak keduanya sekaligus secara bersamaan.

Tampaknya Anda menggunakan validasi silang untuk memilih parameter-hiper optimal: Anda mencoba banyak pilihan berbeda untuk parameter-hiper, untuk setiap estimasi estimasi akurasi pilihan itu menggunakan validasi silang, dan pilih pilihan terbaik. Ketika Anda melakukan itu, tidak ada jaminan bahwa akurasi yang dihasilkan (dengan parameter terbaik) akan menjadi prediksi kinerja pada set tes - mungkin terlalu tinggi (karena overfitting). Jika itu lebih dari perkiraan terlalu tinggi untuk M1 daripada M2, maka Anda mungkin melihat apa yang Anda lihat.

Jika Anda ingin memilih parameter-hiper dan akurasi estimasi, saya sarankan Anda memiliki set validasi yang diadakan untuk memperkirakan akurasi, atau menggunakan validasi silang bersarang. Lihat https://stats.stackexchange.com/q/65128/2921 dan http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html .


Apakah Anda tahu referensi yang lebih teoretis lainnya (dari sisi teori probabilitas) yang menjelaskan mengapa CV bersarang diperlukan daripada CV biasa untuk pemilihan model? Saya ingin memahami mekanisme yang mendasari yang mengarah ke masalah yang saya temui
KevinKim

1
Saya juga menyarankan menggunakan validasi silang bersarang. jika Anda melakukan CV luar 3 kali lipat dan CV dalam 10 kali lipat, Anda akan dapat menguji 3 model yang Anda latih selama CV dalam pada tiga dataset berbeda; yang akan memberi Anda pemahaman yang lebih baik tentang bagaimana proses pembangunan model Anda akan berakhir ketika bertemu set data yang berbeda.
darXider

@darXider Saya sudah membaca beberapa CV yang bersarang, sepertinya itu digunakan untuk membandingkan 2 kelas model, misalnya, RF dan GBT sehingga di dalam CV, ia memilih hyperparameters "terbaik" (kesalahan CV terendah) dari RF dan GBT masing-masing, kemudian di CV luar, itu menghitung kesalahan generalisasi RF dan GBT dengan hyperparameter yang dipilih oleh CV dalam. Dalam kasus saya, saya hanya punya satu kelas model, GBT, saya ingin melakukan penyetelan hyperparameter. Bagaimana nested cv membantu saya melakukan itu?
KevinKim

@KevinKim AFAIK, tujuan CV bersarang adalah untuk memberikan gambaran tentang bagaimana proses pembuatan model akan digeneralisasi dan bukan untuk membandingkan kelas model yang berbeda. Karena tujuan akhir Anda adalah menggunakan model terlatih Anda (baik RF atau XGB) pada data yang akan datang / tidak terlihat, Anda mungkin mendapatkan pemahaman yang lebih baik tentang kinerjanya jika Anda menggunakan CV bersarang. Tentu saja, Anda juga melakukan penyetelan hyperparameter di CV bersarang 3x10 Anda; pada akhirnya, Anda akan mendapatkan, katakanlah, 3 model XGB yang setara satu sama lain (perhatikan bahwa Anda tidak harus memilih satu dari tiga, tetapi Anda dapat menggabungkannya, katakanlah, menggunakan berbagai metode ensembling).
darXider

1

dapatkah saya mengklaim atau haruskah saya berharap untuk melihat bahwa M1 akan tetap berkinerja lebih baik daripada M2 dibandingkan dengan kumpulan data pengujian yang baru?

Ya kamu harus. Tentu dengan syarat itu

  1. data uji berasal dari proses pembuatan yang sama seperti data pelatihan dan validasi, dan
  2. Anda memiliki cukup data di setiap set untuk membuat fluktuasi statistik tidak mungkin.

Model semakin baik dan lebih baik pada skor validasi silang tetapi ketika dilakukan pada set data independen yang sebenarnya, kinerjanya semakin buruk.

Saya dapat memikirkan dua alasan:

  1. Kumpulan data uji memang tidak dihasilkan dengan cara yang sama. Oleh karena itu, lebih baik untuk tidak bergantung pada set tes Kaggle yang Anda tidak memiliki akses. Gunakan data yang Anda miliki.

  2. Anda terlalu pas, yang berarti Anda tidak menjalankan validasi silang dengan benar. Pastikan benar-benar bahwa pelatihan parameter terjadi pada data pelatihan dan, pada saat yang sama, bahwa validasi terjadi pada data yang tidak Anda gunakan untuk pelatihan. Bandingkan histogram dari kehilangan pelatihan dan kehilangan validasi. Kehilangan pelatihan harus secara konsisten lebih kecil daripada kehilangan validasi. Lakukan hal yang sama untuk kerugian pada data uji untuk mendapatkan gambaran yang konsisten.

Sebagai dan catatan akhir: Diharapkan, bahwa kinerja pada set tes lebih rendah dari pada set validasi. Ini karena model dipilih berdasarkan set validasi. Jadi itu bias ke set data itu.


Saya memiliki kode di pos saya, saya rasa saya tidak menyalahgunakan prosedur CV (apakah Anda menemukan sesuatu yang salah dengan kode saya?). Dan saya memang melihat bahwa kesalahan pelatihan jauh lebih sedikit dan stabil (dengan std kecil) daripada kesalahan validasi. Saya mengerti bahwa kesalahan pengujian yang sebenarnya akan lebih tinggi dari kesalahan validasi tetapi saya berharap ini juga akan terjadi pada semua model saya (maksud saya XBGT dengan nilai yang berbeda dari hyperparameters). Dari apa yang saya lihat, tampaknya beberapa model ini terjadi kurang dari model lain, yang menciptakan "fenomena terbalik" ini. Jadi saya tidak tahu ke arah mana saya mencari untuk menyetel hyperpara
KevinKim

Saya telah melihat banyak orang menyarankan untuk memecah menjadi 3 bagian, melatih, validasi dan tes, dan setelah menyetel hyperP di set validasi, kemudian menerapkan model pada set tes untuk melihat bagaimana model ini akan tampil pada tes nyata ( karena langkah validasi juga memiliki beberapa bias). Kemudian setelah tes, hentikan tune hyperP, seperti jika Anda lakukan, itu juga akan mulai mendapatkan bias (seperti dalam set validasi). Saya mengerti. Tetapi jika setelah set tes, saya masih tidak puas dengan kinerja model saya, lalu apa yang harus saya lakukan? D
KevinKim

Saya pikir dalam praktiknya, meskipun kita hidup di dunia "data besar", jumlah fitur juga meningkat. Karena kita memiliki kutukan dimensi, sangat mungkin bahkan kita memiliki banyak baris, masih untuk setiap bagian dari ruang fitur, kita masih belum memiliki cukup titik data. Maka fluktuasi statistik selalu ada. Lalu saya mempertanyakan, apakah prosedur tune hyperP ini masih benar atau berguna untuk mendapatkan model dengan kinerja yang baik pada set data uji nyata? Jika CV tidak berguna untuk melakukan tugas ini, lalu apa prosedur yang benar?
KevinKim

Periksa apakah kehilangan pelatihan dalam prosedur validasi Anda dapat dibandingkan satu sama lain, yaitu konsisten. Jika tidak, coba pemilihan model / fitur lainnya. Jangan melanjutkan sampai Anda memiliki hak ini. Kemudian lakukan hal yang sama untuk kerugian validasi Anda. Jika ini tidak dapat dibandingkan, maka coba model / pemilihan fitur / metode validasi lainnya. Ketika sudah, lanjutkan ke set tes. Jika kerugian tidak memuaskan Anda di sana, maka tolak prosedur lengkap dan coba yang lain. Jika Anda mulai mengoptimalkan menggunakan set tes, Anda tidak dapat mengandalkan kinerja langsung, karena itu akan menjadi bias ke set tes.
Ytsen de Boer

0

Itu mungkin. Pikirkan skenario sederhana di mana model M1telah mempelajari varian dataset pelatihan Dlebih baik daripada model M2karena parameternya lebih baik disetel. Ini berarti M1berkinerja lebih baik Ddaripada M2.

Tetapi ketika kami mengujinya di set tes T, ada kemungkinan bahwa M2berperforma lebih baik karena M1mungkin overfitting Dsementara M2tidak. Karena itu M1kinerjanya lebih buruk Tdaripada M2.

Ini mungkin disebabkan oleh fakta bahwa Anda melakukan validasi silang pada dataset yang sama dan bukan set validasi. Jika Anda berlatih dan memvalidasi di set yang sama, Anda mungkin akan melewatkan fakta bahwa itu mungkin overfitting. Oleh karena itu selalu lebih baik untuk melatih, memvalidasi dan menguji pada set data yang berbeda. Jadi harus mengalir

  1. Latih model yang berbeda pada set pelatihan yang sama
  2. Divalidasi saat set validasi
  3. Pilih kinerja basis model dengan kinerja terbaik pada set validasi
  4. Gunakan untuk mencetak set tes Anda.

Saya pikir validasi Cross pada set data Dtelah memperhitungkan masalah overfitting. Saya mengerti bahwa jika Anda tidak melakukan validasi silang sama sekali, yaitu, Anda hanya cocok dengan model pada kumpulan data Ddan menyelesaikan masalah optimasi dan mendapatkan parameter yang optimal, maka model ini akan memiliki kesalahan kereta paling sedikit dan sangat mungkin overfitting. Dalam hal ini, saya setuju bahwa optimizedmodel ini akan cenderung berkinerja buruk pada set data uji independen. Tapi saya pikir masalah ini telah ditangani dengan validasi silang pada kumpulan data D, bukan?
KevinKim

1
Khususnya, ketika Anda melakukan 10 kali lipat pada CV D, pertama-tama Anda memotong secara acak Dmenjadi 10 bagian yang berukuran sama, kemudian di setiap iterasi, Anda memasukkan M1 dan M2 pada 9/10 yang sama D, kemudian Anda menerapkannya 1 / 10 dari Duntuk mendapatkan Anda test error, maka Anda ulangi proses ini 10 kali dan setiap kali, set kereta dan set tes berbeda dari iterasi sebelumnya. Kemudian setelah 10 iterasi, Anda rata-rata kesalahan tes untuk M1 dan M2, maka Anda menemukan M1 memiliki lebih sedikit kesalahan pengujian, maka bukankah cukup untuk menyimpulkan bahwa M1 lebih baik daripada M2 dan prosedur ini tampaknya sudah menangani overfit
KevinKim

Ya, cukup untuk menyimpulkan bahwa "M1 lebih baik daripada M2". Tetapi, jika prosedur pemilihan model Anda memilih untuk memilih M1 berdasarkan kinerja validasi , maka pilihan model terbaik Anda (M1 dalam kasus ini) bias ke set validasi. Oleh karena itu perlunya pemeriksaan akhir pada set tes, untuk mendapatkan indikasi seberapa baik kinerjanya pada data langsung.
Ytsen de Boer

@YtsendeBoer Saya akhirnya meyakinkan diri sendiri tentang apa yang Anda katakan. Saya setuju. Tetapi kemudian jika pada set tes independen lain, saya menemukan M1 lebih buruk daripada M2 (ingat M1 lebih baik daripada M2 pada set validasi), maka dalam hal ini, saya harus memilih M1 atau M2 sebagai model terakhir saya untuk melakukan prediksi nyata di masa depan? Jika saya memilih M1, maka jelas hasil tes terhadap M1. Tetapi jika saya memilih M2, bukankah M2 juga overfitting pada set data uji khusus ini? yaitu, cara yang sama seperti overfitting M1 pada set validasi tertentu?
KevinKim

Ya, itulah mengapa Anda tidak harus melakukan pemilihan model pada set tes. Anda telah memilih M1 dalam prosedur pemilihan model Anda menggunakan set validasi. Kemudian Anda menjalankan M1 pada set tes dan memutuskan apakah hasilnya cukup baik. Lupakan M2 pada titik ini, bahkan jika itu berkinerja lebih baik pada set tes lain. Namun, jika Anda memiliki keraguan tentang hasil Anda, maka Anda harus menambahkan "set tes independen lainnya" ke seluruh data Anda (lebih banyak data lebih baik), mulai prosedur lagi dan patuhi itu .
Ytsen de Boer

0

Teori di balik validasi silang (v-fold cross validation) telah dibahas dalam banyak makalah. Ada bukti untuk itu dalam satu set makalah yang diterbitkan 2003-2007. Silakan merujuk ke: - pemilih oracle. 2006 - pelajar super 2007 - pelajar super dalam prediksi 2010 - validasi silang terpadu 2003

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.