2013-08-10 15 views
9

Ich schrieb folgenden Code und testen Sie es auf kleine Daten:Wie viel Zeit braucht Zug SVM Classifier?

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

Wo X, y numpy Arrays ist. Auf kleinen Daten funktioniert Algorithmus gut und gibt mir richtige Antworten. Aber ich laufe mein Programm vor etwa 10 Stunden ... Und es ist noch in Bearbeitung. Genau in diesem Stück Code. X ist 30000x784 Matrix, y 30000x1. Ich möchte wissen, wie lange es dauern wird, oder es in irgendeiner Weise feststeckt? Mein Laptop hat 4 GB Speicher, Core i5-480m.

+0

Also uh ... 30000 Abmessungen und 30000 X 784 Punkte .... Ich habe nicht wirklich zu lange mit der Maschine gearbeitet Lernen aber das ist ein ziemlich großer und hochdimensionaler Merkmalsvektor ... ich denke nicht, dass es zu überraschend ist, dass es so lange dauert ... Sie könnten versuchen, die Dimensionen zu reduzieren, um es zu beschleunigen ... – Roy

+1

@Roy Die Anzahl der Trainingsinstanzen zu reduzieren wäre * viel * effektiver als Dimensionalitätsreduktion für Kernel-Methoden. –

+0

@MarcClaesen Hätte ich dein Wort zu nehmen, ich bin nicht viel mehr als ein Anfänger selbst. – Roy

Antwort

21

SVM Training lang beliebig sein kann, hängt dies von Dutzenden von Parametern:

  • C Parameter - größer die missclassification Strafe, langsamer der Prozess
  • Kernel - kompliziertere der Kernel, langsamer wird der Prozess (RBF ist die komplexeste aus den vordefinierten sind)
  • Datengröße/Dimensionalität - wieder die gleiche Regel

im allgemeinen, grundlegenden SMO Algorithmus ist O(n^3), so im Fall von 30 000 Datenpunkte muss es Anzahl der Operationen proportional zur 2 700 000 000 000 laufen, die wirklich große Zahl ist. Was sind Ihre Möglichkeiten?

  • Änderung ein Kernel auf die lineare eins, 784 Merkmale ist ziemlich viel, kann RBF überflüssig
  • Dimensionalität Eigenschaften, reduzieren (PCA?)
  • niedriger der C Parameter
  • Zugmodell auf die Teilmenge Ihrer Daten, um die guten Parameter zu finden und dann das ganze auf einem Cluster/Supercomputer zu trainieren
+3

Kernel-Rechenzeit ist normalerweise kein Problem, wenn wirklich große Probleme in Betracht gezogen werden. Der Unterschied zwischen RBF und, sagen wir, Polynom ist irrelevant. Der einzige Aspekt der Kernel-Komplexität ist linear gegenüber anderen. Außerdem reicht die Trainingskomplexität von "O (n^2)" (klein "C") bis "O (n^3)" (groß "C"). Drittens spielt die Eingabedimensionalität in der Gesamtkomplexität keine Rolle (was in Abhängigkeit von der Anzahl der Trainingsinstanzen und nicht der Dimensionalität ist). –

+0

Danke. Dieser Parameter C lässt den Algorithmus langsamer arbeiten, an den ich nicht gedacht habe. Und wusste nicht, dass rbf der komplizierteste Kernel ist - aber es stimmt, wenn ich den Kernel auf "poly" ändere, gab es das Ergebnis in 2 Stunden. –

+0

@Marc - Danke für die Kommentare. Es gibt einen großen Unterschied zwischen RBF und Polynom - nicht weil die Kernfunktion selbst komplex ist, sondern die induzierte RHKS, und hier findet die Optimierung statt. Zweitens ist O (n^3) die obere Grenze, offensichtlich ist es für kleines C schneller. Die Dimension der dritten Dimension ist wichtig, da sie in den Kosten der einzelnen Berechnungen des Kerns (weniger wichtig) und an der Kompliziertheit der Komplexität der induzierten RHKS beteiligt ist (wichtiger) – lejlot

Verwandte Themen