Ciao a tutti
Sono Yusuke Ono, un tester di JMP Japan.
Mi sembra che quando viene utilizzata la convalida k-fold, i valori previsti a volte diventano molto rumorosi. Si prega di vedere la schermata qui sotto. Questo è un grafico dei valori previsti per un modello con una variabile X. Viene utilizzata la convalida di 5 volte.

Vorrei suggerire di calcolare i valori previsti semplicemente come di seguito.
(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
La formula di previsione corrente è la seguente.
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
);
Potresti dirmi la tua opinione?
Procedura per riprodurre questo fenomeno
(1) Esegui lo script seguente per creare un set di dati di esempio.
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) Selezionare [Componenti aggiuntivi] > [XGBoost] > [Crea colonne piegate a K] .
2-1. Digita "1" per [Numero di colonne piegate a K da creare] .
2-2. Specificare "y" a [Y, Risposta] .
2-3. Clic [Partire] .
(3) Esegui lo script di seguito.
XGBoost(
Y( :y ), X( :x ),
Validation( :FoldA ),
Fit( max_depth( 3 ), alpha( 10 ), lambda( 10 ), iterations( 50 ) ),
);
(4) Selezionare [Salva formula di previsione] nel menu triangolo rosso al contorno "Modello 1".
(5) Eseguire lo script seguente per visualizzare i valori previsti salvati.
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) Esegui lo script qui sotto per vedere la trama del mio suggerimento.
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 )}
)
)
);
La tabella dati allegata ha questi risultati. Si prega di eseguire gli script delle tabelle per vedere i grafici.
Grazie per la tua opinione in anticipo.
Queste sono buone domande da porre a Yusuke. Se suddividiamo il processo complessivo in due passaggi principali, il primo è determinare uno o più modelli XGBoost ragionevoli. Per questa convalida incrociata k-fold o qualcosa di simile è inestimabile. Il secondo è fare previsioni e suddividiamole in previsioni sui dati di allenamento correnti e sui nuovi dati di test. Per le previsioni sui dati di addestramento, l'utilizzo di qualsiasi modello addestrato sugli stessi dati si tradurrà in previsioni che sono tipicamente sovradimensionate e non realistiche, quindi le previsioni out-of-fold hanno più senso. Per i nuovi dati di test, la media delle previsioni di tutti i modelli che non hanno visto i dati è buona come suggerito. (Il componente aggiuntivo in effetti lo fa già per tutte le righe per le quali manca Y). Va anche bene eseguire un adattamento finale successivo ai dati completi senza convalida, utilizzando parametri determinati dalla convalida incrociata. La mia esperienza è stata che le previsioni dalla media di k-fold ("insaccamento") e quelle da un adattamento di dati completi tendono ad essere molto simili, sebbene potresti persino mediarle, ad esempio 0,5 * (previsioni di k-fold in sacchi) + 0,5 * (previsioni dall'adattamento completo dei dati). Non credo che valga la pena provare a trovare il "migliore" tra i modelli k-fold, poiché sono operativamente equivalenti e si corre il rischio di overfitting con una tale scelta.
Grazie per la tua risposta, Russ.
Ora capisco che queste previsioni out-of-fold di XGBoost di JMP possono essere utilizzate per valutare modelli, rilevare valori anomali e creare modelli di insieme.
Penso che siano diversi modi per creare modelli predittivi finali quando usiamo la convalida incrociata k.
- Rimontare un modello con parametri di regolazione selezionati per tutti i dati. (
- Modelli k medi. (
- Utilizzare solo il modello "migliore" tra i modelli k.
Pensi che il primo metodo sia generalmente migliore del secondo e del terzo per ottenere un modello predittivo finale?
Grazie Yusuke per la domanda e la descrizione molto bella di come riprodurlo con JSL. Hai riscontrato un'importante differenza tra il modo in cui funziona il componente aggiuntivo durante il calcolo dei valori previsti rispetto ad altre piattaforme di modellazione predittiva in JMP. Le previsioni dall'add-in sono "out-of-fold", ovvero ogni valore previsto viene calcolato solo dagli adattamenti del modello che escludono tale osservazione.
Prendi il 5 volte di base come esempio e supponi che la prima riga dei dati sia assegnata alla piega 3. Il componente aggiuntivo si adatta a cinque modelli, tenendo ogni piega aperta a turno, ma il valore previsto per quella prima riga si baserà solo sul terzo adattamento che esclude la piega 3. Una logica simile viene utilizzata per tutte le righe. Perché fare questo? Diverse ragioni:
1. Le previsioni out-of-fold forniscono una valutazione realistica delle prestazioni del modello su dati futuri e invisibili. Infatti, tutte le statistiche di output e i grafici etichettati come "Convalida" si basano sulle previsioni out-of-fold. Come avrete notato, la variabilità di queste previsioni può essere molto maggiore delle previsioni calcolate con dati "in-fold", ovvero quando gli stessi dati vengono utilizzati per l'addestramento e la previsione.
2. La colonna di previsione out-of-fold è un ottimo modo per cercare valori anomali ed errori che il modello potrebbe aver commesso nell'intero set di addestramento. K-fold è utile in quanto ogni osservazione viene eseguita esattamente una volta, e quindi abbiamo una previsione out-of-fold per ogni riga.
3. La colonna di previsione out-of-fold può essere utilizzata per raggruppare colonne simili create da altri buoni modelli. Ciò può essere fatto mediante una semplice media o utilizzando le colonne out-of-fold come nuovi predittori in un modello di secondo livello in una tecnica spesso chiamata "stacking". Il modello di secondo livello è in genere più semplice dei modelli di primo livello, ad esempio un modello lazo di Regressione generalizzata o anche un altro modello XGBoost con profondità minore. I modelli di insieme impilati tendono ad avere prestazioni predittive migliori rispetto a qualsiasi modello di primo livello.
Per ottenere le semplici previsioni basate sull'addestramento che suggerisci, un buon modo è quello di adattare un nuovo modello XGBoost senza la colonna di convalida specificata. Un altro modo correlato è creare una copia della tabella dati, impostare tutti i valori Y come mancanti e concatenarli ai dati originali. Le previsioni in questo caso per le righe con Y mancanti saranno la media delle previsioni su tutti i modelli adattati, una tecnica denominata "insaccamento".
Infine, volevo menzionare che la formula complessa che visualizzi è il risultato della copertura di tutti i casi. Ad esempio, se una riga nei dati originali ha una Y mancante, si desidera utilizzare la previsione in sacchi su tutti i modelli per essa.