Scikit öğrenme kullanarak SVM sonsuz çalışır ve yürütmeyi asla tamamlamaz


76

595605 satır ve 5 sütun (özellikler) içeren bir eğitim veri setinde scikit learn (python) ve 397070 satır içeren test veri setinde SVR kullanmaya çalışıyorum. Veriler önceden işlenmiş ve düzenlenmiştir.

Test örneklerini başarılı bir şekilde çalıştırabilirim ancak veri setimi kullanarak çalıştırmaya başladım ve bir saatten fazla çalışmasına izin verdiğimde, programın herhangi bir çıktısını veya sonunu göremedim. Farklı bir IDE kullanarak ve hatta terminalden çalıştırmayı denedim ama bu sorun gibi görünmüyor. 'C' parametre değerini 1'den 1e3'e değiştirmeyi de denedim.

Scikit kullanarak tüm svm uygulamalarında benzer sorunlarla karşılaşıyorum.

Tamamlanması için yeterince beklemiyor muyum? Bu uygulama ne kadar zaman almalıdır?

Tecrübelerime göre birkaç dakikadan fazla sürmemeliydi.

İşte sistem konfigürasyonum: Ubuntu 14.04, 8GB RAM, çok fazla boş hafıza, 4. nesil i7 işlemci


Kodu verebilir misiniz? Ayrıca, eğitim veya test yapmak çok mu zaman alıyor? Daha küçük eğitim / test veri setleri ne durumda?
Arkadaş

Ben sadece bir csv dosyasındaki verileri pandaların dataframe'lerine okuyorum ve onu scikit learn fonksiyonuna aktarıyorum. Bu kadar! Kod sağlanması gerçekten burada yardımcı olmaz
tejaskhot

6
sklearn'ün SVM uygulaması en az 3 adımı ifade eder: 1) SVR nesnesi oluşturma, 2) bir modele uyma, 3) değeri tahmin etme. İlk adım, iç süreçleri daha iyi anlamaya yardımcı olan kullanımdaki çekirdeği açıklar. İkinci ve üçüncü adımlar oldukça farklıdır ve en azından hangisinin o kadar uzun sürdüğünü bilmemiz gerekir. Eğer eğitim ise, o zaman tamam olabilir, çünkü öğrenme bazen yavaşlar. Test yapıyorsa, muhtemelen bir hata vardır, çünkü SVM'de test yapmak gerçekten hızlıdır. Ek olarak, bu kadar uzun süren ve hiç SVM olmayan CSV okuma olabilir. Yani tüm bu detaylar önemli olabilir.
Arkadaş

svm ile de aynı sorunla karşı karşıyayım ancak herhangi biri normalleşmeden sonra ne kadar zaman alacağını söyleyebilir mi?
kashyap kitchlu

Yanıtlar:


69

Kernelized SVM'lerin hakim maliyeti olan veri kümesi her bir nokta arasındaki mesafenin fonksiyonu, hesaplama gerektiren . Mesafelerin depolanması hafızaya bir yüktür, bu yüzden anında hesaplanırlar. Neyse ki, çoğu zaman yalnızca karar sınırına en yakın noktalara ihtiyaç duyulmaktadır. Sık hesaplanan mesafeler önbellekte saklanır. Önbellek kırılıyorsa, çalışma süresi O ( n özellikler × n 3 gözlem ) kadar artar .O(nfeatures×nobservations2)O(nfeatures×nobservations3)

SVR'yi şu şekilde çağırarak bu önbelleği artırabilirsiniz.

model = SVR(cache_size=7000)

Genel olarak, bu işe yaramayacak. Ancak hepsi kaybolmaz. Verileri alt örnekleyebilir ve geri kalanını bir doğrulama kümesi olarak kullanabilirsiniz veya farklı bir model seçebilirsiniz. 200.000 gözlem aralığının üstünde, doğrusal öğrenicileri seçmek akıllıca olacaktır.

Çekirdek SVM'ye, çekirdek matrisine yaklaşılarak ve doğrusal bir SVM'ye beslenerek yaklaştırılabilir. Bu, lineer zamanda doğruluk ve performans arasında takas yapmanızı sağlar.

Bunu başarmanın popüler bir yolu, çekirdek işlevinizin temeli olarak kmeans / kmeans ++ tarafından bulunan 100 kadar küme merkezini kullanmaktır. Yeni türetilmiş özellikler daha sonra doğrusal bir modele beslenir. Bu pratikte çok iyi çalışıyor. Gibi araçlar sophia-ml ve vowpal tavşansın Google, Yahoo ve Microsoft bunu nasıl vardır. Girdi / çıktı basit doğrusal öğreniciler için hâkim maliyet haline gelir.

