2013-08-10 7 views
9

napisałem następujący kod i przetestować go na niewielkiej danych:Ile czasu zajmuje klasyfikator SVM pociągu?

classif = OneVsRestClassifier(svm.SVC(kernel='rbf')) 
classif.fit(X, y) 

gdzie x, y jest numpy tablice. Na małym algorytmie danych działa dobrze i daje mi właściwe odpowiedzi. Ale uruchamiam mój program około 10 godzin temu ... I nadal trwa. Dokładnie w tym kawałku kodu. X to macierz 30000x784, y 30000x1. Chcę wiedzieć, ile czasu to zajmie lub utknie w jakiś sposób? Mój laptop ma 4 GB pamięci, Core i5-480m.

+0

Więc ... 30000 wymiarów i 30000 X 784 punktów .... Nie pracowałem zbyt długo z maszyną uczenie się, ale to jest dość dużym i wielowymiarowym wektorem funkcji ... nie wydaje mi się zbyt zaskakujące, że zajmuje tak dużo czasu ... można spróbować zmniejszyć wymiary, aby je przyspieszyć ... – Roy

+1

@Roy Zmniejszenie liczby instancji szkoleniowych byłoby * znacznie * bardziej efektywne niż redukcja wymiarów dla metod jądra. –

+0

@MarcClaesen Będę musiał wziąć na to twoje słowo, nie jestem sam niczym nowicjusz. – Roy

Odpowiedz

21

SVM szkolenie może być dowolna długo, zależy to od kilkudziesięciu parametrów:

  • C parametrów - większe kary missclassification, wolniej procesu
  • kernel - bardziej skomplikowane jądro, wolniejszy proces (RBF jest to najbardziej złożony z tych predefiniowanych)
  • rozmiar danych/trójwymiarowość - znowu ta sama zasada

w ogóle, podstawowy SMO algorytmem jest O(n^3), więc w przypadku 30 000 punktów danych musi działać liczba operacji proporcjonalna do 2 700 000 000 000, która jest naprawdę ogromną liczbą. Jakie są twoje opcje?

  • zmiana jądra do jednego liniowego, 784 funkcji jest dość dużo, RBF może być zbędny
  • zmniejszenie wymiarowości cech (PCA?)
  • niższa C parametr
  • model pociągu na podzbiór danych, aby znaleźć dobre parametry, a następnie wytrenować całość na jakimś klastrze/superkomputerze
+3

Czas obliczania jądra nie jest zwykle problemem, gdy rozważane są naprawdę duże problemy. Różnica między RBF i, powiedzmy, wielomianem jest nieistotna. Jedyny aspekt złożoności jądra jest liniowy w porównaniu do innych. Dodatkowo, złożoność treningu waha się od 'O (n^2)' (smalll 'C') do' O (n^3) '(duże' C'). Po trzecie, wymiarowość wejściowa nie ma większego znaczenia w ogólnej złożoności (która jest funkcją liczby instancji szkoleniowych, a nie wymiarów). –

+0

Dziękuję. Ten parametr C sprawia, że ​​algorytm działa wolniej, o czym nie myślałem. I nie wiedziałem, że rbf jest najbardziej skomplikowanym jądrem - ale prawdą jest, że kiedy zmieniam jądro na "poli", otrzymałem wynik w ciągu 2 godzin. –

+0

@Marc - Dzięki za komentarze. Istnieje ogromna różnica między RBF i wielomianem - nie dlatego, że sama funkcja jądra jest złożona, ale że wywołane RHKS jest i właśnie tam odbywa się optymalizacja. Po drugie, O (n^3) jest górną granicą, oczywiście dla małego C jest szybsza. Trzecia - wymiarowość ma znaczenie, ponieważ mieści się w kosztach obliczania każdego jądra (mniej ważne) i jako udział w złożoności złożoności wywołanych RHKS (ważniejsze) – lejlot