JSL: Hilfe beim Zugriff auf Berichtsinformationen: XPath oder Baumstruktur?Hallo Skripter,
Ich habe Schwierigkeiten, auf Informationen in einem Bericht zuzugreifen, der von der XGBoost-Add-In-Plattform stammt. Ich verwende ein JSL-Programm, mit dem ich eine Tabelle mit verschiedenen XGB-Modellen erstelle – unterschiedliche Tiefen, Lernraten, Iterationen usw. Dieser Code führt die XGBoost-Plattform aus und ruft dann Informationen aus dem XGB-Bericht ab, um sie in einer Ausgabedatentabelle zu speichern.
Die Schwierigkeit besteht darin, einen Teil des Codes zu verallgemeinern, um Informationen mithilfe der Befehle Outline box() und NumberColBox() abzurufen. Im Anhang finden Sie einen Beispielbericht und einen Screenshot.

Es gibt insgesamt vier Zahlenspalten, aus denen ich Daten abrufen möchte – im Screenshot rot umrandet. Normalerweise würde ich ein JSL-Skript wie das folgende schreiben, um die Nummer des Gliederungsfelds und die Nummer des Zahlenspaltenfelds zu definieren, um dann die Daten abzurufen und in einer Liste zu speichern, die ich dann nach Bedarf den Spalten in meiner Ausgabedatentabelle zuordnen kann.
o_box = 1;
t_ncol_box = 35;
n_ncol_box = 36;
Tconfrates_ncol_box1 = 28;
Tconfrates_ncol_box2 = 29;
Tdata = w[Outline Box( o_box ), Number Col Box( t_ncol_box )] << Get;
NT = w[Outline Box( o_box ), Number Col Box( n_ncol_box )] << Get;
TConfR1 = w[Outline Box( o_box ), Number Col Box( Tconfrates_ncol_box1 )] << Get;
TConfR2 = w[Outline Box( o_box ), Number Col Box( Tconfrates_ncol_box2 )] << Get;
Dieses JSL funktioniert mit den folgenden Ausgaben einwandfrei:
Tdata = {0,92503341611747, 0,937048078393258, 0,0137071818977882, 0,0387471836917961,
0,012822908993725, 0}
NT = {6253}
TConfR1 = {1, 0}
TConfR2 = {0, 1}
Ich weiß, dass ich einige der Daten auch abrufen kann, indem ich speziell auf das Gliederungsfeld und das Zahlenspaltenfeld verweise, etwa:
Tdata = w[Outline Box( "Fit Details" ), Number Col Box( "Training" )] << Get;
Aufgrund der Struktur des Berichts wird jedoch die Anzahl der im Datensatz verwendeten Zeilen nicht angezeigt – in diesem Beispiel das nächste Zahlenspaltenfeld mit dem Wert 6253 (es gibt keinen Titel). Und wie kann ich auf die Confusion Matrix-Raten verweisen – die Pass/Pass- und Pass/Fail-Raten? Ein ähnlicher Code für die Confusion Matrix-Raten
TConfR1 = w[Outline Box( "Training" ), Number Col Box( "Pass" )] << Get;
TConfR2 = w[Outline Box( "Training" ), Number Col Box( "Fail" )] << Get;
erhält die Anzahl der Konfusionsmatrix, nicht die Raten (zugegeben, ich kann die Raten aus den Anzahlen berechnen, aber der sofortige Zugriff auf die Informationen wäre einfacher).
Wenn der Code jedoch die nächste Iteration in der Tabelle durchläuft (mit anderen Modellparametern), ändern sich die Werte der Zahlenspaltenfelder für dieselben Daten im Bericht. Beispielsweise ist t_ncol_box beim zweiten Mal nicht 35, sondern jetzt 43.
Leider scheint die Standardmethode zum Verweisen auf die Berichts- und Gliederungsfelder nicht wirklich zu funktionieren. Dieses Problem ist mir bei anderen Modellierungsplattformen in JMP, wie Boosted Trees, Neural Net, Bootstrap Forest und anderen, nicht begegnet. Ich dachte daran, über XPath darauf zuzugreifen, kenne mich damit aber nicht gut genug aus, um die gewünschten Werte korrekt zu extrahieren – insbesondere, wenn sich der Wert des Zahlenspaltenfelds ändert – und das Zahlenspaltenfeld hat nicht immer einen Titel, mit dem man arbeiten kann – beispielsweise die Anzahl der Datenpunkte im Trainingssatz N, es ist nur die nächste Iteration im Zahlenspaltenfeld aus den Trainingsanpassungsdetails (Entropy RSquare, RASE usw.).
Ich dachte, ich könnte den „alten?“ oder „traditionellen?“ Weg mit einer logischen Anweisung umgehen, die den Wert der Variablen der Spaltenfelder ändert, wenn der Modellschritt == 1 oder !=1 ist, aber nach 16 Modellen änderten sich die Werte erneut – und erneut bei 34. Es muss einen effizienteren Weg geben, auf die Daten zuzugreifen, ohne logische Anweisungen für bestimmte Modellschrittwerte wie bei i=16 oder i=34 einfügen zu müssen. Das ist nicht so einfach, wenn sich der Wert des Spaltenfelds ändern kann und man nicht versteht, warum.
Für Vorschläge, wie man dies mit einer Methode erreichen kann, die flexibler auf die ständige Änderung des Wertes im Spaltenfeld des Berichts reagiert, und auch für Vorschläge ohne Titel wäre ich sehr dankbar. Ich hätte gerne eine möglichst verallgemeinerbare Lösung, da die von mir modellierte Y-Spalte ein zweistufiger ordinaler/nominaler, dreistufiger ordinaler/nominaler oder kontinuierlicher Datentyp sein könnte.
Danke!,
DS
Automatisierung und SkriptingDatenzugriffMassenanpassungBetreff: JSL: Hilfe beim Zugriff auf Berichtsinformationen: XPath oder Baumstruktur?Mit etwas wie diesem können Sie leicht auf die Gliederungsfelder verweisen
ob_cm = rep[OutlineBox("Confusion Matrices")];
Dann erkunden Sie, was sich darunter befindet. In diesem Fall könnte die Spalte „span box“ eine gute Referenz sein.
Show(cpb[1] << get, cpb[2] << get);
oder zweite Tischbox nehmen
tb = rep[OutlineBox("Confusion Matrices"), Table Box(2)];
cpb << get as matrix;
Auf Passformdetails kann mit einer ähnlichen Idee zugegriffen werden, aber Sie können einfach den Namen des Nummernspaltenfelds verwenden (wie Sie es bereits getan haben).
tb_val = rep[OutlineBox("Fit Details"), Table Box(1), Number Col Box("Training")] << Get;
show(tb_val);
</CODE></P>
<BR />
</LINGO-BODY>
<LINGO-SUB id="lingo-sub-890752" slang="en-US" mode="CREATE">Betreff: JSL: Hilfe beim Zugriff auf Berichtsinformationen: XPath oder Baumstruktur?</LINGO-SUB>
<LINGO-BODY id="lingo-body-890752" slang="en-US" mode="CREATE">
<P>Ich bin nicht sicher, wie hilfreich das ist. Aber falls Sie oder jemand anderes einige XPath-Beispiele sehen möchte, finden Sie hier eine Reihe von Beispielen, auf die ich mich beziehe, wenn ich XPath verwende. Sie wissen es vielleicht schon, aber falls nicht: Die Seite „Bearbeiten -> Eigenschaften“ zeigt Ihnen die Baumstruktur mit Interaktivität, wenn Sie mit der Maus über Bereiche des Berichts fahren und auf diese klicken. Sie können also auf den gewünschten Bereich (Zahlenspaltenfeld usw.) klicken, und die zugehörigen Informationen werden Ihnen im Eigenschaftenbereich angezeigt. Sie können das Gliederungsfeld „Boxpfad“ im Eigenschaftenbereich erweitern, und es wird Ihnen je nach Dropdown-Auswahl der Gliederungsbaumcode oder der XPath-Code angezeigt, und Sie können von dort aus verallgemeinern. Das Symbol ganz rechts im Boxpfadbereich kopiert den Code.</P>
<BR />
<P>Sie können das Ganze ausführen, aber überspringen Sie die letzten 20 Zeilen oder so und verwenden Sie ein assoziatives Array für die Ausgabe der letzten Bits von XPath.<BR /><BR /> Ich vermute, Sie können etwas Ähnliches verwenden und nach „Training“ oder „Vorhergesagte Rate“ suchen und dann, wie Jarmo sagt, die Ergebnisse untersuchen.</P>
<BR />
<P>Alles, was auskommentiert ist, funktioniert nicht. Ich habe das seit Jahren nicht mehr debuggt und kann mich nicht erinnern, ob dieser Teil überhaupt gültiger Code ist.:)</img></P>
<BR />
<PRE><CODE class=" language-jsl">// This is a file containing some examples of xpath, which is useful for traversing display trees (outline boxes and other display boxes) and getting data from these reports. For example, getting mean and st dev from the summary stats section of a distribution report window, or an Rsquare from a fit y by x. both of these are shown below.
//Tip: go to Edit -> Properties from a report output. Expand the 'Box Path' outline box in the properties pane. Switch between Subscript and Xpath to see the different paths. and change the root to whatever is convenient. Right most icon here is copy, so you can copy / paste the code.
//below focuses on xpath.
names default to here(1);
open("$SAMPLE_DATA\Semiconductor Capability.jmp");
myDist = Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :NPN1 ),
Customize Summary Statistics(
Robust Mean( 1 ),
Robust Std Dev( 1 )
),
Capability Analysis( 1 )
),
Continuous Distribution(
Column( :PNP1 ),
Customize Summary Statistics(
Robust Mean( 1 ),
Robust Std Dev( 1 )
),
Capability Analysis( 1 )
),
Continuous Distribution(
Column( :PNP2 ),
Customize Summary Statistics(
Robust Mean( 1 ),
Robust Std Dev( 1 )
),
Capability Analysis( 1 )
)
);
reportObj=myDist<
<XPATH>
0 & StdIndx > 0, mean = statList[MnIndx]; std = statList[StdIndx]; , mean = -999; std = -999; ); show(mean, std); /*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ reportObj=myDist<
<XPATH></XPATH>
</XPATH>
<BR /> <BR />
Betreff: JSL: Hilfe beim Zugriff auf Berichtsinformationen: XPath oder Baumstruktur?Hallo @jthi ,
Vielen Dank für Ihre schnelle Antwort und Ihre Vorschläge. Sie haben mir geholfen, und ich konnte mit einigen kleinen Änderungen an Ihren Vorschlägen auf die richtigen Daten zugreifen. Ich habe mich letztendlich für diese Lösung entschieden, aber Ihre Vorschläge waren die richtige Lösung, danke!
Tdata = w[Outline Box( "Fit Details" ), Number Col Box( "Training" )] << Get;
NT = w[Outline Box( "Fit Details" ), ColStackBox( 1 ), Number Col Box( 2 )] << Get;
TConfR1 = w[Outline Box( "Confusion Matrices" ), Table Box( 2 ), Number Col Box( y_levels[1] )] << Get;
TConfR2 = w[Outline Box( "Confusion Matrices" ), Table Box( 2 ), Number Col Box( y_levels[2] )] << Get;
Ich musste nur sicherstellen, dass ich auf die richtige ColStackBox und Table Box unter der jeweiligen Outline Box zugegriffen habe.
Nochmals vielen Dank für die Hilfe!,
DS
Betreff: JSL: Hilfe beim Zugriff auf Berichtsinformationen: XPath oder Baumstruktur?Hallo @mikedriscoll ,
Wow, echt cool! Ich kenne sowohl die Optionen „Bearbeiten > Baumstruktur anzeigen“ als auch „Eigenschaften anzeigen“ aus dem Rechtsklick auf das graue Dreieck, aber den Boxpfad und die zugehörigen Optionen kannte ich nicht. Das ist SEHR hilfreich, danke. Ich werde das in Zukunft unbedingt verwenden, um XPath- und Indexinformationen für Berichte abzurufen. Das macht es definitiv etwas einfacher, vom Baumstrukturbericht aus, in dem einige Informationen zu fehlen scheinen, zu verallgemeinern. Es wäre schön, wenn es eine Option gäbe, sowohl Baumstruktur- als auch Eigenschafteninformationen gleichzeitig anzuzeigen. Danke für den Vorschlag. Ich halte das definitiv für eine weitere sinnvolle Lösung, also markiere ich sie ebenfalls. Danke auch für den XPath-Beispielcode. Ich denke, es wird hilfreich sein, das zu studieren und mich mit der richtigen Verwendung von XPath vertraut zu machen.
Danke!,
DS
Betreff: JSL: Hilfe beim Zugriff auf Berichtsinformationen: XPath oder Baumstruktur?Es freut mich, dass ich Ihnen helfen konnte!
@SDF1 schrieb:
Es wäre schön, wenn es eine Option gäbe, sowohl Baumstruktur- als auch Eigenschafteninformationen gleichzeitig anzuzeigen.
Dies scheint nun möglich zu sein. Ich sehe in meiner JMP-Version keine Option zum Bearbeiten -> Baumstruktur anzeigen, aber so würde ich das machen.
1. Erweitern Sie bei der Berichtsausgabe mit nicht angezeigten Eigenschaften das Fenster nach rechts, sodass über den Standard hinaus, den JMP beim Erstellen des Berichtsfensters erstellt hat, zumindest etwas „neuer“ Leerraum vorhanden ist.
2. Strg+Umschalt + Rechtsklick in den „neuen“ leeren Bereich und auf „Baumstruktur anzeigen“ klicken (ich habe dies mit angezeigten Eigenschaften versucht und einmal andere Ergebnisse erhalten, bin nicht sicher)
3. Gehen Sie im ursprünglichen Berichtsfenster (nicht im Baumstrukturfenster) zu Bearbeiten -> Eigenschaften anzeigen