こんにちは、
JGBコードを使用してXGBoostレポートから統計の一部を抽出しようとしています(右クリックするのではなく、データテーブルにする)。他のいくつかのプラットフォーム(例:ブーストされたツリーやブートストラップフォレスト)でこれを問題なく実行していますが、何らかの理由でXGBoostで動作させるのに苦労しています。
他のプラットフォームでは、私が実行するテーブルには基本的にチューニングテーブルを使用するスクリプトがありますが、それらを一度に1つずつ当てはめていき、統計を抽出します。しかし、XGBoostで動作するように同様のアプローチを変更しても機能しません。XGBoostレポートに、これを妨げる何かがありますか?
例として、ブートストラップフォレストモデリングの場合、次のようなことができます。
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.
);上記の方法は、RAMをあまり消費せずに多数のブートストラップフォレストの実行を実行する場合に非常にうまく機能します。RSquare、RASE、Nなどを[Overall Statistics]アウトラインボックスから簡単に記録できます。
同様のスクリプト(下記)を実行すると、次の場所でエラーがスローされます:report ["Outline Box"] [Number Col Box(1)] <<行を取得します。
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.
); Train RSquareなど、「比較」[テーブルボックス(1)]で表示される各フィットの統計を取得しようとしていますが、数値列ボックスへの参照が機能していないようです-それは()1、2、3、4などの値は関係ありません。それらはすべて同じエラーをスローします。各適合後のトレーニングと検証のために、RSqaure、Corr、およびRMSEの値を保存したいと思います。 「Model 1」アウトラインボックスの下で「Actual by Predicted」という子の下で試してみて、トレーニング結果と検証結果のNumber Col Box()(たとえば(12または13))を探して、そこで値を抽出するために、まだログファイルにスローされるエラーが発生します。
私が得るエラーは:
'report ["Compare"] [Number Col Box(1)]'、report ["Compare"] [/ * ### * / Number Col Box(1)]のアクセスまたは評価でオブジェクトが添え字付きにならない
次のスクリプトでは、/ * ### * /でマークされたエラー
Stat_1 = report ["Compare"] [/ * ### * / Number Col Box(1)] <<取得
かっこや「接着剤」がないことはわかっています。スクリプトで。
他のレポートから値を抽出できる理由がわかりませんが、XGBoostレポートでは抽出できないようです。JSLコードに欠けているものはありますか?
「モデル1」のアウトラインボックスから数値を取得する方が良いと思います。「比較」のアウトラインボックスには常にコアとRMSEの値が表示されないためです。ホットボタンで変更しない限り、
これについての考え/提案は大歓迎です。
前もって感謝します、
DS
こんにちは @DS XGBoost出力オブジェクトとそのレポートは、まだ直接スクリプト化できません。 現在出力番号を抽出できる唯一の方法は、出力ウィンドウを直接参照することです。たとえば、w = window( "")を割り当てます。ここで、<title>は、JMPがXGBoost出力に割り当てるウィンドウの名前です。 その後、wをレポートとして扱うことにより、表示ツリー内のあらゆるものにアクセスできます。 表示ツリー全体を表示するには、上部のXGBoost開閉用三角ボタンを右クリックし、[編集]> [ツリー構造を表示]をクリックします。