對分區平台中的拆分數量添加懲罰以減少葉子數量?我最近在分區平台上花了很多時間,目前我正在尋找一種自動化分析的方法。
我的問題是這樣的:一般來說,我一直將資料集以 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>