SVM menggunakan scikit belajar berjalan tanpa henti dan tidak pernah menyelesaikan eksekusi

76

Saya mencoba menjalankan SVR menggunakan scikit belajar (python) pada dataset pelatihan yang memiliki 595605 baris dan 5 kolom (fitur) dan dataset uji memiliki 397070 baris. Data telah pra-diproses dan diatur.

Saya berhasil menjalankan contoh pengujian tetapi saat mengeksekusi menggunakan dataset saya dan membiarkannya berjalan selama lebih dari satu jam, saya masih tidak dapat melihat output atau penghentian program. Saya telah mencoba menjalankan menggunakan IDE yang berbeda dan bahkan dari terminal tetapi itu tampaknya tidak menjadi masalah. Saya juga telah mencoba mengubah nilai parameter 'C' dari 1 ke 1e3.

Saya menghadapi masalah serupa dengan semua implementasi svm menggunakan scikit.

Apakah saya tidak cukup menunggu untuk menyelesaikannya? Berapa lama waktu yang dibutuhkan untuk eksekusi ini?

Dari pengalaman saya seharusnya tidak perlu lebih dari beberapa menit.

Ini adalah konfigurasi sistem saya: Ubuntu 14.04, RAM 8GB, banyak memori bebas, prosesor 4th gen i7

tejaskhot
sumber
Bisakah Anda memberikan kode? Juga, apakah pelatihan atau pengujian membutuhkan banyak waktu? Bagaimana dengan set data pelatihan / pengujian yang lebih kecil?
berteman
Saya hanya membaca data dari file csv ke dalam kerangka data panda dan meneruskannya ke fungsi belajar scikit. Itu saja! Memberikan kode tidak akan membantu di sini
tejaskhot
6
Implementasi SVM sklearn menyiratkan setidaknya 3 langkah: 1) membuat objek SVR, 2) menyesuaikan model, 3) memprediksi nilai. Langkah pertama menjelaskan kernel yang digunakan, yang membantu untuk memahami proses internal jauh lebih baik. Langkah kedua dan ketiga sangat berbeda, dan kita perlu tahu setidaknya mana dari mereka yang membutuhkan waktu lama. Jika ini pelatihan, maka mungkin tidak apa-apa, karena belajar kadang-kadang lambat. Jika sedang menguji, maka mungkin ada bug, karena pengujian dalam SVM sangat cepat. Selain itu, mungkin pembacaan CSV yang memakan waktu lama dan tidak SVM sama sekali. Jadi semua detail ini mungkin penting.
berteman
saya menghadapi masalah yang sama juga melalui svm tetapi adakah yang bisa memberi tahu saya berapa banyak waktu yang dibutuhkan setelah normalisasi?
kashyap kitchlu

Jawaban:

70

SVM kernel membutuhkan perhitungan fungsi jarak antara setiap titik dalam dataset, yang merupakan biaya dominan dari . Penyimpanan jarak adalah beban pada memori, jadi mereka dihitung ulang dengan cepat. Untungnya, hanya poin terdekat dari batas keputusan yang paling dibutuhkan. Jarak yang sering dihitung disimpan dalam cache. Jika cache dihancurkan maka waktu yang berjalan meledak ke .O ( n fitur × n 3 pengamatan )O(nfeatures×nobservations2)O(nfeatures×nobservations3)

Anda dapat meningkatkan cache ini dengan menggunakan SVR sebagai

model = SVR(cache_size=7000)

Secara umum, ini tidak akan berhasil. Namun semuanya tidak hilang. Anda dapat melakukan subsampel data dan menggunakan yang lainnya sebagai set validasi, atau Anda dapat memilih model yang berbeda. Di atas kisaran pengamatan 200.000, adalah bijaksana untuk memilih pembelajar linier.

Kernel SVM dapat diperkirakan, dengan memperkirakan matriks kernel dan mengumpankannya ke SVM linier. Ini memungkinkan Anda untuk menukar antara akurasi dan kinerja dalam waktu linier.

Cara populer untuk mencapai hal ini adalah dengan menggunakan 100 atau lebih pusat cluster yang ditemukan oleh kmeans / kmeans ++ sebagai dasar dari fungsi kernel Anda. Fitur turunan baru kemudian dimasukkan ke dalam model linier. Ini bekerja sangat baik dalam prakteknya. Alat seperti sophia-ml dan vowpal wabbit adalah cara Google, Yahoo dan Microsoft melakukan ini. Input / output menjadi biaya yang mendominasi bagi pembelajar linier sederhana.

Dalam kelimpahan data, model nonparametrik melakukan kira-kira sama untuk sebagian besar masalah. Pengecualian adalah input terstruktur, seperti teks, gambar, seri waktu, audio.

Bacaan lebih lanjut

Jessica Mick
sumber
16

SVM memecahkan masalah optimasi urutan kuadratik.

