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

因此,我通常必须始终手动修剪分割,以获得可接受的良好验证 R 方和可接受的较低数量的模型项。
有没有办法要求 JMP 应用惩罚,并创建某种“正规化”验证 R 方,根据分割数量惩罚模型选择标准? 例如,“正则化”验证 R 方可以是 [验证 R 方] - 0.05*[N 分割]。 或者也许有更好的正则化方法(例如,如果可以建模至少 5% 的残差方差,而不是 5% 的绝对方差,则继续添加项。)
JSL 解决方案很受欢迎,因为这主要用于自动化分析。
预测建模和机器学习回复:对分区平台中的拆分数量添加惩罚以减少叶子数量?你好@markschwab ,
您正在按预期使用代码,我刚刚做了一些猜测,这些猜测不够通用,无法在任何情况下工作。 我以为您有一个验证列,因此将其编写为与一个验证列一起运行的脚本。下面更新的脚本通过让您输入验证部分来解决这个问题,就像在分区平台窗口中一样。 但是,不要同时使用验证列和验证部分——该脚本尚未编码来解释这一点,并且对于所有可能的用户输入来说,它又不够通用。
至于您遇到的错误,这又是因为我假设该过程中存在多个 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>回复:对分区平台中的拆分数量添加惩罚以减少叶子数量?谢谢@SDF1以获得详细答复! 我需要一些时间来消化剧本。
现在,您能给我一个快速入门指南,并举例说明如何使用它吗? 这是我尝试过的,但出现错误:
1) 取消注释行 "dt = Open( "$SAMPLE_DATA/Boston Housing.jmp" );"并运行脚本
2)点击“选择数据表”->“波士顿住房”->确定
3) 在“操作”下,单击“确定”
4) 在窗口“JSL to help with Partitioning”中,我将“nox”投射到 Y 中,将“age”投射到 X 中,然后单击“确定”
5) 我看到 JMP 警报“访问或评估 'w[Outline Box("Partition for " || ycols[1])]'、w[/*###*/Outline Box("Partition for " || ycols[ 1] )] ”。 除了范围为 1-20 的“Splits”列之外,表“Partition_Results”为空。
回复:对分区平台中的拆分数量添加惩罚以减少叶子数量?你好@markschwab ,
关于您的担忧,分裂的数量是否真的可信,或者分裂的数量相当低? 我相信可信的分割数是数据表中的行数减 1,但不是 100%。
不管怎样,我提供了一段代码,您可以使用它来进行自动分区。 我对 Boston 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>