2016-06-02 3 views
2

Ich benutze das DoPar-Paket in einem Versuch, das Training von maschinellen Lernalgorithmen parallelisieren, da sie eine Weile dauern scheinen.Arbeiten mit Iterator Wert Dopar R

Mein Plan ist es, mehrere neuronale Netze, SVMs und Entscheidungsbäume zu trainieren (derzeit jeweils 10, neuralnet1 genannt ... neuralnet10, svm1 ..., svm10 usw.). Der Datenrahmen all_classifiers enthält den Namen des Klassifikators, den ich benennen möchte es und die Stopp-/Start-Trainingszeit

> head(all_classifiers,3) 
    classifiers train_start train_stop 
1 neuralnet1  7833  8074 
2 neuralnet2  45590  45682 
3 neuralnet3  64341  64574 
> tail(all_classifiers,3) 
    classifiers train_start train_stop 
28   dt8  235639  235737 
29   dt9  256497  257198 
30  dt10  257814  258034 

meine Schleife rechts sieht nun wie folgt

for(i in 1:trainloop{ 

     # Select training data + remove NA 
     train_start <- all_classifiers[["train_start"]][i] 
     train_stop <- all_classifiers[["train_stop"]][i] 
     train_data <- na.omit(data[train_start:train_stop,]) 
     print(paste("Using data from ", train_start,"to", train_stop)) 
     train_scaled <- as.data.frame(train_data) 

     # Train appropriate model 
     firstLetter <- strtrim(all_classifiers[["classifiers"]][i],1) 
     if(firstLetter == "n"){ 
     print("Training neural net") 
     trained_classifier <- neuralnet(f, data=train_scaled , hidden=c(3), 
             act.fct = 'logistic', linear.output=F, 
             stepmax=1e6, rep=1, learningrate = 0.30) 
     } else if(firstLetter == "s"){ 
     print("Training SVM") 
     trained_classifier <- svm(upmove ~ . , data = train_scaled, 
            kernel = "polynomial", coef0 = 2.0) 
     } else if(firstLetter == "d"){ 
     print("Training DT") 
     train_scaled$upmove <- as.factor(train_scaled$upmove) 
     trained_classifier <- C5.0(f, data = train_scaled) 
     } 
     flog.info(paste("Training",all_classifiers[["classifiers"]][i])) 
     assign(toString(all_classifiers[["classifiers"]][i]), trained_classifier) 
    } 

ich möchte diese Schleife parallelisieren von

mit

Aber es scheint, dass jeder Arbeiter mit Iterator beginnt i = 1, während meine Variablenzuweisungen

assign(toString(all_classifiers[["classifiers"]][i]), trained_classifier) 

auf dem Wert des Iterators abhängig sind verwendet werden. Wie würde ich das lösen? Irgendwann möchte ich mit allen Namen in der ersten Spalte von all_classifiers enden, die trainierte Klassifikatoren über die zugehörigen Start- und Stopp-Trainingszeiten sind.

+0

Mit 'foreach ', Sie wollen es nicht wie eine Schleife behandeln und dem Index 'i' in der Schleife 'i' einen Wert zuweisen, sondern Sie wollen eine Liste von 'i' Objekten erstellen und diese dann am Ende kombinieren. – Carl

+0

Also, was Sie sagen, ist, dass ich eine Art von Warteschlange von Prozessen erstellen und diese dann in die foreach-Schleife einspeisen muss? Macht das irgendeinen Sinn? Sorry, wenn ich Kauderwelsch sage – Rainymood

+0

Sorry, mein Kommentar war nicht super klar, lassen Sie mich wissen, ob meine Antwort hilft. – Carl

Antwort

0

Ich will nicht zu in die Besonderheiten des Codes zu bekommen, aber hier ist ein kleines Beispiel, das hoffentlich Ihnen helfen zu verstehen, wie eine Basis R Schleife übersetzen foreach:

x1 <- numeric(10) 
for (i in 1:10) { 
    x1[i] <- i^2 
} 

x2 <- foreach(i=1:10,.combine=rbind) %do% { 
    i^2 
} 

x1==x2 
+0

Danke für deinen Kommentar, ich werde es morgen anschauen – Rainymood