Ich möchte den Modellanpassungsprozess für xgboost während der Verwendung von Caret parallelisieren. Von dem, was ich in xgboosts documentation gesehen habe, steuert der Parameter nthread
die Anzahl der Threads, die verwendet werden sollen, während die Modelle in dem Sinne angepasst werden, dass die Bäume parallel aufgebaut werden. Caret's train
Funktion führt eine Parallelisierung in dem Sinne durch, dass beispielsweise ein Prozess für jede Iteration in einem k-fachen CV ausgeführt wird. Ist das Verständnis korrekt, wenn ja, es ist besser:Parallele Verarbeitung mit xgboost und caret
- die Anzahl der Kerne Register (zum Beispiel mit dem
doMC
Paket und dieregisterDoMC
Funktion), setztenthread=1
über Zug-Funktion des caret so passiert es, dass Parameter xgboost, setzeallowParallel=TRUE
intrainControl
, und lassecaret
die Parallelisierung für die Kreuzvalidierung durchführen; oder - Deaktivieren Sie die Caret-Parallelisierung (
allowParallel=FALSE
und keine parallele Back-End-Registrierung) und setzen Sienthread
auf die Anzahl der physischen Kerne, so dass die Parallelisierung ausschließlich innerhalb von Xgboost enthalten ist.
Oder gibt es keinen "besseren" Weg, die Parallelisierung durchzuführen?
Edit: lief ich den Code von @topepo vorgeschlagen, mit tuneLength = 10
und search="random"
und nthread=1
in der letzten Zeile der Angabe (sonst verstehe ich, dass xgboost Multithreading verwenden). Es sind die Ergebnisse, die ich bekam:
xgb_par[3]
elapsed
283.691
just_seq[3]
elapsed
276.704
mc_par[3]
elapsed
89.074
just_seq[3]/mc_par[3]
elapsed
3.106451
just_seq[3]/xgb_par[3]
elapsed
0.9753711
xgb_par[3]/mc_par[3]
elapsed
3.184891
Am Ende stellte sich heraus, dass sowohl für meine Daten und für diesen Testfall, lassen caret behandeln die Parallelisierung eine bessere Wahl in Bezug auf die Laufzeit war.
Vermeidung der Tatsache, dass die Kreuzvalidierung nicht „Modellanpassung“ ist, gibt es keinen Grund, diese Optionen gegenseitig ausschließen müssen. Egal, die Frage basiert auf der Meinung und ich schließe. Sie haben nicht "besser" definiert; aber ich nehme an, du meinst weniger Laufzeit ... Du kannst deinen Code immer profilieren. Ich empfehle 'Bibliothek (Mikrobenchmark)' dafür. –
Vielleicht gibt es ein Missverständnis in der Terminologie. Natürlich ist das letzte Ziel der Kreuzvalidierung die Modellvalidierung, aber was ich unter "Modellanpassung" verstehe, ist, dass Sie in jeder Iteration ein Modell über die (k-1) -Falten anpassen müssen. Der Grund für diese Frage ist, dass ich nicht weiß, ob es durch die Konstruktion theoretisch einen besseren Weg für die Parallelisierung gibt (zB könnte es mehr Overhead beim Erzeugen von mehr Threads pro Iteration geben, als bei der Parallelisierung der Resampling-Schleife) und mich fragen, ob jemand Erfahrene könnten dazu beraten. Aber es ist wahr, dass dies fallabhängig sein könnte. – drgxfs