Saya tidak punya apa-apa untuk ditambahkan yang belum dikatakan di sini. Saya hanya ingin memposting tautan halaman sklearn tentang SVC yang menjelaskan apa yang sedang terjadi:

Implementasinya didasarkan pada libsvm. Kompleksitas waktu fit lebih dari kuadratik dengan jumlah sampel yang membuatnya sulit untuk diukur ke dataset dengan lebih dari sepasang 10.000 sampel.

Jika Anda tidak ingin menggunakan kernel, dan SVM linear sudah mencukupi, ada LinearSVR yang jauh lebih cepat karena menggunakan pendekatan optimasi ala regresi linier. Anda harus menormalkan data Anda, jika Anda belum melakukannya, karena itu berlaku regularisasi terhadap koefisien intersepsi, yang mungkin bukan yang Anda inginkan. Ini berarti jika rata-rata data Anda jauh dari nol, itu tidak akan dapat menyelesaikannya dengan memuaskan.

Yang juga bisa Anda gunakan adalah penurunan gradien stokastik untuk menyelesaikan masalah optimisasi. Sklearn memiliki fitur SGDRegressor . Anda harus menggunakan loss='epsilon_insensitive'untuk memiliki hasil yang mirip dengan SVM linier. Lihat dokumentasi. Saya hanya akan menggunakan gradient descent sebagai pilihan terakhir karena itu menyiratkan banyak penyesuaian hyperparameters untuk menghindari terjebak dalam minima lokal. Gunakan LinearSVRjika Anda bisa.

Ricardo Cruz
sumber
Saya punya dataset dengan banyak baris. SVC mulai terlalu lama bagi saya tentang sekitar 150 ribu baris data. Saya menggunakan saran Anda dengan LinearSVR dan sejuta baris hanya membutuhkan beberapa menit. PS juga menemukan classifier LogisticRegression menghasilkan hasil yang sama seperti LinearSVR (dalam kasus saya) dan bahkan lebih cepat.
jeffery_the_wind
8

Apakah Anda memasukkan penskalaan dalam langkah pra-pemrosesan Anda? Saya memiliki masalah ini ketika menjalankan SVM saya. Dataset saya ~ 780.000 sampel (baris) dengan 20 fitur (col). Set pelatihan saya ~ 235k sampel. Ternyata saya hanya lupa untuk menskala data saya! Jika ini masalahnya, coba tambahkan bit ini ke kode Anda:

skala data ke [-1,1]; meningkatkan kecepatan SVM:

dari sklearn.preprocessing impor
penskalaan MinMaxScaler = MinMaxScaler (fitur_range = (- 1,1)). fit (X_train)
X_train = scaling.transform (X_train)
X_test = scaling.transform (X_test)

Shelby Matlock
sumber
2
Adakah yang bisa menjelaskan mengapa ini mempercepat kesesuaian SVM?
lppier
1
Apakah ada alasan mengapa Anda memilih MinMaxScaler daripada yang lain? StandardScaler misalnya?
raspi
@Ippier: pada dasarnya Anda mengurangi ruang batas yang mungkin untuk setiap opsi dengan cara yang membuat tingkat upaya lebih sedikit untuk mesin Anda.
seperti
7

Dengan set data yang begitu besar saya pikir Anda akan lebih baik menggunakan jaringan saraf, pembelajaran mendalam, hutan acak (mereka sangat bagus), dll.

Seperti disebutkan dalam balasan sebelumnya, waktu yang diambil sebanding dengan kekuatan ketiga dari jumlah sampel pelatihan. Bahkan waktu prediksi adalah polinomial dalam hal jumlah vektor uji.

Jika Anda benar-benar harus menggunakan SVM maka saya akan merekomendasikan menggunakan GPU mempercepat atau mengurangi ukuran dataset pelatihan. Coba dengan sampel (mungkin 10.000 baris) data terlebih dahulu untuk melihat apakah itu bukan masalah dengan format data atau distribusi.

Seperti disebutkan dalam balasan lain, kernel linear lebih cepat.

Leela Prabhu
sumber
3

Saya baru-baru ini mengalami masalah yang sama karena lupa untuk skala fitur dalam dataset saya yang sebelumnya digunakan untuk melatih jenis model ensemble. Kegagalan untuk menskala data mungkin merupakan penyebab kemungkinan seperti yang ditunjukkan oleh Shelby Matlock. Anda dapat mencoba berbagai scaler yang tersedia di sklearn, seperti RobustScaler :

from sklearn.preprocessing import RobustScaler scaler = RobustScaler() X = scaler.fit_transfrom(X)

X sekarang diubah / diskalakan dan siap untuk dimasukkan ke model yang Anda inginkan.

Dutse I
sumber
2

