Hola,
Estoy tratando de extraer algunas de las estadísticas del informe XGBoost usando código JSL (en lugar de hacer clic derecho> convertir en tabla de datos). Hago esto con algunas de las otras plataformas (por ejemplo, árbol impulsado y bosque de arranque) sin ningún problema, pero por alguna razón estoy teniendo dificultades para que funcione en XGBoost.
En las otras plataformas, básicamente tengo un script en la tabla que ejecuto que usa una tabla de ajuste, pero los ajusta de uno en uno y extrae las estadísticas a medida que avanza. Pero modificar un enfoque similar para trabajar con XGBoost no funciona. ¿Hay algo en el informe XGBoost que pueda evitar esto?
Como ejemplo, para el modelado de bosque bootstrap, puedo hacer algo como lo siguiente:
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.
);El método anterior funciona muy bien si desea ejecutar MUCHAS ejecuciones de bosque de arranque sin consumir demasiada RAM. Puede registrar fácilmente RSquare, RASE, N, etc. desde el cuadro de esquema "Estadísticas generales".
Cuando ejecuto una secuencia de comandos similar (a continuación), arroja un error en: informe ["Cuadro de esquema"] [Cuadro de columna numérica (1)] << Obtener línea.
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.
); Estoy tratando de obtener las estadísticas para cada ajuste que aparece en "Comparar" [Cuadro de tabla (1)], como Train RSquare y así sucesivamente, pero la referencia al Cuadro de columna numérica parece no funcionar. no importa qué valor esté en () 1, 2, 3, 4, etc. todos arrojan el mismo error. Me gustaría guardar los valores de RSqaure, Corr y RMSE para entrenamiento y validación después de cada ajuste. Incluso si lo intento en el cuadro de esquema "Modelo 1", el elemento secundario "Real por predicho" y busco el Cuadro de columna numérica (), por ejemplo, (12 o 13), para ver los resultados del entrenamiento y los resultados de validación, y prueba para extraer los valores allí, todavía recibo un error que se arroja en el archivo de registro.
El error que obtengo es:
el objeto no se puede suscribir en el acceso o evaluación de 'informe ["Comparar"] [Número Col Box (1)]', informe ["Compare"] [/ * ### * / Número Col Box (1)]
En el siguiente script, error marcado por / * ### * /
Stat_1 = report ["Compare"] [/ * ### * / Number Col Box (1)] << Obtener
Sé que no me falta ningún paréntesis o "pegamento"; en el guión.
No entiendo por qué puedo extraer valores de otros informes, pero parece que no puedo hacerlo con el informe XGBoost. ¿Hay algo que me falta en el código JSL?
Creo que será mejor obtener los números del cuadro de esquema "Modelo 1" porque el cuadro de esquema "Comparar" no siempre muestra los valores de Corr y RMSE, a menos que lo modifique con el botón de acceso rápido.
Cualquier comentario / sugerencia sobre esto es muy apreciado.
Gracias por adelantado,
DS