Veri bolluğunda, parametrik olmayan modeller çoğu sorun için kabaca aynı şekilde çalışır. Özel durumlar, metinler, görüntüler, zaman serileri, ses gibi yapılandırılmış girdilerdir.

daha fazla okuma


16

SVM, ikinci dereceden sipariş optimizasyon problemini çözer.

Burada söylenmeyen bir şey eklemek yok. Sadece neler olup bittiğini açıklığa kavuşturan SVC ile ilgili sklearn sayfasına bir link göndermek istiyorum :

Uygulama libsvm'ye dayanmaktadır. Uygun zaman karmaşıklığı, birkaç 10000'den fazla örnekle veri kümesini ölçeklendirmeyi zorlaştıran örnek sayısı ile daha fazla kareseldir.

Çekirdek kullanmak istemiyorsanız ve doğrusal bir SVM yeterliyse , doğrusal regresyonlarda bir optimizasyon yaklaşımı kullandığından çok daha hızlı olan LinearSVR vardır. Zaten yapmamış olmanız durumunda verilerinizi normalleştirmek zorunda kalacaksınız, çünkü yakalama katsayısına düzenlileştirme uygular, bu muhtemelen istediğiniz şey değildir. Veri ortalamanız sıfırdan uzak ise, bunu tatmin edici bir şekilde çözemeyecektir demektir.

Ayrıca, optimizasyon problemini çözmek için stokastik gradyan inişi de kullanabilirsiniz. Sklearn özellikleri SGDRegressor . Sen kullanmak zorunda loss='epsilon_insensitive'SVM doğrusal benzer sonuçlara sahip olduğu. Belgelere bakınız. Degrade inişini yalnızca son çare olarak kullanırdım, çünkü yerel minima'da sıkışıp kalmamak için hiperparametrelerin çok ince ayarını gerektirir. LinearSVRYapabiliyorsan kullan .


Çok satırlı bir veri kümem vardı. SVC benim için yaklaşık 150K veri satırı için çok uzun sürmeye başladı. Önerinizi LinearSVR ile kullandım ve bir milyon satır sadece birkaç dakika sürer. PS ayrıca LogisticRegression sınıflandırıcısının LinearSVR ile benzer sonuçlar ürettiğini (benim durumumda) buldu ve daha da hızlı.
jeffery_the_wind

8

Ön işleme adımınıza ölçeklendirme dahil ettiniz mi? SVM'imi çalıştırırken bu sorunu yaşadım. Veri setim 20 özellikli (col) ~ 780.000 örnektir (satır). Eğitim setim ~ 235k örnek. Görünüşe göre verilerimi ölçeklendirmeyi unuttum! Bu durumda, bu biti kodunuza eklemeyi deneyin:

verileri [-1,1] olarak ölçeklendirin; SVM hızını arttırın:

sklearn.preprocessing ithal MinMaxScaler
ölçekleme = MinMaxScaler (feature_range = (- 1,1)). fit (X_train)
X_train = scaling.transform (X_train)
X_test = ölçekleme.


2
Bunun neden SVM'yi daha da hızlandırdığını açıklayan var mı?
lppier

1
MinMaxScaler'ı bir başkası yerine seçmenin bir nedeni var mı? Örneğin StandardScaler?
raspi,

@Ipier: aslında, her seçenek için olası sınır alanını, makineniz için efor düzeyini çok daha düşük olacak şekilde azaltırsınız.
ike

7

Böyle büyük bir veri kümesiyle, sinir ağı, derin öğrenme, rastgele orman (şaşırtıcı derecede iyi) vb. Kullanarak daha iyi olacağınızı düşünüyorum.

Daha önceki cevaplarda belirtildiği gibi, geçen süre, eğitim örneklerinin sayısının üçüncü gücüyle orantılıdır. Tahmin süresi bile test vektörlerinin sayısı açısından polinomdur.

Eğer gerçekten SVM kullanmanız gerekiyorsa, GPU hızını kullanmanızı veya egzersiz veri setinin boyutunu azaltmanızı öneririm. Veri formatı veya dağıtımıyla ilgili bir sorun olup olmadığını görmek için önce verilerin bir örneğini (belki de 10.000 satır) deneyin.

Diğer cevaplarda da belirtildiği gibi, doğrusal çekirdekler daha hızlıdır.


3

Son zamanlarda benzer bir sorunla karşılaştım, çünkü daha önce topluluk modeli türünü eğitmek için kullanılan veri setimdeki özellikleri ölçeklendirmeyi unuttum. Verilerin ölçeklendirilmemesi, Shelby Matlock tarafından belirtildiği gibi muhtemel suçlu olabilir. RobustScaler gibi sklearn'de bulunan farklı ölçeklendiricileri deneyebilirsiniz :

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

