Salut,
J'essaie d'extraire certaines des statistiques du rapport XGBoost en utilisant le code JSL (plutôt que de cliquer avec le bouton droit de la souris> transformer en table de données). Je fais cela avec certaines des autres plates-formes (par exemple, l'arbre boosté et la forêt bootstrap) sans aucun problème, mais pour une raison quelconque, j'ai du mal à le faire fonctionner dans XGBoost.
Dans les autres plates-formes, j'ai essentiellement un script dans la table que je lance qui utilise une table de réglage, mais les ajuste une à la fois et extrait les statistiques au fur et à mesure. Mais modifier une approche similaire pour travailler avec XGBoost ne fonctionne pas. Y a-t-il quelque chose dans le rapport XGBoost qui empêcherait cela?
À titre d'exemple, pour la modélisation de forêt bootstrap, je peux faire quelque chose comme ce qui suit:
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.
);La méthode ci-dessus fonctionne très bien si vous souhaitez exécuter BEAUCOUP de forêts d'amorçage sans consommer trop de RAM. Vous pouvez facilement enregistrer RSquare, RASE, N, et ainsi de suite à partir de la zone de contour "Statistiques globales".
Lorsque j'exécute un script similaire (ci-dessous), il renvoie une erreur au: 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.
); J'essaie d'obtenir les statistiques pour chaque ajustement qui apparaissent dans la "Compare" [Table Box (1)], comme Train RSquare et ainsi de suite, mais la référence à la Number Col Box semble ne pas fonctionner - cela peu importe la valeur de () 1, 2, 3, 4, etc. ils lancent tous la même erreur. Je souhaite enregistrer les valeurs RSqaure, Corr et RMSE pour l'entraînement et la validation après chaque ajustement. Même si je l'essaie sous la zone de contour "Modèle 1", l'enfant "Réel par prédiction", et que je recherche la zone de colonne numérique () - par exemple (12 ou 13) - pour les résultats de la formation et les résultats de validation, et essayez pour extraire les valeurs là-bas, j'obtiens toujours une erreur qui est lancée dans le fichier journal.
L'erreur que j'obtiens est:
objet non indexable lors de l'accès ou de l'évaluation de 'rapport ["Compare"] [Number Col Box (1)]', report ["Compare"] [/ * ### * / Number Col Box (1)]
Dans le script suivant, erreur marquée par / * ### * /
Stat_1 = rapport ["Comparer"] [/ * ### * / Number Col Box (1)] << Obtenir
Je sais que je ne manque aucune parenthèse ou "colle"; dans le script.
Je ne comprends pas pourquoi je peux extraire des valeurs d'autres rapports, mais je n'arrive pas à le faire avec le rapport XGBoost. Y a-t-il quelque chose qui me manque dans le code JSL?
Je pense qu'obtenir les nombres de la zone de contour "Modèle 1" sera mieux car la zone de contour "Comparer" n'affiche pas toujours les valeurs Corr et RMSE - à moins que vous ne modifiez cela avec le bouton de raccourci.
Toute réflexion / suggestion à ce sujet est très appréciée.
Merci d'avance,
DS