Aggiungere penalità al numero di divisioni nella piattaforma Partition per ridurre il numero di foglie?Di recente ho trascorso molto tempo nella piattaforma Partition e attualmente sto cercando un modo per automatizzare le analisi.
Il mio problema è questo: generalmente ho diviso il set di dati 50/50 training/validazione e ho premuto "Vai", che massimizza la convalida RSquare. Ma, questo porta spesso a modelli che hanno un numero di spaccature maggiore di quanto sia realmente credibile , ad esempio qui dove crea 5 divisioni per arrivare a Validation RSquare 0.288, quando usare solo due divisioni otterrebbe un adattamento quasi altrettanto buono di 0.27.

Di conseguenza, in genere devo sempre sfoltire manualmente le divisioni per ottenere un RSquare di convalida accettabile con un numero di termini del modello accettabilmente basso.
C'è un modo per chiedere a JMP di applicare una penalità e creare una sorta di Validation RSquare "regolarizzato" che penalizzi i criteri di selezione del modello in base al numero di suddivisioni? Ad esempio, il Validation RSquare "regolarizzato" potrebbe essere [Validation RSquare] - 0.05*[N Splits]. O forse c'è un modo migliore per regolarizzare (ad esempio, continuare ad aggiungere termini se possono modellare almeno il 5% della varianza residua, anziché il 5% della varianza assoluta).
Le soluzioni JSL sono benvenute, poiché questo sarebbe principalmente per le analisi automatizzate.
AnalisiScriptingRe: Aggiungere penalità al numero di divisioni nella piattaforma Partition per ridurre il numero di foglie?Ciao @markschwab ,
Per quanto riguarda la tua preoccupazione, è che il numero di divisioni sia davvero credibile o che sia un numero ragionevolmente basso di divisioni? Credo che il numero di divisioni credibili sia le righe nella tabella dei dati meno 1, ma non il 100%.
Ad ogni modo, sto includendo un frammento di codice che puoi usare per eseguire il partizionamento automatico. L'ho fatto con il file Boston Housing.jmp.
Se hai familiarità con JSL, dovresti essere in grado di modificarlo per le tue esigenze. Il codice è abbastanza semplice, presuppone che tu abbia una colonna di risposta numerica e continua. Esegue il partizionamento per tutte le partizioni massime definite dalla prima finestra e quindi salva le statistiche di partizionamento. Puoi facilmente creare la tua formula di colonna per avere una validazione "penalizzata" RSquare ad esempio o comunque scegli di penalizzare la partizione. È quindi possibile selezionare quale partizione è la migliore per i propri criteri e rieseguirla con il numero fisso di suddivisioni che si determina. Ho alcune idee su come inventare il programma, ma questo è per dopo.
In una nota a margine, potresti prendere in considerazione la creazione di una colonna di convalida (se non hai Pro, puoi farlo cercandolo nell'indice di scripting) e stratificando per la tua colonna di risposta, questo darà ai set di formazione / convalida un più pari rappresentanza quando si tratta di frazionamenti non 50/50. In questo modo, puoi avere più dati per addestrare la tua partizione.
Spero questo sia di aiuto!,
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>Re: Aggiungere penalità al numero di divisioni nella piattaforma Partition per ridurre il numero di foglie?Grazie @DiedrichSchmidt per la risposta dettagliata! Mi ci vorrà un po' di tempo per digerire lo script.
Per ora, potresti darmi solo un rapido primer con un esempio di come usarlo? Ecco cosa ho provato e ricevo un errore:
1) Decommenta la riga "dt = Open( "$SAMPLE_DATA/Boston Housing.jmp" );" ed esegui lo script
2) Fare clic su "Seleziona tabella dati" -> "Custodia Boston" -> OK
3) In "Azione", fare clic su "OK"
4) Nella finestra "JSL per aiutare con il partizionamento" ho lanciato "nox" in Y e "età" in X e ho premuto "OK"
5) Vedo un avviso JMP " Problema di pedice{20} nell'accesso o nella valutazione di 'w[Outline Box("Partition for " || ycols[1])]' , w[/*###*/Outline Box("Partition for " || ycols[ 1] )] ". La tabella "Partition_Results" è nulla tranne che per la colonna "Splits" che va da 1-20.
Re: Aggiungere penalità al numero di divisioni nella piattaforma Partition per ridurre il numero di foglie?Ciao @markschwab ,
Stai usando il codice come previsto, avevo appena fatto alcune ipotesi che non erano abbastanza generiche per funzionare in qualsiasi circostanza. Pensavo che avessi una colonna di convalida e quindi l'ho programmata per l'esecuzione con una. lo script aggiornato di seguito risolve questo problema consentendo di inserire la parte di convalida, proprio come nella finestra della piattaforma delle partizioni. Tuttavia, non utilizzare sia una colonna di convalida che una parte di convalida: lo script non è stato ancora codificato per tenerne conto ed è, di nuovo, non abbastanza generico per tutti i possibili input dell'utente.
Per quanto riguarda l'errore che stavi ricevendo, era di nuovo perché presumevo che ci fosse più di un fattore X nel processo e quindi ho scritto il riferimento alla finestra del report di conseguenza. Ora è stato corretto in modo che non importa se c'è solo 1 X o più X.
Ancora una volta, questo script non è abbastanza generico da tenere conto della colonna di risposta non numerica/non continua, Y. Se la risposta è categorica, questo script non è progettato per tenerne conto. Può essere facilmente modificato per farlo se necessario.
Spero questo sia di aiuto,
DS
AGGIORNAMENTO: Ok, quindi non ho potuto fare a meno di codificare di più e ho incluso alcune colonne RSquare penalizzate e una colonna RSquare di convalida della formazione. Puoi cambiare la formula e il coefficiente del calcolo penalizzato modificando il codice: l'ho impostato sul tuo concetto di Rsquare-0,05*Splits. Oltre a ciò, ho incluso anche del codice per visualizzare graficamente i risultati una volta eseguiti i calcoli.
AGGIORNAMENTO 2: sono tornato indietro e ho reso il codice un po' più divertente -- Ora puoi vedere i risultati della tabella accanto ai risultati del grafico e selezionando il punto sul grafico che ti piace di più, puoi quindi rieseguire la partizione per quello specifico numero di divisioni quando si fa clic su "OK". Come prima, non l'ho reso super generico per nessun tipo di input dell'utente, ma ho cercato di farlo funzionare per risposte numeriche/continue. Quello che hai ora dovrebbe essere sufficiente per farti andare avanti.
PS Man mano che impari il codice, usa l'indice di scripting nel menu Aiuto di JMP. È molto utile per comprendere alcune chiamate e come usarle durante lo scripting.
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>