X şimdi dönüştürülmüş / ölçeklendirilmiş ve istediğiniz modele beslenmeye hazır.


2

Bu mantıklı. IIUC, destek vektör işlemlerinin gerçekleştirilme hızı, boyutsallığa değil, örnek sayısına bağlıdır. Başka bir deyişle, RAM ile değil CPU zamanı ile sınırlandırılmıştır. Bunun tam olarak ne kadar zaman alacağından emin değilim, ancak öğrenmek için bazı testler yapıyorum.


1

24 saat boyunca gece veya daha iyi çalışmasına izin verin. CPU kullanımınız nedir? Çekirdeklerin hiçbiri% 100'de çalışmıyorsa, o zaman bir sorununuz olur. Muhtemelen hafıza ile. Veri kümenizin 8GB’ye sığıp sığmadığını kontrol ettiniz mi? SGDClassifier'ı denediniz mi? Oradaki en hızlı olanlardan biri. İlk denemeyi denemeye değer, bir saat kadar sonra tamamlar.


SGDClassifierçekirdekleri desteklemiyor. OP doğrusal SVM istiyorsa, ilk denemeyi öneririm LinearSVR. SVRDoğrusal bir regresyon kütüphanesi kullanarak sorunu çözdüğünden çok daha hızlıdır ve global minimum garanti edilir (gradyan descente'den farklı olarak).
Ricardo Cruz

Yorumunuzu takdir edin. Çekirdek desteğinin neden bir sorun olduğunu açıklayabilir misiniz?
Diego

Gönderen dokümantasyon , The loss function to be used. Defaults to ‘hinge’, which gives a linear SVM.Aynı şey için SGDRegressor. SGDRegressorkullanmaya eşdeğerdir SVR(kernel='linear'). OP'nin istediği buysa, bu harika. SVM'yi bir çekirdekle kullanmak istediği izlenimindeydim. Böyle değilse ilk denemesini tavsiye ederim LinearSVR.
Ricardo Cruz

1

Verileri [-1,1] olarak normalleştirmeyi deneyin. Benzer bir sorunla karşılaştım ve normalleşme üzerine her şey yolunda gitti. Aşağıdakileri kullanarak verileri kolayca normalleştirebilirsiniz:

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


@Archie Bu bir soruya değil, bir soruya cevaptır.
timleathart

1

Bu sorunla karşılaştım ve cache_size başkalarının önerdiği gibi hiç yardımcı olmuyor. Görebilirsiniz Bu yayını ve bu bir ana katkıyı el kodunu değiştirmek gerektiğini önerdiği gibi.

Bildiğiniz gibi SVCve SVRoptimizasyon problemleri ve hata payı çok az olduğunda daha fazla optimizasyonun boş olduğu yerlerde dururlar. Yani bunlarda, max_iterkaç tane yineleme yapması gerektiğini ayarlayabileceğiniz başka bir parametre var.

sklearnPython'da kullandım ve e1071R ve R'de ayar yapmadan sonuca ulaşmak çok daha hızlı max_iterve sklearn2-4 kat daha uzun sürüyor. Python'un hesaplama süresini azaltabilmemin tek yolu kullanıyordu max_iter. Bu sizin model özellikleri, çekirdek ve hyperparameters sayısı karmaşıklığına göre değişir, ama küçük veri kümesi için ben datapoint etrafında 4000 için kullanılan ve max_iteroldu10000 sonuç hiç de farklı değildi ve kabul edilebilir.


0

Sadece 115 element ve sadece bir tek özellik (uluslararası havayolu verileri) içeren bir veri setiyle benzer bir sorun yaşadım. Çözüm verileri ölçeklendirmek oldu. Şimdiye kadar cevaplarda kaçırdığım şey bir Boru Hattı kullanımıydı:

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

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

Her modelzamanki sınıflandırma / regresyon modeli gibi eğitebilir ve aynı şekilde değerlendirebilirsiniz. Hiçbir şey değişmiyor, sadece modelin tanımı.


Nedir Pipeline? İçe aktarmıyorsun.
Bram Vanroy

0

Verilerinizi ölçeklendirmeniz gerekir. Ölçeklendirme, veri noktalarınızı -1 ile 1 aralığına normalleştirir; bu da daha hızlı yakınlaşmaya yardımcı olur.

Aşağıdaki kodu kullanmayı deneyin:

# X is your numpy data array.

from sklearn import preprocessing

X = preprocessing.scale(X)

Data Science SE'ye hoş geldiniz! Önerinizin OP'ye nasıl yardımcı olacağını açıklayabilir misiniz? Önerdiğiniz şey bir dizinin ölçeklenmesidir. Bunun scikit öğrenmede SVR algoritmasını nasıl etkileyebileceği veya etkilemeyeceği açık değildir.
Stereo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.