JSL: Ayuda para acceder a la información del informe: ¿Xpath o estructura de árbol?Hola guionistas,
Tengo dificultades para acceder a la información de un informe proveniente de la plataforma del complemento XGBoost. Tengo un programa JSL donde genero una tabla de diferentes modelos XGB (diferentes profundidades, tasas de aprendizaje, iteraciones, etc.). Este código ejecuta la plataforma XGBoost y luego extrae la información del informe XGB para almacenarla en una tabla de datos de salida.
La dificultad que tengo es intentar generalizar parte del código para extraer información mediante los comandos Outline box() y NumberColBox(). Adjunto un informe de ejemplo y una captura de pantalla a continuación.

Hay un total de cuatro cuadros de columna numéricos de los que quiero extraer datos, resaltados en rojo en la captura de pantalla. Normalmente, escribiría un JSL como el siguiente para definir el número del cuadro de esquema y el número del cuadro de columna numérico para luego obtener los datos y almacenarlos en una lista, que luego puedo asignar a las columnas según sea necesario en mi tabla de datos de salida.
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;
Este JSL funciona bien con las siguientes salidas:
Tdatos = {0,92503341611747, 0,937048078393258, 0,0137071818977882, 0,0387471836917961,
0.012822908993725, 0}
NT = {6253}
TConfR1 = {1, 0}
TConfR2 = {0, 1}
Sé que también puedo obtener algunos de los datos haciendo referencia específicamente al cuadro de esquema y al cuadro de columna de número como:
Tdata = w[Outline Box( "Fit Details" ), Number Col Box( "Training" )] << Get;
Sin embargo, debido a la organización del informe, no incluye el número de filas utilizadas en el conjunto de datos (el siguiente cuadro de la columna numérica tiene el valor 6253 en este ejemplo, sin título). Además, ¿cómo puedo referenciar las tasas de la Matriz de Confusión (las tasas de aprobado/aprobado y aprobado/reprobado)? Un código similar para las tasas de la Matriz de Confusión.
TConfR1 = w[Outline Box( "Training" ), Number Col Box( "Pass" )] << Get;
TConfR2 = w[Outline Box( "Training" ), Number Col Box( "Fail" )] << Get;
obtendrá los recuentos de la matriz de confusión, no las tasas (por supuesto, puedo calcular las tasas a partir de los recuentos, pero acceder a la información de inmediato sería más fácil).
Sin embargo, al ejecutar el código en la siguiente iteración de la tabla (con diferentes parámetros de modelo), los valores de los cuadros de la columna numérica cambian para los mismos datos en el informe. Por ejemplo, t_ncol_box no es 35 la segunda vez, sino 43.
Lamentablemente, parece que la forma estándar de referenciar los cuadros de informe y esquema no funcionará. No he encontrado este problema con otras plataformas de modelado en JMP, como Boosted Trees, Neural Net, Bootstrap Forest y otras. Pensaba acceder mediante XPath, pero no lo conozco lo suficiente como para extraer correctamente los valores que me interesan, especialmente cuando cambia el valor del cuadro de la columna numérica, y este no siempre tiene un título con el que trabajar; por ejemplo, el número de puntos de datos en el conjunto de entrenamiento N es simplemente la siguiente iteración en el cuadro de la columna numérica a partir de los detalles del ajuste de entrenamiento (Entropy RSquare, RASE, etc.).
Pensé que podría evitar el método tradicional con una sentencia lógica que cambiara el valor de las variables del cuadro de la columna numérica si el paso del modelo era 1 o !=1, pero después de 16 modelos, los valores volvieron a cambiar, y de nuevo en 34. Debe haber una forma más eficiente de acceder a los datos sin tener que incluir sentencias lógicas para valores específicos del paso del modelo, como i=16 o i=34. No es tan fácil cuando el valor del cuadro de la columna numérica puede cambiar sin entender por qué.
Agradecería cualquier sugerencia sobre cómo hacer esto con un método más flexible que se ajuste a la forma en que el informe cambia el valor del cuadro de la columna numérica, y para los que no tienen título. Me gustaría una solución lo más generalizable posible, ya que la columna Y que estoy modelando podría ser un tipo de dato ordinal/nominal de 2 niveles, ordinal/nominal de 3 niveles o continuo.
¡Gracias!,
DS
Automatización y scriptingAcceso a datosPersonalización masivaRe: JSL: Ayuda para acceder a la información del informe: ¿Xpath o estructura de árbol?Puedes obtener referencias a los cuadros de esquema fácilmente con algo como esto
ob_cm = rep[OutlineBox("Confusion Matrices")];
Luego explora lo que hay debajo de ellos, en este caso el cuadro col span podría ser una buena referencia
Show(cpb[1] << get, cpb[2] << get);
o tomar segunda caja de mesa
tb = rep[OutlineBox("Confusion Matrices"), Table Box(2)];
cpb << get as matrix;
Se puede acceder a los detalles de ajuste con una idea similar, pero puedes simplemente usar el nombre del cuadro de columna de número (como ya lo hiciste)
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">Re: JSL: Ayuda para acceder a la información del informe: ¿Xpath o estructura de árbol?</LINGO-SUB>
<LINGO-BODY id="lingo-body-890752" slang="en-US" mode="CREATE">
<P>No estoy seguro de la utilidad de esto. Pero si usted o alguien más desea ver ejemplos de XPath, aquí tiene un conjunto de ejemplos que utilizo cuando uso XPath. Quizás ya lo sepa, pero si no, la página Editar -> Propiedades le mostrará la estructura de árbol, con interactividad al pasar el cursor y hacer clic en las áreas del informe. Así, puede hacer clic en el área de interés (cuadro de número, columna, etc.) y se mostrará la información relacionada en el panel de propiedades. Puede expandir el cuadro de contorno "Ruta de cuadro" en el panel de propiedades y se mostrará el código del árbol de contorno o el código de XPath, según la opción del menú desplegable, y puede generalizar a partir de ahí. El icono más a la derecha en el área de la ruta de cuadro copiará el código.</P>
<BR />
<P>Puedes ejecutar todo, pero salta a las últimas 20 líneas aproximadamente y usa una matriz asociativa en la salida de los últimos bits de xpath.<BR /><BR /> Sospecho que puedes usar algo similar a esto y buscar "Entrenamiento" o "Tasa prevista" y luego, como dice Jarmo, explorar los resultados.</P>
<BR />
<P>Todo lo comentado no funciona. No lo he depurado en años y no recuerdo si esa parte es código válido.:)</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 />
Re: JSL: Ayuda para acceder a la información del informe: ¿Xpath o estructura de árbol?Hola @jthi ,
Gracias por tu rápida respuesta y tus sugerencias. Me ayudaron y pude acceder a los datos correctos con algunas modificaciones menores. Al final opté por esto para mi situación, pero tus sugerencias fueron la solución correcta, ¡gracias!
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;
Solo necesitaba asegurarme de que estaba accediendo al ColStackBox y al Table Box correctos debajo del Outline Box respectivo.
¡Gracias de nuevo por la ayuda!,
DS
Re: JSL: Ayuda para acceder a la información del informe: ¿Xpath o estructura de árbol?Hola @mikedriscoll ,
¡Genial! Conozco las opciones Editar > Mostrar Estructura de Árbol y Mostrar Propiedades al hacer clic derecho en el triángulo gris, pero no conocía la Ruta de Cuadro ni sus opciones asociadas. Es muy útil, gracias. Sin duda, lo usaré en el futuro para obtener la información de XPath y Subíndice para los informes. Esto facilita la generalización a partir del informe de Estructura de Árbol, al que parece faltarle información. Sería bueno que hubiera una opción para mostrar simultáneamente la información de Estructura de Árbol y Propiedades. Gracias por la sugerencia; creo que es otra solución válida, así que la marcaré. Gracias también por el código XPath de ejemplo. Creo que me será útil estudiarlo y empezar a familiarizarme con el uso correcto de XPath.
¡Gracias!,
DS
Re: JSL: Ayuda para acceder a la información del informe: ¿Xpath o estructura de árbol?¡Encantado de ayudarle!
@SDF1 escribió:
Sería bueno si tuvieran una opción para mostrar la información de Estructura del árbol y Propiedades simultáneamente.
Parece que ya es posible. No veo la opción "Editar -> Mostrar estructura de árbol" en mi versión de JMP, pero así es como lo haría.
1. Desde la salida del informe con Propiedades no mostradas, expanda la ventana hacia la derecha para que haya al menos un espacio en blanco "nuevo" más allá del valor predeterminado que JMP creó cuando creó la ventana del informe.
2. Ctrl+Shift + clic derecho en ese "nuevo" espacio en blanco y haga clic en "mostrar estructura de árbol" (probé esto con las propiedades mostradas y obtuve resultados diferentes una vez, no estoy seguro)
3. Desde la ventana del informe original (no la ventana de estructura de árbol), vaya a editar -> mostrar propiedades