Saya menggunakan model SVM untuk melakukan peramalan jangka pendek dari polutan udara. Untuk melatih model baru, saya perlu menemukan metaparameter yang sesuai untuk model SVM (maksud saya C, gamma, dan sebagainya).
Dokumentasi Libsvm (dan banyak buku lain yang telah saya baca) menyarankan menggunakan pencarian kotak untuk menemukan parameter ini - jadi saya pada dasarnya melatih model untuk setiap kombinasi parameter ini dari set tertentu dan memilih model terbaik.
Apakah ada cara yang lebih baik untuk menemukan metaparameter yang optimal (atau hampir optimal)? Bagi saya ini terutama masalah waktu perhitungan - pencarian satu grid untuk masalah ini memakan waktu sekitar dua jam (setelah saya melakukan beberapa optimasi).
Kelebihan pencarian kotak:
- Ini dapat dengan mudah diparalelkan - jika Anda memiliki 20 CPU, itu akan berjalan 20 kali lebih cepat, memparalelkan metode lain lebih sulit
- Anda memeriksa sebagian besar ruang metaparameter, jadi jika ada solusi yang baik, Anda akan menemukannya.
Jika Anda membuat asumsi bahwa ada fungsi yang relatif mulus yang mendasari grid parameter, maka ada hal-hal tertentu yang dapat Anda lakukan. Sebagai contoh, satu heuristik sederhana adalah mulai dengan kisi parameter yang sangat kasar, dan kemudian menggunakan kisi yang lebih halus di sekitar yang terbaik dari pengaturan parameter dari kisi kasar.
Ini cenderung bekerja cukup baik dalam praktik, dengan peringatan tentu saja. Pertama adalah bahwa ruang belum tentu mulus, dan mungkin ada optima lokal . Kotak kasar mungkin benar-benar ketinggalan ini dan Anda bisa berakhir dengan solusi yang kurang optimal. Perhatikan juga bahwa jika Anda memiliki sampel yang relatif sedikit dalam set penahan Anda, maka Anda mungkin memiliki banyak pengaturan parameter yang memberikan skor yang sama (kesalahan atau metrik apa pun yang Anda gunakan). Ini bisa sangat bermasalah jika Anda melakukan pembelajaran multi-kelas (misalnya menggunakan one-versus-all ), dan Anda hanya memiliki beberapa contoh dari setiap kelas dalam set hold-out Anda. Namun, tanpa menggunakan teknik optimasi nonlinier yang buruk, ini mungkin berfungsi sebagai titik awal yang baik.
Ada serangkaian referensi yang bagus di sini . Di masa lalu saya telah mengambil pendekatan yang Anda dapat memperkirakan kisaran hyperparameters kernel yang baik dengan memeriksa kernel (misalnya dalam kasus kernel RBF, memastikan bahwa histogram dari nilai-nilai kernel memberikan penyebaran nilai yang baik, daripada condong ke 0 atau 1 - dan Anda bisa melakukan ini secara otomatis juga tanpa terlalu banyak bekerja), artinya Anda dapat mempersempit kisaran sebelum memulai. Anda kemudian dapat memfokuskan pencarian Anda pada parameter lain seperti parameter regularisasi / kapasitas. Namun tentu saja ini hanya berfungsi dengan kernel yang sudah dikomputasi, walaupun Anda bisa memperkirakannya pada subset poin acak jika Anda tidak ingin menggunakan kernel yang sudah dikomputasi, dan saya pikir pendekatan itu juga akan baik-baik saja.
sumber
Saya menggunakan anil simulasi untuk mencari parameter.
Perilaku ini diatur oleh beberapa parameter:
k
adalah konstanta Boltzmann.T_max
adalah suhu awal Anda.T_min
adalah ambang batas akhir Anda.mu_T
(μ
) adalah seberapa banyak Anda menurunkan suhu (T->T/μ
)i
adalah jumlah iterasi pada setiap suhuz
adalah ukuran langkah - Anda menentukan apa artinya itu. Saya secara acak pindah ke dalamold*(1±z)
.p = e^{-(E_{i+1} - E_i)/(kT)}
.T->T/μ
setiapi
iterasi sampai Anda menekanT_min
.Bermain-main dengan parameter sedikit dan Anda harus dapat menemukan set yang berfungsi dengan baik dan cepat.
Dan Perpustakaan Ilmiah GNU termasuk anil simulasi.
sumber
Jika ada yang tertarik di sini adalah beberapa pemikiran saya tentang masalah ini:
sumber
Jika kernelnya radial, Anda bisa menggunakan heuristik ini untuk mendapatkan yang tepatσ - Optimasi C lebih mudah.
sumber