2016-05-03 13 views
1

Ich bin ein Support-Vektor-Maschine mit einer radialen Basis Kernel-Funktion im R caret-Paket. Mein Code wird ohne Fehler oder Warnungen ausgeführt, generiert jedoch eine Meldung "maximale Anzahl an Iterationen erreicht ...", die ich interpretiere, dass der Algorithmus nicht zu einer Lösung konvergiert ist.Wie die maximale Anzahl von Iterationen in R Caret-Paket zwicken

ein kleines College Admissions Dataset (4 Funktionen, n = 400) als Beispiel:

# Load data & factor admit variable. 
> mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv") 
    mydata$admit <- as.factor(mydata$admit) 

# Create levels yes/no to make sure the the classprobs get a correct name. 
levels(mydata$admit) = c("yes", "no") 


# Train SVM via 10-fold CV. 
set.seed(123) 
train_control <- trainControl(method="cv", 
    number=10, 
    classProbs = TRUE, 
    savePredictions = TRUE) 

model_rbfsvm<- train(as.factor(admit) ~ ., 
    data=mydata, 
    trControl=train_control, 
    method="svmRadial", 
    family="binomial", 
    tuneGrid=expand.grid(C=c(.000001, .00001, .0001, .001, .01, .1, 1, 10), sigma=c(.00001, .0001, .001, .01, .1, 1, 10)), 
    metric="Accuracy", 
    preProcess=c("center","scale")) 

erfolgreich ausführt, erzeugt aber die folgende Meldung (I abgekürzt habe - es ist für viele Linien geht weiter):

maximum number of iterations reached 4.663775e-05 4.663771e-05maximum number of iterations reached 0.0003396917 0.0003396878... 

die maximale Anzahl von Iterationen mit der maxiter= Anweisung in dem Zug-Einstellfunktion erzeugen die gleiche Meldung.

Kann die maximale Anzahl von Iterationen in caret angepasst werden oder ist sie auf einen bestimmten Wert festgelegt?

Antwort

1

Es ist nicht möglich, die Anzahl der Iterationen anzupassen. Wenn Sie maxiter = ..... angeben, wird es an die zugrunde liegende Kernlab-Funktion lssvm übergeben, ist jedoch in der Funktion lssvm keine Option und wird ignoriert.

Ihre Warnung tritt nur auf, wenn Sie classProbs = TRUE festlegen. Wenn Sie die Standardoption beibehalten, wird keine Nachricht angezeigt. Das ist interessant, weil die Nachricht anzeigt, dass svm noch keine Konvergenz erreicht hat, und irgendwie tut es das, wenn classProbs = FALSE. Aber ich habe meine Zweifel daran, denn das Modellresultat ist genau das gleiche. Wenn Sie verboseIter = TRUE einstellen, werden die Meldungen etwas besser angezeigt.

+ Fold1: C=0.001, sigma=0.001 
maximum number of iterations reached 0.00024476 0.0002447579- Fold1: C=0.001, sigma=0.001 
+ Fold1: C=0.010, sigma=0.001 
maximum number of iterations reached 0.002770727 0.002765972- Fold1: C=0.010, sigma=0.001 

Ausführen des Modells direkt mit der lssvm Funktion zurückgeben keine Meldung mit der maximalen Anzahl von Iterationen. Vielleicht möchten Sie eine Zeile auf github page of caret fallen lassen.

S.S .: Die Familienoption, die Sie in der Zugfunktion angeben, wird nicht benötigt (und nicht verwendet).

+0

Danke @phiver, das ist sehr hilfreich. Ja, ich sehe keine 'maxiter =' Argumente in der 'lssvm' Funktion, also gehe ich davon aus, dass der Algorithmus nur dann endet, wenn das Toleranzkriterium erfüllt ist (Standard = .0001). Trotz der Meldungen "maximale Anzahl an Iterationen erreicht ..." gibt 'caret' immer noch SVM-Vorhersagen aus, so dass dies eine falsche Warnung sein muss. – RobertF

+1

Nach ein wenig mehr Graben, stieß ich auf diesen Beitrag: http://StackOverflow.com/Questions/15503027/Why-are-probabilities-and-response-in-ksvm-in-r-not-consistent], die diskutiert separate Methoden zur Anpassung der SVM, wenn 'classProbs = TRUE' (wo die vorhergesagte Antwort eine Wahrscheinlichkeit ist) vs.' classProbs = FALSE' (wobei die vorhergesagte Antwort eine Ja/Nein-Markierung ist). Möglicherweise sehen wir die maximale Iterationsmeldung, wenn "classProbs = TRUE" ist, weil der Algorithmus nicht konvergiert. – RobertF