對 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>