Mengapa banyak pilihan K menurunkan nilai validasi silang saya?

11

Bermain-main dengan Boston Housing Dataset dan RandomForestRegressor(parameter w / default) di scikit-belajar, saya melihat sesuatu yang aneh: skor validasi silang menurun ketika saya meningkatkan jumlah lipatan di atas 10. Strategi validasi silang saya adalah sebagai berikut:

cv_met = ShuffleSplit(n_splits=k, test_size=1/k)
scores = cross_val_score(est, X, y, cv=cv_met)

... di mana num_cvsbervariasi. Saya mengatur test_sizeuntuk 1/num_cvsmencerminkan perilaku kereta / uji split ukuran k-fold CV. Pada dasarnya, saya menginginkan sesuatu seperti CV k-fold, tetapi saya juga membutuhkan keacakan (karenanya ShuffleSplit).

Percobaan ini diulang beberapa kali, dan skor rata-rata dan standar deviasi kemudian diplot.

Area lingkaran ~ K dalam validasi silang K-fold

(Perhatikan bahwa ukuran kditunjukkan oleh luas lingkaran; standar deviasi ada pada sumbu Y.)

Secara konsisten, peningkatan k(dari 2 menjadi 44) akan menghasilkan peningkatan skor singkat, diikuti dengan penurunan yang stabil seiring kpeningkatan lebih lanjut (melampaui ~ 10 kali lipat)! Jika ada, saya akan mengharapkan lebih banyak data pelatihan untuk mengarah pada peningkatan skor kecil!

Memperbarui

Mengubah kriteria penilaian berarti kesalahan mutlak menghasilkan perilaku yang saya harapkan: skor meningkat dengan peningkatan jumlah lipatan dalam K-fold CV, daripada mendekati 0 (seperti dengan default, ' r2 '). Pertanyaannya tetap mengapa metrik penilaian standar menghasilkan kinerja yang buruk di kedua metrik rata-rata dan STD untuk peningkatan jumlah lipatan.

Brian Bien
sumber
Adakah rekaman duplikat di lipatan Anda? Ini mungkin karena overfitting .
Memiliki QUIT - Anony-Mousse
1
@ Anony-Mousse Tidak, karena dataset Perumahan Boston tidak memiliki catatan duplikat dan pengambilan sampel ShuffleSplit tidak menyebabkan catatan duplikat.
Brian Bien
4
Juga, tingkatkan plot Anda. Gunakan bilah kesalahan, untuk menunjukkan rata-rata, + - stddev, dan min / maks. Letakkan k di sumbu lainnya.
Memiliki QUIT - Anony-Mousse
1
Saya tidak berpikir bahwa lebih banyak contoh pelatihan meningkatkan kemungkinan overfitting. Saya merencanakan kurva pembelajaran dengan dataset ini, lagi-lagi menggunakan ShuffleSplit (n_splits = 300 dengan berbagai ukuran tes) dan melihat akurasi yang meningkat secara konsisten karena lebih banyak contoh pelatihan yang tersedia.
Brian Bien
1
maaf, Anda benar, lebih banyak lebih baik dan terbaik adalah 1. Tetapi Anda tidak memiliki masalah ini jika Anda menggunakan mean kuadrat atau kesalahan absolut. Jadi itu harus melakukan sesuatu dengan istilah kesalahan
rep_ho

Jawaban:

1

skor r ^ 2 tidak terdefinisi ketika diterapkan pada sampel tunggal (mis. CV cuti-keluar-keluar).

r ^ 2 tidak baik untuk evaluasi set tes kecil: ketika itu digunakan untuk mengevaluasi set tes yang cukup-kecil, skor bisa jauh ke negatif meskipun prediksi yang baik.

Diberikan sampel tunggal, prediksi yang baik untuk domain tertentu mungkin tampak mengerikan:

from sklearn.metrics import r2_score
true = [1]
predicted = [1.01] # prediction of a single value, off by 1%
print(r2_score(true, predicted))
# 0.0

Tambah ukuran set tes (menjaga akurasi prediksi tetap sama), dan tiba-tiba skor r ^ 2 tampak hampir sempurna:

true = [1, 2, 3]
predicted = [1.01, 2.02, 3.03]
print(r2_score(true, predicted))
# 0.9993

Diambil ke ekstrim lain, jika ukuran tes adalah 2 sampel, dan kami kebetulan mengevaluasi 2 sampel yang berdekatan satu sama lain secara kebetulan, ini akan memiliki dampak besar pada skor r ^ 2, bahkan jika prediksi cukup baik :

true = [20.2, 20.1] # actual target values from the Boston Housing dataset
predicted = [19, 21]
print(r2_score(true, predicted))
# -449.0
Brian Bien
sumber