Saat ini saya sedang bereksperimen dengan gridsearch untuk melatih mesin vektor dukungan. Saya mengerti bahwa, jika saya memiliki parameter gamma dan C, fungsi R tune.svm melakukan validasi silang 10 kali lipat untuk semua kombinasi dari 2 parameter ini.
Karena saya tidak tahu bagaimana memulainya, saya mencoba untuk mendapatkan beberapa informasi tentangnya, misalnya wikipedia 2 menyarankan nilai-nilai yang tidak linear, misalnya C dalam kisaran {10, 100, 1000}.
Sejauh ini saya menggunakan contoh-contoh dari tautan wikipedia kedua saya, yaitu:
gammas = 2^(-15:3)
costs = 2^(-5:15)
Yang menghasilkan 399 kombinasi.
Ini sangat, sangat lama (~ 2000 sampel). Sebagai contoh untuk kernel "radial" hasil terbaik saya adalah gamma = 0,5 dan biaya = 2.
Tidak bisakah saya mendapatkan hasil yang sama jika saya hanya menggunakan nilai seperti (1, 2, 3, 4, ... 10) untuk biaya dan (0, 0,5, 1, 1,5, 2) untuk gammas? Saya tahu contoh ini dibangun karena saya sudah tahu hasilnya.
Pertanyaan saya:
Tapi mengapa skala eksponensial ini?
Ada begitu banyak nilai antara 0 dan 1 yang saya pikir ini buang-buang waktu perhitungan dan hanya beberapa angka yang sangat besar yang tidak dapat menemukan hasil yang sangat tepat pula. Itu hanya masuk akal bagi saya jika ini digunakan untuk menemukan rentang yang lebih kecil, katakanlah kita kemudian tahu biaya terbaik adalah 2 ^ 3 dan kemudian kita mencari di sekitar itu. Tapi itu tidak disebutkan di mana dilakukan seperti itu.
Jawaban:
Alasan untuk grid eksponensial adalah bahwa baik C dan gamma adalah parameter skala yang bertindak multiplikasi, sehingga penggandaan gamma kemungkinan memiliki efek yang kira-kira sama besar (tetapi di arah lain) dengan membagi dua. Ini berarti bahwa jika kita menggunakan kisi-kisi yang nilainya meningkat secara eksponensial, terdapat kira-kira jumlah "informasi" yang sama tentang hiper-parameter yang diperoleh dengan evaluasi kriteria pemilihan model pada setiap titik kisi.
Saya biasanya mencari di grid berdasarkan kekuatan integer 2, yang tampaknya bekerja dengan cukup baik (saya sedang mengerjakan sebuah makalah tentang mengoptimalkan pencarian grid - jika Anda menggunakan grid yang terlalu bagus, Anda bisa berakhir terlalu pas dengan kriteria pemilihan model , jadi kisi yang cukup kasar ternyata bagus untuk generalisasi dan juga biaya komputasi.).
Mengenai rentang yang luas, sayangnya nilai-nilai parameter-hiper optimal tergantung pada sifat masalah, dan pada ukuran dataset dan tidak dapat ditentukan a-priori. Alasan untuk grid besar yang tampaknya boros adalah untuk memastikan nilai yang baik dapat ditemukan secara otomatis, dengan probabilitas tinggi.
Jika biaya komputasi adalah masalah, maka daripada menggunakan pencarian grid, Anda dapat menggunakan algoritma simpleks Nelder-Mead untuk mengoptimalkan kesalahan validasi silang. Ini adalah algoritma pengoptimalan yang tidak memerlukan informasi gradien, sehingga cukup mudah digunakan untuk masalah apa pun di mana pencarian grid saat ini digunakan. Saya bukan pengguna R, tetapi Nelder-Mead diimplementasikan dalam R via
optim
.sumber
Ini disebut masalah "penyetelan parameter" untuk SVM. Salah satu pendekatan termudah adalah mengambil median masing-masing untuk tingkat akurasi prediksi kelas terbesar yang diperoleh saat Anda melalui lipatan CV.
Juga, sebagai aturan praktis, gunakan classifier yang lebih sederhana untuk menentukan apakah data Anda terpisah secara linear. Jika k-tetangga terdekat (kNN) atau regresi linier bekerja lebih baik, maka Anda tidak harus menggunakan pendekatan (komputasi) yang lebih mahal seperti SVM. SVM dapat dengan mudah digunakan secara berlebihan, jadi pastikan Anda mengevaluasi regresi linier, kNN, analisis diskriminan linier, hutan acak, dll.
sumber