你好
我记得 JMP Pro 里有个“创建验证列”的功能,但我不知道如何在普通版 JMP中使用 JSL 创建一个验证列(25% 训练集和 75% 验证集)?非常感谢您的帮助。
你好,
根据 Dan 关于随机分配的警告,这会做到(在本例中,对于 75% 的训练数据)。
dt << new column ("Validation", nominal, <<SET values=""> 0.75*nrow(dt))));
</SET>
为什么这有效:
1) (1::nrow)`片段创建一个列向量 [1 2 3 ... nrow(dt)],并将其转置(使用 ` 运算符)到行向量 [1,2,3, .. .nrow(dt)]。
2) 然后,将该行向量与 0.75*nrow(dt) 进行比较。 如果大于则赋值 1,否则赋值 0。 所以,假设我们有 nrow(dt) = 100。 那么原始向量是:
[1, 2, 3, ..., 74, 75, 76, 77, ... 100]。 与75比较后,结果向量为:
[0, 0, 0, ... , 0, 0, 1, 1, ... 1]。 也就是说,75 个 0 后跟 25 个 1。
3) Randomshuffle ( ) 将向量的内容按随机顺序排列...因此将以随机方式遇到 75 个 0 和 25 个 1(仍以 100 行的表为例)。
4) 最后,<< set values 消息用随机排列的 75 个 0 和 25 个 1 填充该列。
FWIW,另一种交互方式是从主菜单中选择 Cols > New Columns...,然后如下填写对话框:

干杯,
布雷迪
交互操作非常简单。 使用这种方法,JSL 步骤也应该是直接的。
创建一个名为 Validation 的列。
用 0 填充整个列。 零表示训练集观察。
转到表 > 子集。
输入 0.75 的随机采样率(对于 75% 的验证集)。
选中链接到原始数据表的复选框。
单击确定。
在子集表中,将验证字段从 0 更改为 1。
右键单击 1 和填充到表的末尾。
关闭子集表。
我对我的 JSL 相当松散(没有为避免潜在问题而设置适当的范围),但它应该给你一个很好的开始。
dt=Current Data Table();
dt << New Column( "Validation",
Numeric,
"Nominal",
Format( "Best", 12 )
);
For Each Row (:Validation = 0);
dt << Subset(
Output Table("ValData"),
Linked,
Suppress formula evaluation( 0 ),
Sampling Rate( 0.75 ),
Selected columns only( 0 )
);
For Each Row (:Validation = 1);
Close( "ValData" );
dt << Clear Select;
请注意,这严格按照随机分配进行。 很多时候你真的应该根据目标变量对验证进行分层。
我的方法是我隐藏了好几年的东西。 布雷迪在下面有两种更好的方法。