大家好
我是JMP Japan的測試員小野裕介。
在我看來,當使用k倍驗證時,預測值有時會變得非常嘈雜。請參見下面的屏幕截圖。這是具有一個X變量的模型的預測值的曲線圖。使用5折驗證。

我建議我們預測值的計算方法如下。
(0 + :Name( "y Predictor FoldA==1" ) + :Name( "y Predictor FoldA==2" ) +
:Name( "y Predictor FoldA==3" ) + :Name( "y Predictor FoldA==4" ) +
:Name( "y Predictor FoldA==5" )) / 5
當前的預測公式如下。
If( :N Val > 0,
(0 + :Name( "FoldA==1" ) * :Name( "y Predictor FoldA==1" ) + :Name( "FoldA==2" )
* :Name( "y Predictor FoldA==2" ) + :Name( "FoldA==3" ) *
:Name( "y Predictor FoldA==3" ) + :Name( "FoldA==4" ) *
:Name( "y Predictor FoldA==4" ) + :Name( "FoldA==5" ) *
:Name( "y Predictor FoldA==5" )) / :N Val,
(0 + (1 - :Name( "FoldA==1" )) * :Name( "y Predictor FoldA==1" ) + (1 -
:Name( "FoldA==2" )) * :Name( "y Predictor FoldA==2" ) + (1 -
:Name( "FoldA==3" )) * :Name( "y Predictor FoldA==3" ) + (1 -
:Name( "FoldA==4" )) * :Name( "y Predictor FoldA==4" ) + (1 -
:Name( "FoldA==5" )) * :Name( "y Predictor FoldA==5" )) / :N Trn
);
你能告訴我你的意見嗎?
重現此現象的步驟
(1) 運行以下腳本以創建樣本數據集。
Names Default To Here(1);
Random Reset(111111111);
n = 10000;
x = J(n, 1, Random Uniform(-10, 10));
y = Sin(x) + J(n, 1, Random Normal());
As Table(x||y,<<COLUMN names=""></COLUMN>
(2) 選擇 [加載項] > [XGBoost] > [製作K欄折疊] 。
2-1。輸入“ 1” [要創建的K折列數] 。
2-2。指定“ y”為 [是,回复] 。
2-3。請點擊 [走] 。
(3) 運行以下腳本。
XGBoost(
Y( :y ), X( :x ),
Validation( :FoldA ),
Fit( max_depth( 3 ), alpha( 10 ), lambda( 10 ), iterations( 50 ) ),
);
(4) 選擇 [保存預測公式] 在“模型1”輪廓的紅色三角形菜單中。
(5) 運行以下腳本以查看保存的預測值。
Graph Builder(
Size( 1209, 478 ),
Show Control Panel( 0 ),
Variables( X( :x ), Y( :y Predictor ) ),
Elements( Line( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch( {}, "x", ScaleBox,
{Format( "Fixed Dec", 12, 1 ), Min( -3 ), Max( 3 ), Inc( 1 ),
Minor Ticks( 1 )}
)
)
);
(6) 運行下面的腳本以查看我的建議。
New Column( "My Suggestion",
Formula(
(:Name( "y Predictor FoldA==1" ) +
:Name( "y Predictor FoldA==2" ) +
:Name( "y Predictor FoldA==3" ) +
:Name( "y Predictor FoldA==4" ) +
:Name( "y Predictor FoldA==5" )) / 5
)
);
Graph Builder(
Size( 1209, 478 ),
Show Control Panel( 0 ),
Variables( X( :x ), Y( :My Suggestion ) ),
Elements( Line( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch( {}, "x", ScaleBox,
{Format( "Fixed Dec", 12, 1 ), Min( -3 ), Max( 3 ), Inc( 1 ),
Minor Ticks( 1 )}
)
)
);
附帶的數據表具有這些結果。請運行表腳本以查看圖。
預先感謝您的意見。
這些是問佑介的好問題。 如果我們將整個過程分為兩個主要步驟,首先是確定一個或多個合理的XGBoost模型。 對於這種k折交叉驗證或類似的方法,是無價的。 其次是進行預測,讓我們將其分為對當前訓練數據和新測試數據進行預測。 對於訓練數據的預測,使用在相同數據上訓練的任何模型都將導致預測通常過擬合且不切實際地好,因此,不合時宜的預測最有意義。 對於新的測試數據,對所有未看到數據的模型進行平均預測即可,如您所建議的那樣。 (實際上,外接程序已經為缺少Y的所有行執行了此操作。)也可以使用交叉驗證確定的參數,無需驗證即可對完整數據執行後續最終擬合。 我的經驗是,平均k倍(“裝袋”)的預測與來自完整數據擬合的預測趨於非常相似,儘管您甚至可以將它們平均,例如0.5 *(袋裝k倍預測)+ 0.5 *(根據完全數據擬合得出的預測)。 我不認為嘗試在k折模型擬合中找到“最佳”是值得嘗試的,因為它們在操作上是等效的,並且您冒著因這種選擇而過度擬合的風險。
謝謝您的答复,拉斯。
我現在知道,JMP的XGBoost的這些不正確的預測可以用於評估模型,檢測異常值和創建集成模型。
我認為當我們使用k交叉驗證時,它們是創建最終預測模型的幾種方法。
- 使用為所有數據選擇的調整參數重新擬合模型。(<這是您的建議。)
- 平均k個模型。(<這是我的建議。)
- 在k個模型中僅使用“最佳”模型。
您是否認為第一種方法通常比第二種和第三種方法更好,以獲得最終的預測模型?
謝謝Yusuke提出的問題,以及如何使用JSL複製它的很好的描述。 與JMP中的其他預測建模平台相比,您在計算預測值時外接程序的工作方式之間有著重要的區別。 來自加載項的預測是“不合時宜”的,也就是說,每個預測值僅根據排除該觀察值的模型擬合計算得出。
以基本5折為例,並假設數據的第一行分配給3折。 加載項可擬合五個模型,依次折疊,但第一行的預測值僅基於不包含褶皺3的第三擬合。 所有行都使用類似的邏輯。 為什麼這樣幾個原因:
1。不合時宜的預測為模型在未來看不見的數據上的表現提供了現實的評估。 實際上,所有標有“ Validation”(驗證)的輸出統計信息和圖形均基於折衷預測。 您已經註意到,這些預測的可變性可能比使用“內折”數據計算的預測大得多,也就是說,當使用相同的數據進行訓練和預測時。
2。失疊預測列是查找模型在整個訓練集中可能產生的異常值和錯誤的好方法。 K折疊的好處在於,每個觀察值僅精確地保留一次,因此,我們對每一行都有不合預期的預測。
3。折衷預測列可用於與從其他良好模型創建的相似列合在一起。 這可以通過簡單的平均或在通常稱為“堆棧”的技術中,將折合的列用作第二級模型中的新預測變量來完成。 第二層模型通常比第一層模型更簡單,例如,來自廣義回歸的套索模型,甚至另一個深度較淺的XGBoost模型。 堆疊集成模型往往比任何一級模型具有更好的預測性能。
為了獲得您建議的基於訓練的直接預測,一種好方法是在未指定“驗證”列的情況下擬合新的XGBoost模型。 另一種相關的方法是製作數據表的副本,將所有Y值都設置為missing,然後將其連接為原始數據。 在這種情況下,對於Y缺失的行的預測將是所有擬合模型中預測的平均值,該技術稱為“裝袋”。
最後,要提及的是,您顯示的複雜公式是涵蓋所有情況的結果。 例如,如果原始數據中的某行缺少Y,則我們希望對所有模型使用袋裝預測。