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
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.
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.
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.
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.
sumber
Ya kamu harus. Tentu dengan syarat itu
Saya dapat memikirkan dua alasan:
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.
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.
sumber
Itu mungkin. Pikirkan skenario sederhana di mana model
M1
telah mempelajari varian dataset pelatihanD
lebih baik daripada modelM2
karena parameternya lebih baik disetel. Ini berartiM1
berkinerja lebih baikD
daripadaM2
.Tetapi ketika kami mengujinya di set tes
T
, ada kemungkinan bahwaM2
berperforma lebih baik karenaM1
mungkin overfittingD
sementaraM2
tidak. Karena ituM1
kinerjanya lebih burukT
daripadaM2
.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
sumber
D
telah memperhitungkan masalah overfitting. Saya mengerti bahwa jika Anda tidak melakukan validasi silang sama sekali, yaitu, Anda hanya cocok dengan model pada kumpulan dataD
dan 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 bahwaoptimized
model ini akan cenderung berkinerja buruk pada set data uji independen. Tapi saya pikir masalah ini telah ditangani dengan validasi silang pada kumpulan dataD
, bukan?D
, pertama-tama Anda memotong secara acakD
menjadi 10 bagian yang berukuran sama, kemudian di setiap iterasi, Anda memasukkan M1 dan M2 pada 9/10 yang samaD
, kemudian Anda menerapkannya 1 / 10 dariD
untuk mendapatkan Andatest 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 overfitTeori 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
sumber