对 Partition 平台中的拆分数量添加惩罚以减少叶子数量?我最近花了很多时间在 Partition 平台上,目前我正在寻找一种方法来自动化分析。
我的问题是这样的:通常我一直在按 50/50 训练/验证的比例拆分数据集,然后点击“Go”,这会最大化验证 Rsquare。 但,这通常会导致模型的分裂数量比真正可信的要多,例如在这里它创建了 5 个分割以获得 Validation RSquare 0.288,当只使用两个分割将获得几乎同样好的拟合 0.27 时。

因此,我通常必须始终手动修剪分割以获得可接受的良好验证 R 方,并且模型项数量较少。
有没有办法让 JMP 应用惩罚,并创建某种“正则化”验证 Rquare,根据拆分的数量惩罚模型选择标准? 例如,“正则化”验证 Rquare 可以是 [Validation Rquare] - 0.05*[N Splits]。 或者也许有更好的正则化方法(例如,如果它们可以对残差方差的至少 5% 进行建模,而不是绝对方差的 5%,则继续添加项。)
欢迎使用 JSL 解决方案,因为这主要用于自动分析。
分析脚本编写回复:对 Partition 平台中的拆分数量添加惩罚以减少叶子数量?你好@马克施瓦布,
关于您的担忧,是拆分数量真的可信,还是拆分数量相当低? 我相信可信拆分的数量是数据表中的行减 1,但不是 100%。
无论如何,我包含了一段代码,您可以使用它来进行自动分区。 我用波士顿 Housing.jmp 文件做到了这一点。
如果您熟悉 JSL,则应该能够根据需要对其进行修改。 代码相当基本,假设您有一个数字连续响应列。 它为您从第一个窗口定义的最大分区运行分区,然后保存分区统计信息。 例如,您可以轻松创建自己的列公式以具有“惩罚”验证 R 方,或者您选择惩罚分区。 然后,您可以选择最适合您的标准的分区,并使用您确定的固定分割数重新运行它。 我有一些关于如何设计程序的想法,但那是以后的事。
附带说明一下,您可能会考虑创建一个验证列(如果您没有 Pro,则可以通过在脚本索引中搜索它来完成此操作)并按响应列进行分层,这将为训练/验证集提供更多处理非 50/50 拆分时的平等代表性。 这样,您可以拥有更多数据来训练您的分区。
希望这可以帮助!,
DS
Names Default To Here( 1 );
lbWidth = 168;
//dt = Open( "$SAMPLE_DATA/Boston Housing.jmp" );
// Expression to store the current settings in global variables
recallRolesS1 = Expr(
::dtchosenRecall = dtchosen
);
// Expression to clear all current settings. KW: Clear
clearRoles = Expr(
Try(
colListY << RemoveAll;
ColListX << RemoveAll;
ColListW << RemoveAll;
ColListF << RemoveAll;
colListV << RemoveAll;
)
);
// Expression to store the current settings in global variables
recallRoles = Expr(
::ycolRecall = colListY << GetItems;
::xcolRecall = colListX << GetItems;
::WcolRecall = colListW << GetItems;
::FcolRecall = colListF << GetItems;
::vcolRecall = colListV << GetItems;
);
//Function to choose the data table to model. KW: choose_data
choose_data_table = Function( {},
list = {};
For( i = 1, i <= N Table(), i++,
list[i] = Data Table( i ) << get name
);
win = New Window( "Select a data table",
<<MODAL></MODAL>回复:对 Partition 平台中的拆分数量添加惩罚以减少叶子数量?谢谢@DiedrichSchmidt求详细回复! 我需要一些时间来消化脚本。
现在,您能否给我一个快速入门,并举例说明如何使用它? 这是我尝试过的,但出现错误:
1) 取消注释 "dt = Open( "$SAMPLE_DATA/Boston Housing.jmp" );"并运行脚本
2)点击“选择数据表”->“波士顿房屋”->确定
3) 在“操作”下,单击“确定”
4)在“JSL帮助分区”窗口中,我将“nox”转换为Y,将“age”转换为X,然后点击“OK”
5) 我看到 JMP 警报“ 'w[Outline Box("Partition for " || ycols[1])]' , w[/*###*/Outline Box( "Partition for " || ycols[ 1] )] ”。 除了范围从 1 到 20 的列“拆分”之外,表“Partition_Results”为空。
回复:对 Partition 平台中的拆分数量添加惩罚以减少叶子数量?你好@马克施瓦布,
您正在按预期使用代码,我只是做了一些猜测,这些猜测在任何情况下都不够通用。 我以为你有一个验证列,所以编写了一个脚本来运行它。下面的更新脚本通过让您输入验证部分来解决这个问题,就像在分区平台窗口中一样。 但是,不要同时使用验证列和验证部分——脚本还没有被编码来解决这个问题,而且对于所有可能的用户输入来说,还不够通用。
至于您遇到的错误,又是因为我假设过程中存在多个 X 因素,因此相应地编写了对报告窗口的引用的脚本。 现在已修复,因此无论只有 1 个 X 还是多个 X 都无关紧要。
同样,这个脚本还不够通用,无法解释非数字/非连续响应列 Y。 如果响应是分类的,则此脚本不会考虑到这一点。 如果需要,可以很容易地对其进行修改。
希望这可以帮助,
DS
更新:好的,所以我无法帮助自己编写更多代码,我包含了一些惩罚 R 方列和一个训练验证 R 方列。 您可以通过编辑代码来更改惩罚计算的公式和系数——我将其设置为您的 Rsquare-0.05*Splits 概念。 除此之外,我还包含了一些代码,用于在运行计算后以图形方式显示结果。
更新 2:我回去让代码变得更有趣——现在你可以在图表结果旁边看到表格结果,并通过选择图表上你最喜欢的点,然后你可以重新运行该特定的分区单击“确定”时的分割数。 和以前一样,我没有让它对任何类型的用户输入都超级通用,但试图让它适用于数字/连续响应。 你现在拥有的应该足以让你前进。
聚苯乙烯 在学习代码时,请使用 JMP 帮助菜单中的脚本索引。 这对于理解一些调用以及在编写脚本时如何使用它们非常有帮助。
Names Default To Here( 1 );
lbWidth = 168;
dt = Open( "$SAMPLE_DATA/Boston Housing.jmp" );
// Expression to store the current settings in global variables
recallRolesS1 = Expr(
::dtchosenRecall = dtchosen
);
// Expression to clear all current settings. KW: Clear
clearRoles = Expr(
Try(
colListY << RemoveAll;
ColListX << RemoveAll;
ColListW << RemoveAll;
ColListF << RemoveAll;
colListV << RemoveAll;
)
);
// Expression to store the current settings in global variables
recallRoles = Expr(
::ycolRecall = colListY << GetItems;
::xcolRecall = colListX << GetItems;
::WcolRecall = colListW << GetItems;
::FcolRecall = colListF << GetItems;
::vcolRecall = colListV << GetItems;
::max_spRecall = max_sp_input << get;
::partVPRecall = partVP_input << Get;
);
//Function to choose the data table to model. KW: choose_data
choose_data_table = Function( {},
list = {};
For( i = 1, i <= N Table(), i++,
list[i] = Data Table( i ) << get name
);
win = New Window( "Select a data table",
<<MODAL></MODAL>