Ini masuk akal. IIUC, kecepatan pelaksanaan operasi dukungan vektor terikat oleh jumlah sampel, bukan dimensi. Dengan kata lain, itu dibatasi oleh waktu CPU dan bukan RAM. Saya tidak yakin persis berapa banyak waktu yang diperlukan, tetapi saya menjalankan beberapa tolok ukur untuk mengetahuinya.

Jaidev Deshpande
sumber
1

Biarkan berjalan semalaman atau lebih baik selama 24 jam. Apa utilisasi CPU Anda? Jika tidak ada core yang berjalan pada 100% maka Anda memiliki masalah. Mungkin dengan memori. Sudahkah Anda memeriksa apakah dataset Anda cocok dengan 8GB? Sudahkah Anda mencoba SGDClassifier? Ini adalah salah satu yang tercepat di sana. Layak untuk dicoba terlebih dahulu berharap itu selesai dalam satu jam atau lebih.

Diego
sumber
SGDClassifiertidak mendukung kernel. Jika OP menginginkan linear SVM, maka saya akan merekomendasikan terlebih dahulu mencoba LinearSVR. Ini jauh lebih cepat daripada SVRkarena memecahkan masalah menggunakan perpustakaan regresi linier, dan minimum global dijamin (tidak seperti gradient descente).
Ricardo Cruz
Hargai komentar Anda. Bisakah Anda menguraikan mengapa dukungan kernel merupakan masalah?
Diego
Dari dokumentasi , The loss function to be used. Defaults to ‘hinge’, which gives a linear SVM.Hal yang sama untuk SGDRegressor. SGDRegressorsetara dengan menggunakan SVR(kernel='linear'). Jika itu yang diinginkan OP, itu hebat. Saya mendapat kesan dia ingin menggunakan SVM dengan kernel. Jika bukan itu masalahnya, saya akan merekomendasikan dia pertama kali mencoba LinearSVR.
Ricardo Cruz
1

Cobalah menormalkan data menjadi [-1,1]. Saya menghadapi masalah yang sama dan pada normalisasi semuanya bekerja dengan baik. Anda dapat menormalkan data dengan mudah menggunakan:

from sklearn import preprocessing X_train = preprocessing.scale(X_train) X_test = preprocessing.scale(X_test)

Sujay_K
sumber
@Archie Ini adalah jawaban untuk pertanyaan, bukan pertanyaan.
timleathart
1

Saya mengalami masalah ini dan cache_sizeseperti yang orang lain sarankan tidak membantu sama sekali. Anda dapat melihat pos ini dan yang ini sebagai kontributor utama menyarankan agar Anda mengubah kode secara manual.

Seperti yang Anda tahu, SVCdan SVRmasalah optimasi dan mereka berhenti ketika margin error begitu sedikit di mana optimasi lebih lanjut adalah sia-sia. Jadi ada parameter lain di sini max_iter,, di mana Anda dapat mengatur berapa banyak iterasi yang harus dilakukan.

Saya telah menggunakan sklearnpython dan e1071dalam R dan R jauh lebih cepat untuk mendapatkan hasil tanpa mengatur max_iterdan sklearnmemakan waktu 2-4 kali lebih lama. Satu-satunya cara saya bisa menurunkan waktu komputasi untuk python adalah menggunakan max_iter. Hal ini relatif terhadap kompleksitas model, sejumlah fitur, kernel dan hyperparameters, tapi untuk dataset kecil saya digunakan untuk sekitar 4000 datapoint dan max_iteritu 10000hasilnya tidak berbeda sama sekali dan itu dapat diterima.

Habib Karbasian
sumber
0

Saya baru saja mengalami masalah serupa dengan dataset yang hanya berisi 115 elemen dan hanya satu fitur tunggal (data maskapai internasional). Solusinya adalah dengan skala data. Apa yang saya lewatkan dalam jawaban sejauh ini adalah penggunaan Pipeline:

from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler, MinMaxScaler

model = Pipeline([('scaler', StandardScaler()),
                  ('svr', SVR(kernel='linear'))])

Anda dapat berlatih modelseperti model klasifikasi / regresi biasa dan mengevaluasinya dengan cara yang sama. Tidak ada yang berubah, hanya definisi model.

Martin Thoma
sumber
Apa Pipeline? Anda tidak mengimpornya.
Bram Vanroy
0

Anda perlu skala data Anda. Penskalaan akan menormalkan poin data Anda menjadi -1 hingga 1, yang akan membantu dalam konvergensi yang lebih cepat.

Coba gunakan kode berikut:

# X is your numpy data array.

from sklearn import preprocessing

X = preprocessing.scale(X)
Rishabh Gupta
sumber
selamat datang di Ilmu Data SE! Bisakah Anda menjelaskan bagaimana saran Anda akan membantu OP? Apa yang Anda sarankan adalah penskalaan array. Tidak jelas bagaimana itu mungkin atau mungkin tidak mempengaruhi algoritma SVR di scikit belajar.
Stereo