Metode cepat untuk menemukan metaparameter terbaik SVM (yang lebih cepat daripada pencarian kisi)

17

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.
jb.
sumber

Jawaban:

10

Kelemahan dari pencarian kotak adalah bahwa runtime tumbuh secepat produk dari jumlah opsi untuk setiap parameter.

Berikut ini entri di blog Alex Smola yang terkait dengan pertanyaan Anda

Berikut ini kutipannya:

[...] pilih, katakan 1000 pasangan (x, x ') secara acak dari dataset Anda, hitung jarak semua pasangan tersebut dan ambil median, 0,1 dan 0,9 kuantil. Sekarang pilih λ untuk menjadi kebalikan dari ketiga angka ini. Dengan sedikit validasi silang Anda akan mengetahui yang mana dari ketiganya yang terbaik. Dalam kebanyakan kasus, Anda tidak perlu mencari lebih jauh.

Saya belum mencoba ini sendiri, tetapi sepertinya ini menjanjikan.

carlosdc
sumber
Bagaimana ini terkait dengan pertanyaan? Pertanyaannya adalah tentang menemukan parameter terbaik untuk model SVM (dengan cara cepat).
Roronoa Zoro
2
@Roronoa Zoro: dan begitu juga jawabannya. Ini menjelaskan bagaimana menemukan parameter untuk fungsi berbasis radial berbasis SVM (C dan \ lambda di posting blog Smola) dalam 3 | Cs | waktu yang bertentangan dengan | \ gammas || Cs | seperti itu dilakukan dalam kasus pencarian kotak.
carlosdc
Hanya untuk mengklarifikasi untuk memastikan saya memahami heuristik, pada dasarnya Anda hanya menggambar secara acak 1000 poin data dari dataset untuk pelatihan SVM, kemudian mengambil kebalikan dari .1, .9 kuantil dan median dan mereka cenderung baik kandidat untuk gamma yang cocok?
tomas
6

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.

tdc
sumber
5

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 suhu
  • zadalah ukuran langkah - Anda menentukan apa artinya itu. Saya secara acak pindah ke dalam old*(1±z).
  1. Ambil titik awal (set nilai parameter).
  2. Dapatkan energi untuk itu (seberapa cocok dengan data Anda; saya menggunakan nilai chi-squared).
  3. Lihat ke arah acak ("ambil langkah").
    • Jika energi lebih rendah dari titik Anda saat ini, pindah ke sana.
    • Jika lebih tinggi, pindah ke sana dengan probabilitas p = e^{-(E_{i+1} - E_i)/(kT)}.
  4. Ulangi, sesekali turunkan T->T/μsetiap iiterasi sampai Anda menekan T_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.

Kevin
sumber
4

Jika ada yang tertarik di sini adalah beberapa pemikiran saya tentang masalah ini:

  • Seperti yang disarankan oleh @tdc, saya melakukan pencarian jaringan kasar / halus. Ini memperkenalkan dua masalah:
    • Dalam kebanyakan kasus saya akan mendapatkan set set metaparameter yang baik yang memiliki parameter yang sangat berbeda --- saya menafsirkannya dengan cara ini bahwa parameter ini adalah solusi optimal, tetapi untuk memastikan saya harus memeriksa semua kisi-kisi dekat semua parameter yang baik ini ( itu akan memakan banyak waktu), jadi untuk saat ini saya hanya memeriksa set taruhan metaparameter.
    • Dalam kebanyakan kasus pencarian baik-baik saja tidak meningkatkan kinerja SVM (itu mungkin karena fakta bahwa saya hanya memeriksa titik tetangga terbaik dari grid kasar.
  • Saya mengamati perilaku bahwa sebagian besar waktu komputasi dihabiskan untuk set metaparemeter yang tidak akan menghasilkan hasil yang baik, misalnya: sebagian besar set metaparameter akan dihitung dalam waktu kurang dari 15 detik (dan yang terbaik dari mereka memiliki tingkat kesalahan 15%), dan beberapa memerlukan waktu 15 menit ( dan sebagian besar memiliki tingkat kesalahan lebih besar dari 100%). Jadi ketika melakukan pencarian kotak saya membunuh poin yang membutuhkan lebih dari 30 detik untuk menghitung dan menganggap mereka memiliki kesalahan tak terbatas.
  • Saya menggunakan multiprosesor (yang cukup sederhana)
jb.
sumber
1

Jika kernelnya radial, Anda bisa menggunakan heuristik ini untuk mendapatkan yang tepatσ - Optimasi C lebih mudah.


sumber
Tautannya sudah mati. Apa heuristik yang kamu referensikan?
Aalawlx