你好
我記得 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;
請注意,這嚴格按照隨機分配進行。 很多時候你真的應該根據目標變量對驗證進行分層。
我的方法是我隱藏了好幾年的東西。 布雷迪在下面有兩種更好的方法。