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
sumber
Jawaban:
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×n2observations) O(nfeatures×n3observations)
Anda dapat meningkatkan cache ini dengan menggunakan SVR sebagai
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
sumber
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:
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. GunakanLinearSVR
jika Anda bisa.sumber
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:
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber
SGDClassifier
tidak mendukung kernel. Jika OP menginginkan linear SVM, maka saya akan merekomendasikan terlebih dahulu mencobaLinearSVR
. Ini jauh lebih cepat daripadaSVR
karena memecahkan masalah menggunakan perpustakaan regresi linier, dan minimum global dijamin (tidak seperti gradient descente).The loss function to be used. Defaults to ‘hinge’, which gives a linear SVM.
Hal yang sama untukSGDRegressor
.SGDRegressor
setara dengan menggunakanSVR(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 mencobaLinearSVR
.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)
sumber
Saya mengalami masalah ini dan
cache_size
seperti 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,
SVC
danSVR
masalah optimasi dan mereka berhenti ketika margin error begitu sedikit di mana optimasi lebih lanjut adalah sia-sia. Jadi ada parameter lain di sinimax_iter
,, di mana Anda dapat mengatur berapa banyak iterasi yang harus dilakukan.Saya telah menggunakan
sklearn
python dane1071
dalam R dan R jauh lebih cepat untuk mendapatkan hasil tanpa mengaturmax_iter
dansklearn
memakan waktu 2-4 kali lebih lama. Satu-satunya cara saya bisa menurunkan waktu komputasi untuk python adalah menggunakanmax_iter
. Hal ini relatif terhadap kompleksitas model, sejumlah fitur, kernel dan hyperparameters, tapi untuk dataset kecil saya digunakan untuk sekitar 4000 datapoint danmax_iter
itu10000
hasilnya tidak berbeda sama sekali dan itu dapat diterima.sumber
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:
Anda dapat berlatih
model
seperti model klasifikasi / regresi biasa dan mengevaluasinya dengan cara yang sama. Tidak ada yang berubah, hanya definisi model.sumber
Pipeline
? Anda tidak mengimpornya.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:
sumber