2012-06-13 5 views
5

Ich bin neu zu R und SVMs und ich versuche Profil svm Funktion von e1071 Paket. Ich kann jedoch keine große Datenmenge finden, die es mir ermöglicht, einen guten Profiling-Bereich von Ergebnissen zu erhalten, der die Größe der Eingabedaten verändert. Kann jemand svm arbeiten? Welchen Datensatz soll ich verwenden? Irgendwelche bestimmten Parameter zu svm, die es härter arbeiten lassen?Profiling SVM (E1071) in R

Ich kopiere einige Befehle, die ich verwende, um die Leistung zu testen. Vielleicht ist es am nützlichsten und leichter zu bekommen, was ich hier versuche:

#loading libraries 
library(class) 
library(e1071) 
#I've been using golubEsets (more examples availables) 
library(golubEsets) 

#get the data: matrix 7129x38 
data(Golub_Train) 
n <- exprs(Golub_Train) 

#duplicate rows(to make the dataset larger) 
n<-rbind(n,n) 

#take training samples as a vector 
samplelabels <- as.vector([email protected]@data$ALL.AML) 

#calculate svm and profile it 
Rprof('svm.out') 
svmmodel1 <- svm(x=t(n), y=samplelabels, type='C', kernel="radial", cross=10) 
Rprof(NULL) 

Ich halte Zeilen und Spalten die Datenmenge zu erhöhen duplizieren, aber ich erreichte die Grenze der Speicher statt machen svm härter arbeitet ...

+1

Das Duplizieren von Trainingspunkten erschwert das Problem nicht. Da die meisten SVM die gesamte Datenmenge in den Hauptspeicher aufnehmen müssen, ist es sinnvoll, dass Sie schließlich Speicherfehler erhalten. – karenu

+0

Also, wie kann ich mit einem richtigen großen Datensatz versuchen? Kennst du ein Beispiel, das ich verwenden könnte? – Manolete

+0

Ja, wenn Sie meine Antwort sehen, habe ich eine Reihe verfügbarer Datensätze aufgelistet. Außerdem sollten Sie Parameter-Tuning durchführen, um die besten Parameter zu finden. Sie werden feststellen, dass bei der Suche nach den Parametern, die Ihnen die größte Genauigkeit geben, einige länger trainieren werden als andere. Sehen Sie sich das Practical Guide des Autors von libsvm an: http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFYQFjAA&url=http%3A%2F%2Fwww.csie.ntu .edu.tw% 2F ~ cjlin% 2FPapiere% 2Fguide% 2Fguide.pdf & ei = WtLhT46NO-jw0gG30pHVAw & usg = AFQjCNFol0McRktHC6gsBxKXqQMvmQUFeg – karenu

Antwort

8

In Bezug auf "Working SVM out" - was SVM "härter" arbeiten lässt, ist ein komplexeres Modell, das nicht einfach getrennt werden kann, höhere Dimensionalität und einen größeren, dichteren Datensatz.

SVM Leistung stark verringert mit:

  • Datensatz Größe zunimmt (Anzahl der Datenpunkte)
  • Sparsity abnimmt (weniger Nullen)
  • Dimensionalität zunimmt (Anzahl von Attributen)
  • Non- lineare Kernel werden verwendet (und Kernel-Parameter können die Kernel-Evaluierung komplexer machen)

Wechselnde Parameter

Gibt es Parameter können Sie SVM länger dauern, um ändern. Natürlich wirken sich die Parameter auf die Qualität der Lösung aus, die Sie erhalten, und es macht keinen Sinn, sie zu verwenden.

Mit C-SVM führt die Variation von C zu unterschiedlichen Laufzeiten. (Der ähnliche Parameter in nu-SVM ist nu.) Wenn die Datenmenge einigermaßen separierbar ist, führt eine Verkleinerung von C zu einer längeren Laufzeit, da die SVM mehr Trainingspunkte zu Supportvektoren werden lässt. Wenn das Dataset nicht sehr trennbar ist, führt die Vergrößerung von C zu längeren Laufzeiten, da Sie SVM im Wesentlichen mitteilen, dass Sie eine Lösung mit engen Toleranzen wünschen, die eng an die Daten angepasst ist und bei Daten nicht so einfach zu berechnen ist trennen.

Oft finden Sie bei einer Parametersuche, dass es Parameter gibt, die die Rechenzeit erhöhen, ohne dass die Genauigkeit merklich zunimmt.

Die anderen Parameter sind Kernel-Parameter und wenn Sie sie variieren, um die Komplexität der Berechnung des Kernels zu erhöhen, dann wird natürlich die SVM-Laufzeit erhöhen. Der lineare Kernel ist einfach und wird am schnellsten sein; Nichtlineare Kernel werden natürlich länger brauchen. Einige Parameter erhöhen zwar nicht die Berechnungskomplexität des Kernels, erzwingen jedoch ein viel komplexeres Modell, wodurch SVM möglicherweise viel länger benötigt wird, um die optimale Lösung zu finden.

Datensätze zu verwenden:

Die UCI Machine Learning Repository eine große Quelle der Datensätze ist.

Die MNIST handwriting recognition dataset ist eine gute zu verwenden - Sie können nach dem Zufallsprinzip Teilmengen der Daten auswählen, um immer größere Datenmengen zu erstellen. Beachten Sie, dass die Daten im Link alle Ziffern enthalten, SVM ist natürlich binär, Sie müssten also die Daten auf nur zwei Ziffern reduzieren oder eine Art SVM mit mehreren Klassen durchführen.

Sie können auch einfach Datensätze erzeugen. Um ein lineares Dataset zu generieren, wählen Sie nach dem Zufallsprinzip einen normalen Vektor für eine Hyperebene aus, generieren dann einen Datenpunkt und bestimmen, auf welcher Seite der Hyperebene er steht, um sie zu beschriften. Fügen Sie etwas Zufälligkeit hinzu, damit Punkte innerhalb einer bestimmten Entfernung der Hyperebene manchmal anders gekennzeichnet werden. Erhöhen Sie die Komplexität, indem Sie diese Überlappung zwischen Klassen erhöhen. Oder generieren Sie eine Anzahl von Clustern normalverteilter Punkte, die entweder als 1 oder -1 bezeichnet werden, sodass sich die Verteilungen an den Kanten überlappen. Das klassische nichtlineare Beispiel ist ein Schachbrettmuster. Erzeugen Sie Punkte und beschriften Sie sie in einem Schachbrettmuster. Um die Anzahl der Quadrate zu erhöhen, erhöhen Sie die Abmessungen und erhöhen Sie die Anzahl der Datenpunkte. Dafür müssen Sie natürlich einen nichtlinearen Kernel verwenden.

+0

Vielen Dank für Ihre großartige Erklärung. Ich schätze es. Ich habe meine Frage aktualisiert, um zu sehen, ob das hilft – Manolete

+0

karenu Was ist mit der Eingabematrix? Ich habe wirklich Mühe zu verstehen, wann und warum ich die Transponierung anwenden muss. Ich habe einige Beispiele gesehen, und jeder tut etwas anderes. Woher weiß ich, wann ich die Eingabematrix t() anwenden muss? – Manolete

Verwandte Themen