Implementasi SVM tercepat

16

Lebih banyak pertanyaan umum. Saya menjalankan SVF rbf untuk pemodelan prediktif. Saya pikir program saya saat ini jelas perlu sedikit mempercepat. Saya menggunakan scikit belajar dengan pencarian kasar ke grid + validasi silang.

Setiap menjalankan SVM membutuhkan waktu sekitar satu menit, tetapi dengan semua iterasi, saya masih menemukannya terlalu lambat. Dengan asumsi saya akhirnya melakukan multi thread bagian validasi silang pada beberapa core, ada rekomendasi untuk mempercepat program saya? Adakah implementasi SVM yang lebih cepat? Saya pernah mendengar tentang beberapa SVM GPU, tetapi belum banyak menggali. Adakah pengguna dan apakah lebih cepat?

tomas
sumber
1
SGDClassifier di scikit-learn sangat cepat, tetapi untuk SVM linear. Anda mungkin bertanya pada scikit-learn guys, juga menambahkan tag scikit-learn.
denis
Kernel SVM non-linear pasti akan lambat. Mungkin Anda harus mulai bermain dengan model linier (lihat Vowpal Wabbit) dan kemudian beralih ke non-linear. Anda bahkan bisa mendapatkan non-linearitas dengan membuat fitur yang lebih rumit dengan model linier. Cukup sering model non-linear menghasilkan beberapa peningkatan kinerja tambahan dengan biaya komputasi yang besar. Tidak ada yang menentang SVM kernel non-linear tetapi hanya untuk diingat, dari sudut pandang praktis.
Vladislavs Dovgalecs
1
Anda dapat mempercepat dengan menggunakan pustaka tuning khusus untuk pencarian hyperparameter, yang jauh lebih efisien daripada pencarian grid (mis. Membutuhkan pengujian jauh lebih sedikit set hyperparameter). Contoh perpustakaan tuning termasuk Optunity dan Hyperopt.
Marc Claesen

Jawaban:

16

Algoritma Google Sofia mengandung implementasi SVM linear yang sangat cepat. Itu salah satu SVM tercepat di luar sana, tapi saya pikir itu hanya mendukung klasifikasi, dan hanya mendukung SVM linear.

Bahkan ada paket R !

Zach
sumber
Tautan Anda sekarang mengatakan "paket 'RSofia' telah dihapus dari repositori CRAN." Ada yang tahu kenapa?
James Hirschorn
@JamesHirschorn Pengembang mungkin berhenti mempertahankannya. Anda dapat menginstalnya dari arsip CRAN.
Zach
10

Speedup termudah yang akan Anda dapatkan adalah menjalankan validasi silang secara paralel. Secara pribadi, saya suka paket caret di R , yang menggunakan foreach sebagai backend. Itu membuatnya sangat mudah untuk mengolah validasi silang dan pencarian grid ke beberapa core atau beberapa mesin.

Caret dapat menangani banyak model berbeda, termasuk rbf SVMs:

library(caret)
library(doMC)
registerDoMC()
model <-  train(Species ~ ., data = iris, method="svmRadial", 
    trControl=trainControl(method='cv', number=10))
> confusionMatrix(model)
Cross-Validated (10 fold) Confusion Matrix 

(entries are percentages of table totals)

            Reference
Prediction   setosa versicolor virginica
  setosa       32.4        0.0       0.0
  versicolor    0.0       30.9       2.0
  virginica     0.9        2.4      31.3

Perhatikan bahwa pustaka doMC () hanya tersedia di mac dan linux, itu harus dijalankan dari baris perintah, bukan dari GUI, dan itu memecah model apa pun dari RWeka. Juga mudah untuk menggunakan cluster MPI atau SNOW sebagai backend paralel, yang tidak memiliki masalah ini.

Zach
sumber
Terima kasih, Zach. Saya percaya scikits juga memiliki cara menjalankan validasi silang secara paralel yang merupakan apa yang saya rencanakan untuk dilakukan. Kecuali itu, ada saran lain tentang speedup? Terima kasih.
tomas
@ Danjeharry: validasi silang paralel benar-benar buah yang menggantung rendah di sini, dan saya sangat menyarankan Anda menjelajahi yang pertama. Selain itu, saya tidak tahu banyak tentang mempercepat SVM secara khusus. Jika Anda dapat menemukan algoritma SVM paralel, itu mungkin ide yang bagus juga. Berapa banyak baris / kolom data yang Anda gunakan untuk berlatih?
Zach
Terima kasih Zach saya akan melihat paralel cv. Saya melakukan sekitar 650 atribut dan 5000 contoh.
tomas
4

Saya menyadari ini adalah pertanyaan yang cukup lama, tetapi juga mungkin (tergantung pada ukuran dataset Anda, itu bisa lebih atau kurang efektif) untuk menggunakan pendekatan dimensi rendah dari peta fitur kernel dan kemudian menggunakannya dalam linear-SVM. Lihat http://scikit-learn.org/stable/modules/kernel_approximation.html

Matthew Saltz
sumber
2

Lihatlah modul multiprosesor Python . Itu membuat paralelisasi hal-hal sangat mudah dan sempurna untuk validasi silang.

bayerj
sumber
2

R memiliki paket svm akselerasi GPU yang hebat , rpusvm , dibutuhkan ~ 20 detik untuk melatih sampel 20K * 100 dimensi, dan saya menemukan bahwa CPU tidak pernah kelebihan beban olehnya, jadi ia menggunakan GPU secara efisien. Namun, itu membutuhkan GPU NVIDIA.

Leo
sumber
1

Peringatan: Ini adalah plug yang tidak tahu malu.

Pertimbangkan DynaML sebagai pustaka ML berbasis Scala yang sedang saya kerjakan. Saya telah mengimplementasikan LS-SVM berbasis Kernel (Least Squares Support Vector Machines) bersama dengan tuning Kernel otomatis, menggunakan pencarian grid atau Coupled Simulated Annealing.

http://mandar2812.github.io/DynaML/

mandar2812
sumber