Hallo,
Ich versuche, einige der Statistiken mithilfe von JSL-Code aus dem XGBoost-Bericht zu extrahieren (anstatt mit der rechten Maustaste auf> in Datentabelle zu klicken). Ich mache dies mit einigen anderen Plattformen (z. B. Boosted Tree und Bootstrap Forest) ohne Probleme, aber aus irgendeinem Grund fällt es mir schwer, es in XGBoost zum Laufen zu bringen.
Auf den anderen Plattformen habe ich im Grunde genommen ein Skript in der von mir ausgeführten Tabelle, das eine Optimierungstabelle verwendet, diese jedoch einzeln anpasst und die Statistiken im weiteren Verlauf extrahiert. Das Ändern eines ähnlichen Ansatzes für die Arbeit mit XGBoost funktioniert jedoch nicht. Gibt es etwas im XGBoost-Bericht, das dies verhindern würde?
Als Beispiel für die Bootstrap-Gesamtstrukturmodellierung kann ich Folgendes tun:
Names Default To Here( 1 );
dt = Data Table( " " ); //this would be your data table used to train the model
dt_pars = Data Table( " " ); //this would be your tuning table with the parameters in it.
dt_results = dt_pars << Subset( All rows, Selected columns only( 0 ) ); //this basically duplicates the previous table for writing stats values
dt_results << New Column("Stat 1"); //for recording whichever stat you're interested in, e.g. Training R^2
dt_results << New Column("Stat 2"); //for recording whichever stat you're interested in, e.g. Validation R^2
//and so on with however many stats you want to get.
//This For Loop will run each row of the tuning table iteratively. This is really helpful for platforms that use a lot of RAM.
For( i = 1, i <= N Row( dt_pars ), i++,
NumTrees = dt_pars:Number Trees[i];
NumTerms = dt_pars:Number Terms[i];
PortBoot = dt_pars:Portion Bootstrap[i];
MinSplpTr = dt_pars:Minimum Splits per Tree[i];
MaxSplpTr = dt_pars:Maximum Splits per Tree[i];
MinSplSz = dt_pars:Minimum Size Split[i];
str = Eval Insert(
"report = (dt << Bootstrap Forest(
Y( :Y1 ), //whatever your response column is
X( :X1, :X2, :X3), //this is the list of all the x-factors
Minimum Size Split( ^MinSplSz^ ),
Validation Portion( 0.2 ),
Set Random Seed( ),
Method( \!"Bootstrap Forest\!" ),
Minimum Splits per Tree( ^MinSplpTr^ ),
Maximum Splits per Tree( ^MaxSplpTr^ ),
Portion Bootstrap( ^PortBoot^ ),
Number Terms( ^NumTerms^ ),
Number Trees( ^NumTrees^ ),
Early Stopping( 0 ),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
Stat_1 = report["Overall Statistics"][Number Col Box( 1 )] << Get; <U><STRONG>//this is where it doesn't work for the XGBoost report</STRONG></U>
//and so on for any other stats of interest
report << Close Window;
dt_results:Name("Stat 1")[i]=Stat_1[1];//saves the first in the list of Stat_1
dt_results:Name("Stat 2")[i]=Stat_1[2];//saves the second in the list of Stat_1
//continue on until you've recorded all the stats of interest in the dt_results data table.
);Die obige Methode funktioniert sehr gut, wenn Sie VIELE Bootstrap-Gesamtstrukturläufe ausführen möchten, ohne zu viel RAM zu verbrauchen. Sie können RSquare, RASE, N usw. einfach über das Gliederungsfeld "Gesamtstatistik" aufzeichnen.
Wenn ich ein ähnliches Skript (unten) ausführe, wird ein Fehler ausgegeben bei: report ["Outline Box"] [Number Col Box (1)] << Get line.
Names Default To Here( 1 );
dt = Data Table( " " ); //training data table
dt_pars = Data Table( " " ); //tuning parameter table
dt_results = dt_pars << Subset( All rows, Selected columns only( 0 ) ); //makes duplicate for writing output values to
//creates columns for the statistics to save in the results data table.
dt_results << New Column( "Stat1" );
dt_results << New Column( "Stat2" );
dt_results << New Column( "Stat3" );
dt_results << New Column( "Stat4" );
dt_results << New Column( "Stat5" );
dt_results << New Column( "Stat6 );
//this is the For Loop to run each row in the dt_pars tuning table one at a time.
For( i = 1, i <= N Row( dt_pars ), i++,
maxd = dt_pars:max_depth[i];
subsam = dt_pars:subsample[i];
colsambytree = dt_pars:colsample_bytree[i];
minchweight = dt_pars:min_child_weight[i];
al = dt_pars:alpha[i];
lam = dt_pars:lambda[i];
learnr = dt_pars:learning_rate[i];
iter = dt_pars:iterations[i];
str = Eval Insert(
"report = (dt << XGBoost(
Y( :Y1 ), //Response column
X( :X1, :X2, :X3, :X4),
Validation( :Validation), //validation column of choice
Fit(
max_depth( ^maxd^ ),
subsample( ^subsam^ ),
colsample_bytree( ^colsambytree^ ),
min_child_weight( ^minchweight^ ),
alpha( ^al^ ),
lambda( ^lam^ ),
learning_rate( ^learnr^ ),
iterations( ^iter^ )
),
SendToReport(
Dispatch( {}, \!"Launch\!", OutlineBox, {Close( 1 )} ),
Dispatch(
{\!"Launch\!", \!"Advanced Options\!"},
\!"\!",
TextEditBox,
{Fixed Size( 1, 72, 19 )}
),
Dispatch(
{\!"Launch\!", \!"Advanced Options\!"},
\!"\!",
Text Edit Box( 2 ),
{Fixed Size( 1, 72, 19 )}
),
Dispatch(
{\!"Launch\!", \!"Advanced Options\!"},
\!"\!",
Text Edit Box( 3 ),
{Fixed Size( 1, 72, 19 )}
),
Dispatch( {\!"Launch\!"}, \!"\!", PictureBox, {Set Summary Behavior( \!"Collapse\!" )} ),
Dispatch( {}, \!"Model 1\!", OutlineBox, {Close( 1 )} ),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
Stat_1= report["Compare"][Number Col Box(1)] << Get;
//and so on for the other stats to be saved
report << Close Window;
dt_results:Name( "Stat1" )[i] = Stat_1;//saves the value to the data table dt_results
//and so on for the other stats to record in the results data table.
); Ich versuche, die Statistiken für jede Anpassung zu erhalten, die im "Vergleichen" [Tabellenfeld (1)] angezeigt wird, wie z. B. Train RSquare usw., aber der Verweis auf das Feld "Number Col" scheint nicht zu funktionieren - es spielt keine Rolle, welcher Wert in () 1, 2, 3, 4 usw. steht. Sie alle werfen den gleichen Fehler. Ich möchte die RSqaure-, Corr- und RMSE-Werte für das Training und die Validierung nach jeder Anpassung speichern. Selbst wenn ich es unter dem Umrissfeld "Modell 1" versuche, untergeordnetes Element "Actual by Predicted", und nach dem Zahlenfeld () (z. B. (12 oder 13)) für die Trainingsergebnisse und Validierungsergebnisse suche, und versuche es Um die Werte dort zu extrahieren, wird immer noch ein Fehler in der Protokolldatei angezeigt.
Der Fehler, den ich bekomme, ist:
Objekt nicht abonnierbar beim Zugriff oder bei der Auswertung von 'report ["Compare"] [Number Col Box (1)]', report ["Compare"] [/ * ### * / Number Col Box (1)]
Im folgenden Skript wird der Fehler durch / * ### * / markiert
Stat_1 = report ["Compare"] [/ * ### * / Number Col Box (1)] << Get
Ich weiß, dass mir keine Klammern oder "Kleber" fehlen. im Skript.
Ich verstehe nicht, warum ich Werte aus anderen Berichten extrahieren kann, kann dies aber anscheinend nicht mit dem XGBoost-Bericht tun. Fehlt mir etwas im JSL-Code?
Ich denke, dass es besser ist, die Zahlen aus dem Gliederungsfeld "Modell 1" zu erhalten, da im Gliederungsfeld "Vergleichen" nicht immer die Corr- und RMSE-Werte angezeigt werden - es sei denn, Sie ändern dies mit der Hot-Taste.
Alle Gedanken / Vorschläge dazu werden sehr geschätzt.
Danke im Voraus,
DS
Hallo @russ_wolfinger ,
Danke für die Rückmeldung. Das hat perfekt funktioniert. Ich habe es mit einer kleinen Tuning-Tabelle getestet und die Ausgabe meines Skripts mit der des Abschnitts "Vergleichen" der XGBoost-Ausgabe verglichen, und sie stimmten zu 100% überein. Das macht jetzt Sinn, warum ich die Daten nicht mehr so extrahieren konnte wie vorher. Ich hatte mit der Baumstruktur versucht, herauszufinden, wo sich die Daten befanden, nachdem ich der Ausgabe << Report zugewiesen hatte, aber das hat nie funktioniert, und ich konnte nicht herausfinden, warum. Vielen Dank, es ist behoben und jetzt kann ich fortfahren.
Vielen Dank,
DS
Hallo @DS , Das XGBoost-Ausgabeobjekt und sein Bericht sind noch nicht direkt skriptfähig. Die einzige Möglichkeit, die Ausgabennummern derzeit zu extrahieren, besteht darin, direkt auf das Ausgabefenster zu verweisen, z. B. w = window ("") zuzuweisen, wobei <title> der Name des Fensters ist, das JMP der XGBoost-Ausgabe zuweist. Sie können dann auf alles im Anzeigebaum zugreifen, indem Sie w als Ihren Bericht behandeln. Um den vollständigen Anzeigebaum anzuzeigen, klicken Sie mit der rechten Maustaste in das obere XGBoost-Offenlegungsdreieck> Bearbeiten> Baumstruktur anzeigen.