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
mitAber 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.
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
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
Sorry, mein Kommentar war nicht super klar, lassen Sie mich wissen, ob meine Antwort hilft. – Carl