costruire più modelli di rete neuraleSto utilizzando la piattaforma neurale per fare previsioni e, essendo nuovo nel mondo delle reti neurali, ho solo una certa familiarità con tutti i parametri di input: numero di livelli nascosti, numero di nodi/livello nascosto, modelli di potenziamento, velocità di apprendimento e tour. Quello che voglio fare è cercare di ridurre al minimo l'RMSE e il tasso di classificazione errata del modello di convalida. Quello che ho fatto è stato modificare in modo iterativo ogni parametro uno per uno, salvare i parametri delle prestazioni del modello e incollarli in una nuova tabella JMP, ma ci vorranno giorni poiché ci sono così tante combinazioni di livelli, nodi, tour, ecc. Sarebbe possibile scrivere uno script in cui JMP Pro crea, ad esempio, 1.000 modelli e scarica i dati in una tabella in modo da non dover modificare manualmente ciascun parametro di input del modello?
#Livelli nascosti: 1 o 2
#Nodi sigmoidali: 0, 1, 2, 3 o 4
#Nodi lineari: 0, 1, 2, 3 o 4
#Nodi radiali: 0, 1, 2, 3 o 4
Modelli #boost: nessuna idea, 1-5 forse?
#tasso di apprendimento: 0-0,5 con incrementi di 0,1
#tour: 1, 5, 10, 20, 100
Quindi sarebbe 2 x 5 x 5 x 5 x 5 x 5 x 5=~30.000.
Immagino che potrei eliminarne alcuni una volta che avrò più familiarità con il set di dati. Naturalmente, avere molti nodi e un numero elevato di modelli di potenziamento non ha senso (e nemmeno alcune altre combinazioni), ma stiamo comunque parlando di centinaia di modelli che vale la pena testare. Sicuramente questo tipo di screening/confronto dei modelli potrebbe essere sceneggiato, giusto?
Modellazione predittiva e machine learningRi: costruzione di più modelli di rete neurale@SDF1 Ho visto il tuo messaggio, ma ho ricevuto uno strano messaggio di errore quando ho provato a rispondere: abm64@miami.edu .
A proposito, dopo settimane di non utilizzo, l'ultima versione della GUI ora funziona sul mio Macbook Pro da 16 pollici senza nessuno di questi problemi relativi al riquadro di confine (utilizzando sia Y continuo che categorico con tutti i diversi tipi di convalida). Non ricordo di aver aggiornato nulla sul mio computer, ma ehi, sono felice che funzioni anche su questo computer (ha sempre funzionato sul mio Macbook Air, è allo stremo!).
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Interessante, beh, sembra certamente che questo problema sia veramente correlato al Macbook Pro (e forse al sistema operativo su cui è in esecuzione). Potrebbe essere correlato al sistema operativo o forse anche all'hardware, ad esempio il modo in cui JMP utilizza l'unità di elaborazione grafica su un Pro è in qualche modo diverso da come la utilizza su un Air. Forse controlla se il Mac ha realizzato i due computer con la stessa GPU o se potrebbe trattarsi di un problema hardware. In ogni caso, immagino che gli sviluppatori JMP vorrebbero saperne di più sulle specifiche che stai affrontando e portarle alla loro attenzione al Discover Summit sarebbe utile. Almeno non è mia incompetenza! 
Sono felice che tu possa ancora eseguirlo sul tuo Air. Spero che il tuo Air continui a funzionare così potrai realizzare il tuo video e inviarlo per il Summit. Fammi sapere qual è il tuo orario per la conferenza, mi piacerebbe vederlo.
Grazie!,
DS
Ri: costruzione di più modelli di rete neuraleSai cosa ho imparato questa settimana, che è letteralmente la maggior parte del tempo che ho mai trascorso sul mio Macbook Pro da lavoro? Ci sono MOLTI bug piccoli, fastidiosi, ma per lo più banali in JMP Pro 16.1 che sono completamente assenti sul mio Macbook Air. E tutto ha a che fare con l'estetica. Ad esempio, sai come raggruppare gli script a sinistra, quindi fare clic per espandere la cartella raggruppata? Non funziona. Beh, a volte funziona. È necessario fare clic sulla freccia di espansione, quindi fare clic in un altro punto dello schermo, tornare indietro, fare di nuovo clic e alla fine si espande. Ci sono altre piccole e strane cose del genere che non ho mai notato sullo stesso sistema operativo e sulla stessa versione di JMP Pro sull'altro Mac, quindi deve esserci qualche problema con JMP e questo particolare computer che comunicano tra loro, che quindi influisce sul tuo script poiché sembra avere qualcosa a che fare con l'apparenza. In altre parole, non penso che sia a causa della tua incompetenza, ahah, e mi aspetto assolutamente di utilizzare ancora la nuova GUI sull'altro mio computer. In effetti, mentre scrivo questo sul mio computer di lavoro, sta esaminando 2.000 modelli NN. Devo solo risolvere alla fine questi problemi del MacBook Pro data la natura decadente del mio Macbook Air. In effetti, potrei iniziare a registrare tutti questi piccoli bug e stranezze e provare a parlare con alcuni sviluppatori al Discovery Summit. Mi chiedo se sia davvero il MIO computer o un problema generale del MacBook Pro. Non voglio eseguire l'aggiornamento al sistema operativo Mac più recente (Big Sur), ma mi chiedo se questa potrebbe effettivamente essere la soluzione.
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Mi spiace apprendere che continui a ricevere l'errore. Il file "GenAT_ver3.0.jsl" che ho caricato è quello che sto utilizzando. L'ho provato sul mio lavoro (JMP 16.0 Pro) e sul PC personale (JMP EA17) e funziona su entrambi. Non ricevo l'errore su nessuno dei due PC quando provo a inserire i tuoi dati. Deve trattarsi di come il Macbook Pro gestisce la finestra del rapporto di adattamento. Sono perplesso su come risolverlo senza avere accesso al computer specifico. Dovrei guardare la struttura ad albero della finestra del report e provare a capire qual è la differenza tra un PC, un Macbook e un Macbook Pro.
Sono tornato indietro e ho dato un'occhiata più da vicino al tuo file di registro e ho pensato che forse si trattava di qualcosa relativo al DOE specifico che hai generato, ma anche quando eseguo quel DOE e creo una tabella di ottimizzazione basata su di esso, funziona. Almeno funziona sui PC che sto utilizzando.
È un peccato, perché sembra che potresti non essere in grado di provare la GUI per il tuo discorso se non è in esecuzione sul MacBook Pro. Vorrei poter essere di maggiore aiuto su questo problema.
DS
Ri: costruzione di più modelli di rete neuraleUn'altra cosa che potrebbe essere informativa: anche se ho una Y continua, ricevo lo stesso messaggio (indipendentemente dal tipo di convalida). Strano!
Ri: costruzione di più modelli di rete neuraleHo appena provato su Macbook Pro e ho ricevuto lo stesso errore Outline Box/Arg 1, ma ho notato qualcosa: la versione di luglio si chiamava "3.0". Pensi di averlo aggiornato ma poi hai caricato accidentalmente la vecchia versione?
Ri: costruzione di più modelli di rete neuraleEccezionale! Lasciami t provalo adesso e riferiscilo. A quanto pare, il supporto di JMP è giunto alla stessa conclusione, quindi sono fiducioso che ora funzionerà.
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Grazie per i file, mi hanno aiutato a capire dove arrivavano gli errori. Ha a che fare con la mia programmazione mediocre e la mia completa comprensione delle strutture ad albero all'interno di JMP (sono un autodidatta in questo). Ad ogni modo, la data per l'ultima versione è quasi esatta, avevo aggiornato le cose intorno all'inizio di luglio per tenere conto del fatto che le statistiche di adattamento cambiano la loro posizione nella struttura ad albero in base al tipo di dati di modellazione dei valori Y, ad esempio numerici , ordinale o categoriale. Lavoro con risposte puramente numeriche quasi il 100% delle volte, quindi non ho riscontrato questo errore regolarmente. Per fornire correttamente informazioni sulle statistiche di adattamento per altri tipi di dati di modellazione, avevo bisogno di modificare il modo in cui viene assegnata tale variabile. Per fortuna, tutto era piuttosto logico dal punto di vista di JMP, quindi le modifiche non sono state così difficili.
In allegato c'è la versione 3.0 che dovrebbe risolvere questo problema, indipendentemente dal sistema operativo o dalla versione JMP di cui disponi. Non penso che il supporto sarà in grado di aiutare molto poiché in un certo senso si tratta di un codice di "terze parti". Ad ogni modo, prova questa versione 3.0 e fammi sapere se continua a comportarsi male.
Grazie!,
DS
Ri: costruzione di più modelli di rete neuraleHo provato JMP Pro 15 e ho ancora ricevuto lo stesso messaggio di errore:
carattere previsto arg 1 nell'accesso o nella valutazione di 'Outline Box', Outline Box/*###*/(o_box)
Sto utilizzando la versione 3 della GUI dal 10 luglio circa. Quello era il più recente, vero?
Quando ho eseguito il debugger, mi ha detto: "Object Button Box non riconosce il messaggio inviato; forse intendi uno di questi..." quindi elenca alcune alternative. Ma la Button Box si forma bene e tutti i pulsanti funzionano.
Penserei che il tuo argomento sulla struttura ad albero POTREBBE essere il problema, ma è lo stesso sistema operativo (Catalina). Mi rivolgerò al supporto tecnico.
Ri: costruzione di più modelli di rete neuraleAllego il log e la tabella con la GUI (l'ultimo script). Ho provato tutti i tipi di convalida che avevano senso per molte delle cose che sto cercando di prevedere (le Y). Normalmente, farei tutto sul mio Macbook personale (dove tutto funziona), ma quel computer è a settimane di distanza dal mordere la polvere, quindi spero di poter far funzionare tutto su questo Macbook Pro nuovo e più bello! Nel frattempo proverò alcune cose. C'è una leggera possibilità che io abbia semplicemente copiato una versione precedente della GUI (che presentava ancora dei bug), il che sarebbe una soluzione semplice, anche se non penso che sia questo il problema poiché, a prescindere, ha funzionato sull'altro computer. Sarò curioso di sapere se trovi qualcosa di strano e grazie ancora per aver indagato.
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Devo dire che è un comportamento strano perché funzioni con un Air e non con un Pro. Se ricordo bene, la chiamata o_box serve per estrarre alcune statistiche dell'adattamento e può cambiare a seconda del tipo di metodo di convalida che stai utilizzando: holdback, righe escluse, ecc. Non sembra che si tratti di una versione JMP poiché su entrambi è in esecuzione la 16.1. Stai utilizzando lo stesso metodo di convalida per entrambi i computer? Quali metodi stai utilizzando?
La mia unica ipotesi è che se non funziona da un modello di Macbook a quello successivo, ci deve essere un cambiamento nella struttura ad albero del report e il codice JSL cerca un valore in una posizione specifica, ma ritorna vuoto o NAN o qualcosa del genere e genera l'errore. Questo forse va un po' oltre le mie capacità di programmazione: renderlo indipendente dal sistema operativo potrebbe essere al di là delle mie capacità. Sto utilizzando un PC, Windows10. Non ho dubbi che in JMP ci siano programmatori più esperti che potrebbero capire come aggirare questo problema in modo che possa essere eseguito su diversi sistemi operativi e così via.
Se riesco a riprodurre l'errore, è relativamente facile per me risolverlo, ma non ho accesso a MacBook Pro. Nel frattempo, puoi eseguirlo sul Macbook Pro e controllare il file di registro per vedere se ti dice in quale riga di codice si sta verificando il guasto? Questo potrebbe aiutarmi a restringere la posizione del bug e magari vedere come risolverlo.
Grazie!,
DS
Ri: costruzione di più modelli di rete neuraleG R mangiare. Grazie mille. Ho notato qualcosa di strano oggi: sul mio Macbook Air da 13 pollici con Catalina e JMP Pro 16.1, funziona tutto. Sono quindi passato al mio Macbook Pro da 16 pollici da lavoro, con anche Catalina e JMP Pro 16.1, ho utilizzato la stessa identica tabella dati e la tua GUI e ottengo quello strano "carattere previsto arg 1 nell'accesso o nella valutazione di 'Outline Box' , Outline Box/*###*/(o_box)" indipendentemente da ciò che inserisco. Pensi che potrebbe effettivamente essere collegato al display (cioè allo schermo più grande)? Sicuramente no. Sembra strano che uno script venga eseguito su un computer e non sull'altro. Qualche idea?
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Nessun problema, sono felice che possa essere d'aiuto. Sì, la messa a punto dell'XGBoost può essere un po' più complicata. Ho trovato un blog Qui questo è molto utile: l'ultimo post del blog su quella pagina, ma per qualche motivo il collegamento all'articolo del blog non risponde realmente. Fornisce un esempio di come è possibile farlo in Python, ma è essenzialmente lo stesso in JMP, una volta compreso il gergo per i parametri del modello. Ho trovato anche questo luogo e la documentazione di accompagnamento MOLTO utile per leggere cosa fa XGBoost e quali parametri lo rendono più o meno conservativo di un modello. Una cosa che mi piace è che è molto più stabile di un albero potenziato o di una foresta casuale. Entrambi hanno un comportamento stocastico in R^2 che risulta in modelli che differiscono leggermente ogni volta che si esegue l'adattamento con tutti i parametri uguali. XGBoost ti offre la stessa qualità di adattamento ogni volta che esegui lo stesso set di parametri.
Non esitate a menzionare la GUI NN nel vostro discorso su Discovery: ho intenzione di partecipare virtualmente e avrei provato ad andare alla visita di persona a Cary (sono solo a un'ora di distanza), ma penso che con il continui problemi dovuti alla pandemia, hanno interrotto l'incontro di persona. Ho pubblicato la GUI nella pagina dei componenti aggiuntivi, quindi tecnicamente immagino che sia "pubblicata" e disponibile. Grazie per avermelo chiesto e aver pensato magari anche di provarlo. Spero che tutto funzioni senza intoppi! Non sono il miglior programmatore, ma posso far funzionare le cose. Se riscontri problemi, faccelo sapere e cercherò di correggerlo il prima possibile.
Grazie!,
DS
Ri: costruzione di più modelli di rete neuraleOh! Grazie mille per r la tabella e la spiegazione. Stavo pensando che, dal momento che ho finalmente familiarità con tutto il gergo NN, XGBoost sarebbe un gioco da ragazzi, ma sembra che ho ancora molto da imparare (giusto per capire il gergo per prima cosa)! Sembra che XGBoost sia una sorta di "tesoro" del mondo dell'apprendimento automatico al momento, ma, cosa ancora più importante, che potrebbe effettivamente essere più adatto ai tipi di dati che genero, quindi ho assolutamente bisogno di approfondire tutto questo (ad esempio, mentre la tua GUI è in esecuzione in background!). A proposito, ti dispiacerebbe se menzionassi la GUI NN, e molto probabilmente ne facessi anche una demo, nel mio discorso su JMP Discovery (che registrerò questa settimana)? Sarei sicuro di darti credito, ma capisco perfettamente se vuoi essere tu a svelarlo a un pubblico più vasto e non vorresti "rubarti il tuono". Utilizzerei solo la piattaforma neurale poiché dubito che sarò il padrone di XGBoost entro venerdì (quando registrerò il discorso), ahah.
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Non ho ancora eseguito l'aggiornamento alla versione 16.1, quindi non ho riscontrato lo stesso errore, tuttavia terrò gli occhi aperti nel caso in cui ciò accada e pubblicherò eventuali aggiornamenti se necessario.
Per quanto riguarda XGBoost, ho una tabella di ottimizzazione per ottimizzarlo. E' allegato qui. La piattaforma XGBoost ha molti parametri di ottimizzazione diversi che possono essere modificati. Alcuni sono più influenti di altri. Di solito seguo una messa a punto graduale del modello perché è uno spazio parametrico molto grande. Non ho tutti i parametri possibili per la tabella di ottimizzazione, solo quelli più influenti (puoi sempre aggiungerne altri con le colonne con i nomi appropriati). Puoi accedere all'intero elenco dei parametri nella piattaforma aprendo il sottomenu "Opzioni avanzate" nella finestra XGBoost. Dato che hai menzionato che hai un set di dati altamente sbilanciato, ti consigliamo di assicurarti che il parametro scale_pos_weight sia impostato su 1.
In effetti, puoi anche eseguire un progetto di ottimizzazione dalla piattaforma stessa, dove utilizzerà il DOE di riempimento dello spazio per generare la tabella di ottimizzazione. È piuttosto pratico e flessibile. Tuttavia, trovo che per l'utilizzo della CPU e la minimizzazione della RAM, eseguirlo come funziona la mia GUI sia migliore da JMP.
Ho scoperto che per le mie situazioni, seguire questi passaggi funziona molto bene per XGBoost:
1. Correggi tasso di apprendimento, max_profondità, min_child_weight, gamma, subsample e colsample_bytree per trovare prima il numero corretto di alberi. Questi altri parametri verranno ottimizzati in seguito. Inizialmente li ho impostati sui valori predefiniti.
2. Ottimizza max_profondità e min_child_weight
3. Ottimizza la gamma (è una buona idea regolare nuovamente il numero di alberi prima di passare al passaggio 4)
4. Ottimizza subsample e colsample_bytree
5 Tune alfa e lambda, i parametri di regolarizzazione
6. Ottimizza il tasso di apprendimento: abbassa il tasso di apprendimento e aumenta il numero di alberi.
Ad ogni passaggio, genero una tabella di ottimizzazione per il parametro che desidero ottimizzare mantenendo gli altri fissi su ciò che erano per quel passaggio. Di solito eseguo questa sequenza due volte. È fondamentale utilizzare la convalida incrociata (K-fold o colonna di convalida) durante l'esecuzione di XGBoost. È possibile eseguire l'adattamento senza convalida incrociata, ma si rischia di adattare eccessivamente i dati e di non avere alla fine un modello predittivo eccezionale.
Spero che questo ti aiuti!,
DS
Ri: costruzione di più modelli di rete neuraleNon importa il punto n.1. Penso che ci sia stato qualcosa di strano da parte mia, o che un'adeguata stratificazione dei campioni in formazione, convalida e test. Fondamentalmente, ho un design totalmente sbilanciato in cui un gruppo che sto cercando di prevedere è molto più comune, quindi penso che questo sia la causa del problema!
Ri: costruzione di più modelli di rete neuraleHo iniziato a utilizzare nuovamente la GUI NN dopo l'aggiornamento a JMP Po 16.1 e ho dichiarato di ricevere nuovamente l'errore "intervallo di pedici". Hai riscontrato questo problema?
In un'altra nota, hai uno script DOE per la tabella di ottimizzazione XGBoost? Esplorerò questo approccio anche con la tua GUI! grazie mille
Ri: costruzione di più modelli di rete neuraleGrazie mille per tutte le informazioni In effetti avrei assolutamente provato a costruire tonnellate di modelli senza avere la minima idea di cosa stavo facendo. Due anni fa l'ho fatto con un altro approccio ed ero sul punto di provare a scrivere un articolo su Nature, pensando di aver cambiato la biologia marina come la conosciamo, prima di rendermi conto che stavo interpretando il modello in modo completamente errato, ahah. Per fortuna, i modelli di intelligenza artificiale e apprendimento automatico sono di gran moda nel momento in cui lavoro, quindi, anche se la mia motivazione per usarli era guidata dagli approcci tradizionali, NON tagliarli (piuttosto che dal mio voler fare intelligenza artificiale perché è "sexy") , Spero di poter sfruttare questa ondata di interesse per questo tipo di analisi per cercare di apprendere tutti i dettagli.
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Per quanto riguarda il componente aggiuntivo XGBoost, dovrai scaricare e installare il componente aggiuntivo separatamente. Funziona da JMP Pro 15 e versioni successive. Puoi trovare il componente aggiuntivo Qui . Assicurati di leggere la documentazione e di provare alcuni dei modelli di test spiegati da Russ nel post prima di passare alla creazione del tuo modello. Al momento, quella piattaforma è ancora quella che richiede una maggiore comprensione da parte dell'utente su come modificare/manipolare gli iperparametri dell'adattamento. ho trovato questo blog essere molto utile quando si tratta di mettere a punto la piattaforma XGBoost (ci sono MOLTI parametri diversi da mettere a punto, il che rende l'intero spazio piuttosto ingombrante). Sebbene sia scritto per gli utenti Python, la stessa idea di base funziona bene per la piattaforma JMP. Questo video è anche utile e ti consigliamo anche di leggere cosa fa ogni parametro nel modello, quali sono i suoi intervalli di lavoro e perché potresti o meno volerlo modificare dal valore predefinito Qui . Non è sicuramente una piattaforma in cui immergersi senza fare alcuni compiti di base. L'ho scoperto nel modo più duro tuffandomi prima e realizzando che non sapevo cosa stavo facendo. Quindi ho fatto dei compiti e mi sono stati di grande aiuto. Ora posso ottimizzare i modelli abbastanza rapidamente utilizzando il framework del blog che ho elencato sopra.
Buona fortuna!,
DS
Ri: costruzione di più modelli di rete neuraleGrazie mille per averlo spiegato e sono felice di averlo chiesto perché la mia supposizione era sbagliata. Ha più senso, tuttavia, che ogni "esecuzione" sia un rimescolamento casuale in termini di quali campioni sono nel modello di addestramento e quali sono trattenuti. Come hai affermato prima, con il mio set di dati piccolo e ampio, ha più senso escludere manualmente le righe, oppure creare una colonna di convalida, quindi in realtà sto solo cercando di assicurarmi di "padroneggiare" tutte le varie opzioni poiché si spera nel futuro, avrò un set di dati in cui potrebbero essere utilizzati holdback e kfold. Penso soprattutto che quest'ultimo sia attraente/intelligente.
Ho circa 15.000 modelli con la tua GUI, senza esagerare. Ora penso che mi divertirò confrontando NN con XGBoost, una tecnica di cui non avevo mai sentito parlare fino alla tua GUI. Non so nemmeno se è in JMP Pro 16 (anche se forse è nascosto da qualche parte)!
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Scusate il ritardo nella risposta, settimana scorsa ero in vacanza.
Per quanto riguarda la tua domanda sulla parte di holdback, mi risulta che JMP selezionerà casualmente la percentuale di righe in base al valore di holdback. Pertanto, se si dispone di 100 righe e si seleziona 0,3 come porzione di holdback, ogni volta che JMP esegue la piattaforma NN, selezionerà un nuovo set casuale di 30 righe come porzione di convalida. Pertanto, in termini di utilizzo della tabella di ottimizzazione, la piattaforma viene richiamata a ogni iterazione in cui invia alla piattaforma NN un nuovo set di parametri del modello. Se si è scelta l'opzione di holdback per la convalida e si è inserito un numero compreso tra 0 e 1, a ogni nuova esecuzione nella tabella di ottimizzazione, JMP selezionerà un diverso insieme di righe in base alla porzione di holdback. Tuttavia, se si eseguono più tour durante un singolo adattamento del modello NN, verranno utilizzate le stesse righe di holdback durante ciascun tour. Ogni volta che viene richiamata la piattaforma NN, verrà generato un nuovo sottoinsieme per la convalida. Questa è la mia comprensione, almeno.
Per la situazione di cui sopra, non è possibile sapere quali righe vengono trattenute (almeno non che io sappia). Se volessi fare qualcosa del genere, sceglierei l'opzione di convalida del holdback delle righe escluse. Puoi quindi selezionare quali righe nella tabella dati devono essere escluse e solo quelle verranno utilizzate per la convalida. Presumibilmente, potresti fornire alla piattaforma NN un seme casuale specifico, diciamo 10191, per ogni esecuzione di ottimizzazione con una porzione di holdback e utilizzerà ogni volta quel numero casuale per generare il sottoinsieme per la convalida. Poiché inizia dallo stesso seme casuale ogni volta che viene chiamata la piattaforma NN, in teoria JMP dovrebbe finire per selezionare le stesse righe per ogni esecuzione di ottimizzazione. Tuttavia, in questo caso non sapresti ancora di quali righe si tratta. Ancora una volta, questa è la mia comprensione di come funziona.
Spero che questo ti aiuti!,
DS
Ri: costruzione di più modelli di rete neuraleOra ho eseguito letteralmente 10.000 modelli dispari grazie alla tua epica GUI. Avevo una domanda riguardo al holdback. Supponiamo che la mia tabella di accordatura abbia 100 righe (ovvero, diversi modelli da testare). Ogni riga riceve un holdback casuale in base alla percentuale o viene trattenuto lo stesso numero X di campioni per ciascun modello? Immagino che sia quest'ultimo. In altre parole, se i campioni A, B, C e D vengono trattenuti dal modello n. 1, quegli stessi quattro campioni verranno trattenuti dal modello n. 2. Immagino comunque che la mia domanda successiva sarebbe: è possibile SAPERE quali campioni vengono trattenuti? In ogni caso, come abbiamo discusso, nel mio caso avere una colonna di validazione stratificata ha davvero più senso perché posso garantire che almeno un campione di ciascun trattamento sia incluso come training, validazione e test, mentre un holdback casuale del 30% potrebbe teoricamente Trattenere SOLO campioni dello STESSO trattamento (il che influenzerebbe la previsione a favore di detto trattamento!
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Sono davvero felice di sapere che sta funzionando per te e spero che i bug siano stati risolti. Vorrei avere una soluzione migliore per il problema della tabella dei dati in cima alla pila. Onestamente non so come aggirare il problema.
Ad ogni modo, credo che tu abbia ragione riguardo alla validazione di Kfold x. Questo metodo in genere funziona meglio con tavoli alti e non altrettanto bene con tavoli larghi. Se hai pochissime voci di dati, è una buona idea utilizzare una colonna di convalida stratificata sulla risposta. Oppure, se utilizzi la piattaforma GenReg, puoi utilizzare l'approccio "leave-one-out". Ma in genere, Kfold non è la soluzione migliore se hai pochi dati da considerare.
Consiglio vivamente di esaminare XGBoost, puoi scaricare il componente aggiuntivo dalla pagina dei componenti aggiuntivi su JMP. È un algoritmo molto stabile e robusto. XGBoost funziona molto bene con una colonna di convalida.
Potresti prendere in considerazione anche la possibilità di esaminare le macchine vettoriali di supporto, di cui dispone JMP Pro. È stato originariamente sviluppato per problemi di classificazione, ma può anche gestire problemi di regressione. In ogni caso, è sempre una buona idea confrontare modelli diversi utilizzando un set di dati di controllo che non è stato utilizzato nell'addestramento o nella xvalidazione del modello. In genere creo diversi modelli diversi e poi guardo come si confrontano su un set di dati completamente nuovo per vedere qual è il migliore nel prevedere il risultato.
Sono felice di poterti aiutare!,
DS
Ri: costruzione di più modelli di rete neuraleQuesto è così fantastico. Sto eseguendo batch di 100 iterazioni per ciascun metodo di convalida e non ho ancora riscontrato alcun errore. Non ho ancora provato "righe escluse" ma sono fiducioso che funzionerà.
kfold mi dà sempre la stessa soluzione perfetta (eccessiva?), anche se penso che questa sia una testimonianza della dimensione/formato del mio set di dati, piuttosto che di qualsiasi tipo di errore con lo script.
Dal punto di vista scientifico, ho svolto alcune ricerche e sembra che i miei "piccoli" set di dati (dozzine di campioni e centinaia di potenziali predittori) siano probabilmente più suscettibili a XGBoost, altrimenti le reti neurali potrebbero essere eccessive, quindi lo proverò anche la piattaforma. Non sapevo nemmeno che XGBoost fosse supportato in JMP (mentre ho visto foreste casuali e probabilmente l'altro approccio nella GUI). In altre parole, non vedo l’ora di sfruttare TUTTI i componenti di questo eccellente strumento di ricerca! Grazie mille per il tuo aiuto (di nuovo) e ti farò sapere se riscontro altri errori.
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Quindi, ho scoperto qual era il problema nella mia codifica. Non si trattava di un problema da una versione di JMP all'altra, ma di quanti livelli esistono per una risposta nominale o ordinale. Ciò modifica la posizione della casella del numero di colonna nella finestra del report. Avevo bisogno di modificare il codice per riflettere che quando si passa da una risposta che ha 2 o 3, o 4 o 6 livelli, le statistiche per l'adattamento cambiano posizione all'interno del report. La cosa bella è che le modifiche avvengono in un importo fisso correlato al numero di livelli presenti, quindi sono stato in grado di correggere il codice in modo relativamente semplice. Mi ci è voluto un po' per capire quel bug perché avevo usato il file PowderMetallurgy dai dati di esempio, ma sono solo due livelli, non 4 come il tuo.
In allegato la versione aggiornata più generalizzata ai diversi livelli della variabile di risposta. Il codice dovrebbe già funzionare per le colonne di convalida a 2 o 3 livelli nonché per le risposte nominali, ordinali e continue.
Ho testato tutte le piattaforme adatte: NN, BT, Bootstrap Forest e XGBoost con il tuo set di dati e funziona correttamente con tutti i tipi di dati e le diverse opzioni di convalida. Tieni presente che al momento JMP può adattare solo una risposta a due livelli (nominale o ordinale) utilizzando la piattaforma ad albero potenziata. Le altre piattaforme possono gestire più livelli di così.
Sono abbastanza sicuro che ora funzioni come previsto (tranne che per l'impostazione predefinita dell'ultima tabella dati aperta: non so come aggirare il problema). Tuttavia, se trovi un bug, faccelo sapere.
Grazie e buona fortuna!,
DS
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Ho lo stesso problema con le mie tabelle di dati. Penso che tu abbia ragione, se non lo esegui direttamente dalla tabella dati da cui stai modellando, in qualche modo viene impostato per impostazione predefinita l'ultima tabella dati aperta nella finestra principale di JMP. Non so come aggirare questo problema.
Hmm, il codice dovrebbe funzionare con una colonna di convalida che contiene solo training e convalida o tutti e tre. L'ho scritto per controllare il numero di livelli nella colonna di convalida e adattarlo di conseguenza, ovvero per registrare le statistiche di adattamento appropriate indipendentemente dal fatto che ci siano due livelli o 3. Lo ricontrollerò domani. Penso che l'errore dell'intervallo dell'indice sia probabilmente dovuto alle variazioni tra 15 e 16. Quando è uscito 16, non sono tornato indietro e ho ricontrollato il codice per assicurarmi che funzionasse, ma l'ho eseguito più test in 15 e tutto ha funzionato. Ciononostante, risolverò questo problema e correggerò le cose in modo che funzioni come previsto, semplicemente non avrò tempo fino a venerdì mattina per farlo.
Ancora una volta, grazie per avermi aiutato a eseguire il debug del codice e mi scuso per l'inconveniente. Ti ricontatterò quando avrò controllato tutti i tipi di dati e di codice come ho fatto per inviarlo come componente aggiuntivo JMP.
Grazie!,
DS
Ri: costruzione di più modelli di rete neuraleECCEZIONALE! Adesso cuciniamo con il fuoco. L'unica cosa che vedo ora è che, anche se la GUI ti chiede di dirle quale è la tabella dei dati e quale è la tabella di ottimizzazione, a volte le confonde ancora. Penso che per impostazione predefinita venga utilizzato il tavolo più vicino alla "cima della pila" (tendo ad avere 10-20 tavoli aperti, altrimenti probabilmente non sarebbe un problema).
Sarebbe possibile aggiungere una semplice "regola" che dice "Se la colonna di convalida contiene solo termini di addestramento e convalida, non calcolare i dati di test" o qualcosa del genere? Immagino che l'alternativa sia scorrere manualmente il codice e inserire "//" davanti a tutte le opzioni "test". Lo chiedo perché a volte utilizzo SOLO formazione e convalida, anziché formazione/convalida/test (poiché le dimensioni del mio campione sono ridotte). se ora inserisci una colonna di convalida con SOLO termini di formazione e convalida, ottieni l'errore "intervallo di indicizzazione" e penso che sia perché sta cercando dati di "test" che non sono presenti!
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Grazie ancora per averlo notato e avermelo fatto sapere: i miei modelli tendono ad avere risposte numeriche, quindi di solito non ho bisogno di modificare le cose per i tipi di dati nominali.
Ad ogni modo, penso che potrebbe esserci stato un cambiamento da JMP 15 a 16 che porta a diverse caselle di colonne numeriche nelle finestre dei report perché avevo bisogno di cambiare tutti gli stessi valori da quelli che erano a quelli che sono adesso, e prima funzionava in JMP 15, ricordo di averlo provato. Ho ricontrollato e questa versione aggiornata funziona correttamente con i diversi metodi di convalida per NN: holdback delle righe escluse, holdback, kfold e colonna di convalida. Ci scusiamo ancora una volta per l'inconveniente. Sono felice che tu possa testarlo e farmi sapere dei bug in modo che possa migliorare e aiutare gli altri. Per favore fatemi sapere se trovate qualcos'altro!
Grazie!,
DS
Ri: costruzione di più modelli di rete neuraleGrazie per averlo esaminato e ora funziona con una colonna di convalida, ma ottengo lo stesso codice di errore quando utilizzo holdback o kfold. Mi chiedo se è perché questi metodi non stratificano necessariamente i dati in cui è rappresentato ogni contenitore che sto cercando di prevedere? Lo proverò con un set di dati più grande e vedrò se ottengo lo stesso errore "intervallo di pedici".
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Mi dispiace che ci sia voluto un po' per risponderti. Sono stato in grado di riprodurre l'errore che ricevevi e ho scoperto dove si trovava l'errore nel mio codice. le righe 348 e 349 avevano valori errati per le variabili ncol_box_v e ncol_box test. Dovrebbero essere rispettivamente 10 e 19. L'ho corretto e ho eseguito nuovamente la NN con la colonna di convalida e funziona come dovrebbe. Allego il codice corretto. Ci dispiace per l'inconvenienza. Grazie per averlo individuato e se trovi altri bug, faccelo sapere.
Spero che questo ti aiuti!,
DS
Ri: costruzione di più modelli di rete neuraleWow, questa GUI ha davvero ricevuto un aggiornamento! L'unica cosa è che ora ricevo un errore di: "
Intervallo di pedice nell'accesso o nella valutazione di 'V_stats[ /*###*/5]' , V_stats[/*###*/5" indipendentemente dal tipo di convalida che utilizzo. Mi chiedo se è perché ho una dimensione del campione così piccola per provare ad avere campioni di formazione, convalida e test per ciascuno dei quattro gruppi (come Y)?
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
No, immagino che sia perché hai scelto di avere una colonna di convalida per la selezione del pulsante di opzione (rispetto a holdback o holdback escluso, ecc.) ma hai dimenticato di includere la convalida nell'elenco delle colonne quando trasmetti le colonne nella loro selezione ruoli. Questa è la mia ipotesi, ma se non è così, potrei aver bisogno che tu fornisca una descrizione passo passo.
Ho anche aggiornato leggermente il codice per correggere alcuni altri errori che venivano commessi. Il mio codice include la finestra di avanzamento, che penso tu non voglia, ma in ogni caso allego il nuovo file GenAt.jsl così puoi avere il codice sorgente. Lo uso sempre per assistermi con la mia modellazione: NN, albero potenziato, foresta casuale e XGBoost. Mi piace, ma richiede una certa conoscenza/comprensione di ciò che stai facendo dal punto di vista della modellazione e di ciò che le diverse piattaforme ti consentono di fare.
Non so se questo collegamento funzionerà, ma ho provato a scrivere una descrizione su come utilizzarlo per il repository dei componenti aggiuntivi. So che posso accedere a quel collegamento tramite il mio account SAS, ma non sono sicuro che altri possano farlo. Tuttavia, non è ancora stato reso pubblico nel repository.
Spero che questo ti aiuti!,
DS
Ri: costruzione di più modelli di rete neuraleCiao!
Sono tornato a lavorare su NN dopo una pausa di 6 mesi e ho notato che quando provo a eseguire la GUI NN, ricevo un nuovo messaggio di errore: "L'invio prevede un oggetto Scriptable in accesso alla valutazione di 'elenco', {/ *###*/"Convalida"})." Pensi che ciò potrebbe essere dovuto a qualche cambiamento tra JMP 15 e 16 (ovvero, alcuni script JMP 15 devono essere modificati per JMP 16?
Ri: costruzione di più modelli di rete neuraleÈ grandioso! Fammi sapere quando lo pubblichi. Lo proverò sicuramente, soprattutto perché sono ancora nelle fasi iniziali per capire questo set di dati (anche se NN è stato il chiaro vincitore su tutti gli altri tipi di modelli che ho testato su JMP Pro 16). Vedo il valore di non andare DIRETTAMENTE a NN per i motivi che hai indicato E perché non è eccezionale per la riduzione della variabile di risposta. Nel mio caso, avrei bisogno di misurare ripetutamente la stessa serie di 30-40 proteine in ogni campione (senza dati mancanti, come hai sottolineato), il che aumenterà i costi rispetto a un approccio più tradizionale con biomarcatori candidati (con un o solo alcuni predittori). Quindi fondamentalmente creo modelli semplici e ridotti al minimo con solo pochi biomarcatori (in genere utilizzando Gen-reg) e li confronto con il modello NN ottimizzato dal tuo script. In QUESTO caso, NN è superiore, ma questo non vuol dire che lo sarà SEMPRE da ogni set di dati futuro che raccoglierò! Non vedo l'ora di provare la GUI, i bug e tutto il resto.
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Sono assolutamente d'accordo con te sul non avere modelli eccessivamente complessi. E' assolutamente un problema che andrebbe evitato.
La mia opinione è che la modellazione NN non è troppo dissimile da altre piattaforme. Ognuno ha i suoi vantaggi e svantaggi. Ad esempio, gli NN non sono così bravi nel gestire i dati mancanti, non sono molto scalabili dal punto di vista computazionale e sono notoriamente difficili da interpretare. Per le persone che utilizzano tali modelli per costruire teorie, tale interpretazione è importante. Inoltre, le NN non sono in grado di gestire tutti i tipi di set di dati o input irrilevanti. Ma non ci sono ipotesi nel modello e tendono ad avere un’elevata capacità predittiva.
Tuttavia, poiché ogni metodo di modellazione presenta una serie diversa di vantaggi/svantaggi, tendo a modellare su piattaforme diverse e quindi a confrontare i migliori modelli di ciascuna piattaforma tra loro su un nuovo set di dati per vedere quale funziona meglio nel prevedere il nuovo set di dati e utilizzare quello.
Detto questo, ho appena terminato la versione 1.0 di un'interfaccia GUI che può essere eseguita da un pulsante di scelta rapida del menu JMP (non solo dalla tabella dati). Gli dai la tabella dei dati e la tabella di ottimizzazione e, a seconda di quale dei quattro metodi scegli (NN, albero potenziato, foresta di bootstrap, XGBoost), eseguirà il numero di adattamenti che gli invii in base alla tabella di ottimizzazione. Funzionerà su diversi tipi di dati per l'input Y e su diversi tipi di colonne di convalida, anche su più colonne di convalida per la piattaforma XGBoost. Non è affatto esente da bug, ma sono piuttosto entusiasta di averlo fatto funzionare entro una settimana circa dalla pubblicazione della prima GUI per la piattaforma NN. Richiede che l'utente sia a conoscenza di quale tabella di ottimizzazione utilizzare per ciascuna piattaforma e di altri requisiti specifici della piattaforma, come ad esempio sapere che la piattaforma ad albero potenziata in JMP non funziona con dati nominali/ordinali a più di 2 livelli ( almeno con JMP 15) o che la piattaforma XGBoost può utilizzare più colonne di convalida, ma ciascuna deve essere solo a 2 livelli.
È stato divertente lavorare a questo progetto e mi aiuterà negli sforzi futuri. Grazie!
Buona fortuna,
DS
Ri: costruzione di più modelli di rete neuralePenso che parte di ciò possa avere a che fare con il fatto che, per molti tipi di modellazione, costruire modelli sempre più complessi NON è ciò che vuoi fare: se un modello semplice si adatta bene ai tuoi dati e i valori RSME di validazione o test sono basso, quindi fermati lì. Ma per NN, aggiungere livelli, nodi, boost, tour, ecc., non è necessariamente una cosa MALE perché, sebbene più complessi, sono anche più flessibili. Quindi posso capire perché avere questa GUI per TUTTE le piattaforme di modellazione può portare coloro che non hanno familiarità con la modellazione a estrarre i dati essenzialmente in modo esaustivo e a loro discapito. Dalla mia comprensione limitata di NN, tuttavia, se un modello ha un RSME di validazione rispettabile nelle condizioni predefinite di TanH=3, un altro ha ancora 3 nodi TanH, 3 lineari e 3 gaussiani su due strati nascosti, ma ha un RSME simile, non rifiuteresti automaticamente quest'ultimo modello perché è più complesso ma ugualmente adeguato in termini di RSME perché potrebbe finire per essere PIÙ flessibile per futuri set di dati di test. Pertanto, potrebbe benissimo essere che la maggior parte delle persone farebbe bene a costruire potenzialmente centinaia o migliaia di modelli NN. È del tutto possibile, tuttavia, che mi sbaglio e che NN non sia diverso da altri tipi di modellazione in cui, a parità di altre condizioni, semplice è migliore. Sto solo sputando sul motivo per cui non vedi più persone che cercano di ottimizzare i parametri di input NN: è per ignoranza o paura del data mining ?!
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Grazie per il tuo feedback e le tue gentili parole. Sì, anch'io ho avuto questo problema, riguardo al fatto che veniva visualizzata la tabella dati sbagliata se non era "in alto". Non sono affatto sicuro del motivo per cui lo faccia. C'è anche qualcosa di strano nel modo in cui risponde quando chiamo certe cose nella nuova finestra per passare successivamente alla parte adatta. Il pulsante "Annulla" non funziona come previsto e il pulsante "Aiuto" non va da nessuna parte in questo momento, ma è un inizio! Penso che un esperto di scripting potrebbe facilmente risolvere questi bug e farlo funzionare come previsto. Forse quando avrò impostato le cose per farlo funzionare su più piattaforme e per non avere quei bug, potrei pubblicarlo nella pagina del componente aggiuntivo. Sarebbe un onore averlo incorporato in JMP.
Mi aiuta con il mio lavoro poiché renderà il processo di messa a punto dei miei modelli ancora più automatizzato e semplificato. Avrei voluto fare qualcosa per la piattaforma NN, ma stavo rimandando al tuo post e ora che ho realizzato la GUI, voglio espanderla per renderla più interfunzionale. La possibilità di mettere a punto un ampio insieme di modelli e concentrarsi solo sulle statistiche aiuta davvero a restringere lo spazio degli iperparametri in modo che sia più semplice confrontare modelli su piattaforme diverse e vedere quale sia il migliore nel prevedere nuovi dati. Quindi, puoi tornare indietro ed eseguire le impostazioni ottimali nella piattaforma standard e ottenere tutto il ricco feedback grafico fornito da JMP per visualizzare il modello e tutte le altre cose.
Buona fortuna!,
DS
Ri: costruzione di più modelli di rete neuraleOh! Ora, questo è davvero fantastico. L'unico piccolo problema è che, se la finestra dello script è direttamente sopra la tabella di "ottimizzazione", "richiama" la tabella di ottimizzazione nella finestra del modello invece della tabella dei dati. Finché la tabella dati e lo script sono in primo piano sullo schermo, i termini del modello vengono caricati correttamente. In effetti, ho eseguito appena 100 modelli in pochi minuti. Mi chiedo se puoi inserirlo nel depot dei "componenti aggiuntivi" (ho dimenticato il nome effettivo) sul sito Web di JMP in modo che riceva un'attenzione più diffusa. Sono certo che questo aiuterebbe MOLTE persone (se non immediatamente, almeno in futuro, poiché molti vedranno l'utilità di NN nella costruzione di modelli). Diavolo, probabilmente dovrebbe farsi strada in qualche modo in JMP Pro 17 (potrebbe essere troppo tardi per 16). Grazie mille per tutto il tuo aiuto e spero che questo aiuti anche la tua ricerca.
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Spero che il JMP e/o il reset del computer abbiano funzionato. In caso contrario, sono anche tornato indietro e ho creato una GUI per la modellazione NN: ho intenzione di espanderla per funzionare su piattaforme diverse. Non funziona perfettamente e a volte ricevo alcuni strani errori (uno scripter esperto probabilmente può eseguire il debug in pochi secondi). Ma la cosa bella è che funzionerà con qualsiasi tipo di colonna di dati di input: ordinale, nominale e continua, e funziona con i metodi di convalida accettabili per NN: righe escluse, holdback, Kfold e colonna di convalida. Funzionerà sia con le colonne di convalida che contengono dati di test sia con quelle che ne sono prive. È lo script chiamato NN GUI nella tabella dati (allegata).
Per chi fosse interessato, ho preso in prestito pesantemente un blog dallo staff di JMP .@juliagong (pensionato) Qui e una nota di supporto da .@Wendy_Murphrey Qui . Ho intenzione di creare una GUI in grado di automatizzare questa operazione per le altre piattaforme che ho automatizzato anche dalle tabelle di dati: albero potenziato, foresta bootstrap e XGBoost. Ho intenzione di pubblicarlo nella community, ma potrebbe volerci un po' di tempo, soprattutto per assicurarmi che sia stato eseguito il debug completo.
L'unica modifica dal codice seguente alla GUI nella tabella dati è la modifica dt = Data Table ("...") in dt = Current Data Table().
Spero che questo ti aiuti a fare progressi nel tuo lavoro. Fa per me perché posso migliorarlo per rendere più facili anche i miei sforzi di modellazione!
Buona fortuna,
DS
Codice GUI NN:
Names Default To Here( 1 );
//Clear Symbols();
dt = Data Table( "Neural networking Ofav 2017 dataset" );
dt_parms = Data Table( "NN Tuning 8" );
nc = N Col( dt );
dtp_name = dt_parms << get name;
dt_name = dt << get name;
valid_list = {"Excluded Rows Holdback", "Holdback", "KFold", "Validation Column"};
//the width of the column list box in pixels
lbWidth = 110;
/* Expression to clear all current settings */
clearRoles = Expr(
colListY << RemoveAll;
colListV << RemoveAll;
);
/* Expression to store the current settings in global variables */
recallRoles = Expr(
::ycolRecall = colListY << GetItems;
::vcolRecall = colListV << GetItems;
);
VmethodDlg = New Window( "Choose Validation Type",
<<RETURN result=""> 0,
VMeth_Insert = "Validation(" || ":" || validCol[1] || ")";
If(
coltype == "Ordinal",
set = 1;
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );,
coltype == "Nominal",
set = 2;
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );,
coltype == "Continuous",
set = 3;
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
dt_results << New Column( "SSE Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
);
If( VMeth == "Validation Column" & lvl == 0,
VMeth_Insert = "Validation(" || ":" || validCol[1] || ")";
If(
coltype == "Ordinal",
set = 1;
o_box = 3;
ncol_box_v = 10;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );,
coltype == "Nominal",
set = 2;
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );,
coltype == "Continuous",
set = 3;
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
);
);
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( response_col ),
X(
:OFA...22_c0_g2_i1.p1,
:OFA...47_c0_g1_i1.p1,
:OFA...73_c1_g1_i3.p1,
:OFA...72_c1_g1_i1.p1,
:OFA...5_c1_g2_i15.p1,
:OFA...78_c2_g1_i3.p1,
:OFA...51_c4_g1_i1.p1,
:OFA...38_c0_g1_i8.p1,
:OFA...19_c0_g1_i1.p1,
:OFA...22_c2_g1_i4.p1,
:OFA...27_c1_g3_i5.p1,
:OFA...82_c3_g2_i3.p1,
:OFA...11_c1_g1_i7.p1,
:OFA...50_c2_g4_i1.p3,
:OFA...18_c1_g1_i7.p1,
:OFA...66_c2_g1_i3.p1,
:OFA...85_c0_g1_i2.p1,
:OFA...99_c5_g1_i6.p1,
:OFA...03_c2_g1_i1.p1,
:SYM...24_c0_g1_i1.p1,
:SYM...75_c0_g2_i1.p1,
:SYM...42_c0_g1_i1.p1,
:SYM...04_c0_g1_i1.p1,
:SYM...97_c0_g1_i1.p1,
:SYM...13_c0_g1_i1.p1,
:SYM...66_c0_g1_i1.p1,
:SYM...72_c0_g6_i1.p1,
:SYM...13_c0_g1_i1.p1 2,
:SYM...33_c0_g1_i1.p1 3,
:SYM...43_c0_g1_i1.p1,
:SYM...51_c0_g1_i1.p1,
:SYM...65_c0_g1_i1.p1 2
),
^VMeth_insert^,
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
w = Window( dt_name || " - " || "Neural of " || y_resp[1] );
T_stats = w[Outline Box( o_box ), Number Col Box( 1 )] << Get;
V_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_v )] << Get;
If( VMeth == "Validation Column" & lvl > 0,
Test_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_test )] << Get
);
report << Close Window;
If( coltype == "Ordinal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
If( VMeth == "Validation Column" & lvl > 0,
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
);
If( coltype == "Nominal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
If( VMeth == "Validation Column" & lvl > 0,
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
);
If( coltype == "Continuous",
dt_results:R² Training[i] = T_stats[1];
dt_results:RMSE Training[i] = T_stats[2];
dt_results:Mean Abs Dev Training[i] = T_stats[3];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[4];
dt_results:SSE Training[i] = T_stats[5];
dt_results:Sum Freq Training[i] = T_stats[6];
dt_results:R² Validation[i] = V_stats[1];
dt_results:RMSE Validation[i] = V_stats[2];
dt_results:Mean Abs Dev Validation[i] = V_stats[3];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[4];
dt_results:SSE Validation[i] = V_stats[5];
dt_results:Sum Freq Validation[i] = V_stats[6];
If( VMeth == "Validation Column" & lvl > 0,
dt_results:R² Test[i] = Test_stats[1];
dt_results:RMSE Test[i] = Test_stats[2];
dt_results:Mean Abs Dev Test[i] = Test_stats[3];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[4];
dt_results:SSE Test[i] = Test_stats[5];
dt_results:Sum Freq Test[i] = Test_stats[6];
);
);
);</RETURN>Ri: costruzione di più modelli di rete neuraleHmmm, ho scaricato la tua nuova tabella e ora ricevo ogni volta l'errore della casella di riepilogo. Proverò a riavviare JMP, quindi a riavviare il computer. Sembra strano che funzioni dalla tua parte ma non dalla mia!
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Lo ripubblico perché sembra che il mio post originale che ho provato a modificare sia andato perso in qualche modo. Grazie per aver condiviso la tabella dei dati, mi ha aiutato a risolvere i problemi.
Ad ogni modo, ho apportato alcune modifiche, quindi alcune cose da notare:
- Ho fatto in modo che un singolo codice possa essere eseguito sui tipi di modellazione Ordinale, Nominale e Continuo. Non sono più necessarie due versioni diverse.
- Dovrai modificare la variabile y_resp, che è la colonna di risposta Y, inserendo il nome della colonna tra virgolette (vedi riga 8). Non è più necessario modificarlo nella chiamata all'interno di Neural(). Dovrai comunque modificare l'elenco di X().
- Il codice verifica quindi il tipo di modellazione della colonna y_resp, imposta alcune variabili e genera le colonne appropriate nella tabella dei dati di output.
- Alla tabella dei dati di output viene ora assegnato un nome in base al tipo di convalida e alla tabella dei dati host. In questo modo puoi eseguire tutti i tipi di convalida e quindi confrontarli senza avere strani problemi di denominazione da JMP.
- Ho modificato ciascuno dei diversi script di tipo di convalida presenti nella tabella dati e possono essere facilmente copiati/incollati in nuove tabelle dati. L'ho testato sulla tabella precedente che hai inviato e ha funzionato perfettamente.
- Ho corretto l'errore che il mio codice scriveva nel file di registro ogni volta che veniva eseguito, dovevo spostare una parentesi in una nuova posizione.
- Ho scoperto che il motivo per cui il tuo holdback e il mio k-fold non funzionavano correttamente è che quando esegui quel tipo, devi cambiare Validation() in Validation Method(). L'ho fatto per i tuoi diversi metodi e gli script sono corretti.
Quindi sta migliorando poco a poco, quindi è carino. Preferirei davvero che testasse il tipo di colonna di risposta e il metodo di convalida prima di generare colonne aggiuntive, ma non sono ancora sicuro di come farlo. Forse lo modificherò per il prossimo lancio!
Di seguito è riportato l'esempio di codice per la convalida Kfold. Ho anche allegato la tua nuova tabella dati con gli script corretti salvati al suo interno.
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning 8" );
dtp_name = dt_parms << get name;
dt_name = dt << get name;
//edit the line below so that it has the name of the column you want to model.
y_resp = "health designation";
response_col = Column( dt, Eval( Eval Expr( Expr( y_resp ) ) ) );
dt_results = dt_parms << Subset( Output Table( "Output of " || dtp_name || " with Kfold" || " for " || dt_name ), All rows, Selected Columns Only( 0 ) );
//This tests the response column type to automatically set the values for pulling the data out of the report window.
//It also will create the appropriate columns depending on the modeling type of the response column.
coltype = response_col << Get Modeling Type;
If( coltype == "Ordinal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
//dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
//dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
//dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Nominal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
//dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
//dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
//dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Continuous",
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
//dt_results << New Column( "R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
//dt_results << New Column( "SSE Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
);
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( response_col ),
X(
:OFA...22_c0_g2_i1.p1,
:OFA...47_c0_g1_i1.p1,
:OFA...73_c1_g1_i3.p1,
:OFA...72_c1_g1_i1.p1,
:OFA...5_c1_g2_i15.p1,
:OFA...78_c2_g1_i3.p1,
:OFA...51_c4_g1_i1.p1,
:OFA...38_c0_g1_i8.p1,
:OFA...19_c0_g1_i1.p1,
:OFA...22_c2_g1_i4.p1,
:OFA...27_c1_g3_i5.p1,
:OFA...82_c3_g2_i3.p1,
:OFA...11_c1_g1_i7.p1,
:OFA...50_c2_g4_i1.p3,
:OFA...18_c1_g1_i7.p1,
:OFA...66_c2_g1_i3.p1,
:OFA...85_c0_g1_i2.p1,
:OFA...99_c5_g1_i6.p1,
:OFA...03_c2_g1_i1.p1,
:SYM...24_c0_g1_i1.p1,
:SYM...75_c0_g2_i1.p1,
:SYM...42_c0_g1_i1.p1,
:SYM...04_c0_g1_i1.p1,
:SYM...97_c0_g1_i1.p1,
:SYM...13_c0_g1_i1.p1,
:SYM...66_c0_g1_i1.p1,
:SYM...72_c0_g6_i1.p1,
:SYM...13_c0_g1_i1.p1 2,
:SYM...33_c0_g1_i1.p1 3,
:SYM...43_c0_g1_i1.p1,
:SYM...51_c0_g1_i1.p1,
:SYM...65_c0_g1_i1.p1 2
),
Validation Method ( \!"Kfold\!", 5 ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of " || y_resp );
T_stats = w[Outline Box( o_box ), Number Col Box( 1 )] << Get;
V_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_v )] << Get;
//Test_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
If( coltype == "Ordinal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
//dt_results:Generalized R² Test[i] = Test_stats[1];
//dt_results:Entropy R² Test[i] = Test_stats[2];
//dt_results:RMSE Test[i] = Test_stats[3];
//dt_results:Mean Abs Dev Test[i] = Test_stats[4];
//dt_results:Misclassification Rate Test[i] = Test_stats[5];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
//dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Nominal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
//dt_results:Generalized R² Test[i] = Test_stats[1];
//dt_results:Entropy R² Test[i] = Test_stats[2];
//dt_results:RMSE Test[i] = Test_stats[3];
//dt_results:Mean Abs Dev Test[i] = Test_stats[4];
//dt_results:Misclassification Rate Test[i] = Test_stats[5];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
//dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Continuous",
dt_results:R² Training[i] = T_stats[1];
dt_results:RMSE Training[i] = T_stats[2];
dt_results:Mean Abs Dev Training[i] = T_stats[3];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[4];
dt_results:SSE Training[i] = T_stats[5];
dt_results:Sum Freq Training[i] = T_stats[6];
dt_results:R² Validation[i] = V_stats[1];
dt_results:RMSE Validation[i] = V_stats[2];
dt_results:Mean Abs Dev Validation[i] = V_stats[3];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[4];
dt_results:SSE Validation[i] = V_stats[5];
dt_results:Sum Freq Validation[i] = V_stats[6];
//dt_results:R² Test[i] = Test_stats[1];
//dt_results:RMSE Test[i] = Test_stats[2];
//dt_results:Mean Abs Dev Test[i] = Test_stats[3];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[4];
//dt_results:SSE Test[i] = Test_stats[5]
//dt_results:Sum Freq Test[i] = Test_stats[6];
);
);
Fammi sapere se riscontri altri problemi e proverò a risolverli.
Spero che questo ti aiuti!,
DS
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Grazie per aver condiviso la tabella dei dati. Sono riuscito a trovare alcune cose.
- Ho scoperto dov'era l'errore che continuava a scrivere nella finestra di registro e l'ho risolto. È nella chiamata str. Ho dovuto spostare una parentesi in una posizione diversa.
- Ho scoperto che quando si esegue K-fold o Holdback, è necessario modificare Validation() in Validation Method(). Quindi funziona e proporziona i dati in modo appropriato.
- Ho ricodificato il modo in cui verifica il tipo di modellazione della colonna e ho apportato alcune modifiche associate.
- L'ho anche scritto in modo che lo stesso codice possa essere utilizzato per Nominale, Ordinale e Continuo. Questo può essere fatto semplicemente modificando la variabile y_resp, il nome della colonna di risposta Y. Fa tutto il resto automaticamente.
- Ho anche aggiunto un titolo alla tabella dei dati dei risultati che cambia con la tabella dei dati "host" e il tipo di convalida in modo da poter eseguire tutti e tre i metodi e non ci saranno interferenze sui nomi da parte di JMP.
- I tre script di adattamento NN nella tabella dati possono ora essere copiati e incollati da una tabella dati a quella successiva senza problemi. L'ho testato con la prima tabella dati che hai inviato e ha funzionato perfettamente.
Ora sta diventando un po' più automatizzato ed è leggermente migliorato. Preferirei che controllasse il metodo di convalida e quindi generasse le colonne aggiuntive e assegnasse i valori di conseguenza. Forse nel prossimo lancio!
Ecco come appare il codice in generale. Si noti che stavo testando la colonna della temperatura per verificare la presenza di tipi di modellazione continua.
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning 8" );
dtp_name = dt_parms << get name;
dt_name = dt << get name;
//edit the line below so that it has the name of the column you want to model.
y_resp = "temperature (1, 2, 3)";
response_col = Column( dt, Eval( Eval Expr( Expr( y_resp ) ) ) );
dt_results = dt_parms << Subset( Output Table( "Output of " || dtp_name || " with (validation type)" || " for " || dt_name), All rows, Selected Columns Only( 0 ) );
//This tests the response column type to automatically set the values for pulling the data out of the report window.
//It also will create the appropriate columns depending on the modeling type of the response column.
coltype = response_col << Get Modeling Type;
If( coltype == "Ordinal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Nominal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Continuous",
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
dt_results << New Column( "SSE Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( response_col ),
X(
:OFA...22_c0_g2_i1.p1,
:OFA...47_c0_g1_i1.p1,
:OFA...73_c1_g1_i3.p1,
:OFA...72_c1_g1_i1.p1,
:OFA...5_c1_g2_i15.p1,
:OFA...78_c2_g1_i3.p1,
:OFA...51_c4_g1_i1.p1,
:OFA...38_c0_g1_i8.p1,
:OFA...19_c0_g1_i1.p1,
:OFA...22_c2_g1_i4.p1,
:OFA...27_c1_g3_i5.p1,
:OFA...82_c3_g2_i3.p1,
:OFA...11_c1_g1_i7.p1,
:OFA...50_c2_g4_i1.p3,
:OFA...18_c1_g1_i7.p1,
:OFA...66_c2_g1_i3.p1,
:OFA...85_c0_g1_i2.p1,
:OFA...99_c5_g1_i6.p1,
:OFA...03_c2_g1_i1.p1,
:SYM...24_c0_g1_i1.p1,
:SYM...75_c0_g2_i1.p1,
:SYM...42_c0_g1_i1.p1,
:SYM...04_c0_g1_i1.p1,
:SYM...97_c0_g1_i1.p1,
:SYM...13_c0_g1_i1.p1,
:SYM...66_c0_g1_i1.p1,
:SYM...72_c0_g6_i1.p1,
:SYM...13_c0_g1_i1.p1 2,
:SYM...33_c0_g1_i1.p1 3,
:SYM...43_c0_g1_i1.p1,
:SYM...51_c0_g1_i1.p1,
:SYM...65_c0_g1_i1.p1 2
),
Validation ( :Validation with test ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of " || y_resp );
T_stats = w[Outline Box( o_box ), Number Col Box( 1 )] << Get;
V_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_v )] << Get;
Test_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
If( coltype == "Ordinal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Nominal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Continuous",
dt_results:R² Training[i] = T_stats[1];
dt_results:RMSE Training[i] = T_stats[2];
dt_results:Mean Abs Dev Training[i] = T_stats[3];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[4];
dt_results:SSE Training[i] = T_stats[5];
dt_results:Sum Freq Training[i] = T_stats[6];
dt_results:R² Validation[i] = V_stats[1];
dt_results:RMSE Validation[i] = V_stats[2];
dt_results:Mean Abs Dev Validation[i] = V_stats[3];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[4];
dt_results:SSE Validation[i] = V_stats[5];
dt_results:Sum Freq Validation[i] = V_stats[6];
dt_results:R² Test[i] = Test_stats[1];
dt_results:RMSE Test[i] = Test_stats[2];
dt_results:Mean Abs Dev Test[i] = Test_stats[3];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[4];
dt_results:SSE Test[i] = Test_stats[5];
dt_results:Sum Freq Test[i] = Test_stats[6];
);
);Fammi sapere se ci sono ulteriori problemi.
Grazie!,
DS
Ri: costruzione di più modelli di rete neuraleÈ strano. Se continuo a eseguire lo script, alla fine funzionerà!
Un'altra cosa strana: non importa a cosa cambio la percentuale di holdback, mi dà sempre 11 allenamenti contro 9 convalide (~55/45%). Non è possibile fare, diciamo, il 70/30%? Ho la forte sensazione che ciò sia dovuto al fatto che ho semplicemente inserito il comando in modo errato, piuttosto che fosse impossibile!
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
L'errore della casella di riepilogo è probabilmente dovuto al tentativo di acquisire i valori statistici dalla finestra NN. Puoi condividere con me la nuova tabella dati e il codice? Posso risolverlo e vedere se posso rendere più semplice il trasferimento da una tabella dati a un'altra.
Penso che potrebbe avere a che fare con il modo in cui ho impostato la parte per controllare il tipo di colonna di dati e per dare alla variabile ncol_box un valore diverso. Se è nominale, questo valore è diverso rispetto a quando è ordinale o anche numerico.
Se puoi condividere la tabella dati e il codice con cui ricevi questo errore, sono sicuro di poterlo risolvere. Se lo desideri, puoi anonimizzare la tabella dati: Tabelle > Anonimizza.
DS
Ri: costruzione di più modelli di rete neuraleOk fantastico. Questo risponde ad alcune ulteriori domande che avevo. Ora l'unica cosa con cui ho difficoltà è che, quando copio, incollo ed eseguo lo script in una nuova tabella dati, ricevo un errore nella casella di contorno, a cui alludi nei commenti dello script. "carattere previsto arg 1 nell'accesso o nella valutazione della casella di contorno." Che cosa significa?? Ho aumentato e diminuito i numeri, ma ogni volta ricevo lo stesso messaggio di errore e lo script non verrà eseguito. Non so nemmeno cosa sia un riquadro di contorno. È strano che la struttura ad albero sia identica. Ho appena cambiato il nome del file. Il nome del file è più lungo. Forse questo significa che ho bisogno di una casella di contorno più grande?Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Se torni indietro e rivedi lo script, la seconda riga definisce quale tabella dati deve essere utilizzata durante l'analisi. Il codice JSL dt = Current Data Table() definisce una variabile locale "dt" che viene poi utilizzata nel resto dello script invece di dover chiamare la tabella dati per nome. Allo stesso modo, dt_parms è la variabile locale assegnata alla tabella di ottimizzazione NN, "NN tuning". Queste due tabelle sono davvero le uniche cose che inserisci nello script. Il resto è tutto interno.
Se copi/incolli il codice JSL in una nuova tabella dati, dovrebbe funzionare automaticamente perché lo stai eseguendo localmente in quella tabella dati.
Non dovresti modificare la chiamata dt << Nerual(), tranne che per definire i tuoi Y() e X(), e forse il metodo Validation(). Il codice JSL dt << Nerual() è un comando che indica a JMP di eseguire la modellazione NN sulla tabella dati "dt". Quindi, la definizione di cosa sia dt all'inizio del codice.
Sarà inoltre necessario modificare la chiamata w = Window() per riflettere quale sarà il titolo della finestra del report NN, così come Regex() sotto di essa. Infine, a seconda che tu abbia effettivamente o meno il set di dati "test" come parte di una colonna di convalida, allora vorrai commentare (con il comando // all'inizio della riga) o rimuovere il commento all'inizio del codice quando crea le colonne dei risultati del test nonché la definizione Test_stats e dove il codice scrive i risultati nella nuova tabella dei dati di output.
A parte questo, non dovresti dover modificare molto.
Per quanto riguarda la tua ultima domanda, dipende da come stai implementando il codice. Se lo stai eseguendo dall'interno della tabella dati, cioè se è salvato nella parte script della tabella dati e lo stai eseguendo tramite il pulsante verde, allora dovrai solo modificare Y() e X( ) che stai utilizzando come predittori e risposte per abbinare i nomi delle colonne della nuova tabella dati. Ovviamente dovrai avere la tabella "NN tuning" aperta. D'altra parte, se lo stai eseguendo come uno script separato, potresti voler modificare la definizione di dt da dt = Current Data Table() a dt = Data Table (" "), dove inseriresti il nome della nuova tabella dati tra virgolette.
Il "Neural" a cui ti riferisci non è una tabella dati ma il comando JMP per eseguire un modello di rete neurale su una tabella dati specificata. Il comando "<<" significa eseguire l'azione che si trova a destra di << sull'oggetto a sinistra. Vicino all'inizio del codice puoi vederlo con il nuovo comando colonna. Dove dice dt_results << New Column(), il codice indica a JMP di creare una nuova colonna per l'oggetto dt_results, ovvero i dati del sottoinsieme generati dalla tabella dati dt_parms.
Spero che questo ti aiuti!,
DS
Ri: costruzione di più modelli di rete neuraleHo una domanda (probabilmente semplice) sullo scripting. Diciamo che voglio cambiare l'input dt con un altro. Non dovrei semplicemente essere in grado di copiare e incollare lo script e sostituire il dt di "Neural" con qualcos'altro?
str = Eval Insert(
"report = (dt << Neural (
Y( :health designation ),
X(
Se elimino il file "Neural" originale e lo sostituisco con un'altra tabella con le stesse identiche informazioni e un nome diverso, lo script non funzionerà! È necessario avere esattamente gli stessi dati in due tabelle dati, una delle quali si chiama "Neural?" Forse mi sono persa quella parte!
Ri: costruzione di più modelli di rete neuraleSono felice di sapere che per te sta funzionando. Buona fortuna con la modellazione! Potresti voler controllare anche altre piattaforme di modelli e quindi confrontare i modelli su un set di dati di test per vedere qual è il miglior predittore.
DSRi: costruzione di più modelli di rete neuraleWow, non posso credere di aver eseguito 300 modelli di reti neurali prima di pranzo grazie al tuo aiuto con gli script. Spero che questo venga raccolto e "complito" perché immagino che quando sempre più persone inizieranno a vedere il valore della piattaforma NN, graviteranno verso qualcosa del genere, soprattutto se si tratta di un set di dati nuovo di zecca e non lo fai davvero sapere dove "immergersi" rispetto alla sconcertante quantità di parametri di input del modello NN che possono essere leggermente modificati (a volte risultando in enormi differenze anche semplicemente aumentando, ad esempio, il tasso di apprendimento da 0,05 a 0,1). Successivamente giocherò con i diversi approcci di convalida (colonna di convalida rispetto a holdback rispetto a KFold). Sicuramente bisogna stare attenti data la mia (attualmente) piccola dimensione del campione (spero di utilizzare questi dati preliminari per ottenere fondi per aggiungere più "file", cioè coralli).
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Kfold è anche un altro ottimo modo per convalidare il set di dati breve. Sì, l'esclusione della riga la imposteresti come stato della riga, cosa che potresti fare selezionando il set di dati "test" e impostando lo stato della riga su "escluso". Se si utilizza Kfold o Holdback, JMP li utilizza per la convalida dei dati, non per il test dei dati. Si spera che tu abbia anche un set di dati separato che puoi utilizzare come dati di test e non averlo nella stessa tabella dati dei dati di training e convalida.
Vorrei semplicemente utilizzare Kfold per la convalida e quindi commentare le parti che non sono necessarie per eseguire lo script. Di seguito è riportata la versione modificata con un'impostazione di convalida di 5.000 volte per la piattaforma NN.Dovrebbe funzionare, per me ha funzionato.
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning" );
dt_results = dt_parms << Subset( All rows, Selected Columns Only( 0 ) );
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
//dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
//dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
//dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( :health designation ),
X(:OFA...22_c0_g2_i1.p1 ),
Validation ( \!"KFold\!", 5 ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
)),
Go,
invisible
) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of health designation by OFA...22_c0_g2_i1.p1" );
If( !Is Missing( Regex( w << Get Window Title, "health designation by OFA...22_c0_g2_i1.p1" ) ) == 1,
ncol_box_v = 10;
//ncol_box_test =19;
);
T_stats = w[Outline Box( 3 ), Number Col Box( 1 )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
V_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_v )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
//Test_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
//dt_results:Generalized R² Test[i] = Test_stats[1];
//dt_results:Entropy R² Test[i] = Test_stats[2];
//dt_results:RMSE Test[i] = Test_stats[3];
//dt_results:Mean Abs Dev Test[i] = Test_stats[4];
//dt_results:Misclassification Rate Test[i] = Test_stats[5];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
//dt_results:Sum Freq Test[i] = Test_stats[7];
);
Buona fortuna!,
DS
Ri: costruzione di più modelli di rete neuraleAltri ottimi suggerimenti, soprattutto per quanto riguarda il tipo di validazione. Vedo che Neural supporta holdback, Kfold o esclusione di righe (per cui immagino che sceglierei casualmente alcune righe da tralasciare). Se volessi cambiare lo script per cambiare il tipo di convalida, cambierei semplicemente la riga "Validazione ( :Validation with test )"? E i campioni trattenuti sarebbero equivalenti agli occhi di JMP come campioni di validazione? In caso contrario, dovrei rimuovere le colonne di convalida (o rinominarle) e anche le colonne di test dovrebbero essere eliminate.
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Sono contento che abbia risolto il tuo problema.
Con la modellazione basata su alberi (XGBoost, alberi potenziati e foresta bootstrap), puoi utilizzare facilmente la GUI della tabella di ottimizzazione all'interno di JMP per eseguire molti modelli. Ma uno svantaggio è che consuma molta RAM. La cosa bella di eseguirlo in questo modo è che puoi eseguire decine di migliaia di impostazioni di parametri diversi e non consuma molta RAM, solo il consumo della CPU. Ho eseguito fino a 40.000 impostazioni diverse con la foresta di bootstrap (che è lenta) e potrebbero essere necessari alcuni giorni sul mio laptop da lavoro (32 GB di RAM e CPU da 2 GHz).
Sono anche uno dei primi ad adottare JMP 16 e lo screening dei modelli è carino, ma come hai sottolineato, non sta ottimizzando nessuno dei modelli, il che può essere un po' fuorviante. Utilizza semplicemente le impostazioni predefinite, che non sono sempre le impostazioni migliori per creare un modello predittivo. Potrebbe almeno aiutarti a determinare quali piattaforme valgono lo sforzo di ottimizzare ulteriormente e quali non vale la pena esaminare.
Potresti prendere in considerazione anche la piattaforma SVM per modellare i tuoi dati nominali poiché anche questo dovrebbe essere un buon metodo per quel tipo di dati.
Per quanto riguarda il simulatore, questo è qualcosa di diverso ed è inteso come un modo per testare le stime con condizioni iniziali diverse (randomizzazione). Ciò fornisce una distribuzione di valori per la stima e fornisce un intervallo di confidenza per la stima originale e puoi quindi decidere se il modello con le stime fornite è valido o meno.
Per quanto riguarda il DOE, potresti fare un fattoriale o addirittura eseguire un progetto di riempimento dello spazio con i fattori impostati in modo appropriato, e penso che la piattaforma consenta anche vincoli condizionali. Inoltre, potresti prendere in considerazione l'esecuzione di uno screening dei predittori o del bootstrap sui predittori per vedere se sono effettivamente necessari tutti e 89 o se puoi davvero utilizzare solo un sottoinsieme più piccolo.
Come ultima nota, poiché hai una tabella dati breve e ampia, potresti prendere in considerazione invece di utilizzare una colonna di convalida, eseguire un approccio Leave one Out per la convalida. Se lo fai, dovrai modificare lo script per quello.
Buona fortuna!,
DS
Ri: costruzione di più modelli di rete neuraleAh! Grazie mille per averlo rifatto per me. Chiaramente non ho alcuna conoscenza di scripting, quindi ho semplicemente cambiato "Neural" con il nome della mia tabella dati... il che ovviamente non funzionerebbe. Dopo aver cambiato il nome della mia tabella dati in "Neural", aggiunto le colonne Test e apportato le altre modifiche consigliate, ha funzionato.
Ora quello che potrei fare è usare DOE per creare un progetto fattoriale condizionale (poiché, come hai notato, non è possibile potenziare con più livelli nascosti) ed eseguire alcune centinaia di modelli sul mio computer di lavoro (in modo da non tassare eccessivamente i miei 8 -GB di RAM del computer portatile).
Sento che il tuo script deve diventare una GUI o un componente aggiuntivo (qualche acquirente?). JMP Pro 16, che sto testando in versione beta, dispone di uno strumento di "screening dei modelli" davvero eccezionale, ma penso che effettui test su diversi tipi di modellazione (ad esempio, PLS rispetto a Gen-Reg), non ENTRO le potenzialmente migliaia di modelli che potrebbero essere costruito all'interno di ogni tipo di modellazione (altrimenti potrebbe non smettere mai di funzionare). Ho sentito parlare del "simulatore", ma penso che faccia qualcosa di diverso (non generi tonnellate di modelli simulati), anche se potrei sbagliarmi. Ancora una volta, grazie mille per il tuo aiuto. Questo mi farà sicuramente risparmiare GIORNI di tempo!
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Grazie per aver condiviso la tabella dati, è stata utile per eseguire il debug delle modifiche apportate allo script.
Alcune cose che ho notato:
- Era necessario aggiungere ulteriori colonne per le statistiche del set di dati "Test" che desideri registrare.
- Hai rimosso accidentalmente la definizione di imax, che è il numero di righe della tabella dei parametri
- Hai anche accidentalmente modificato la chiamata alla piattaforma NN dove nello script dice dt << Neural(), è qui che invia il comando per eseguire la modellazione della rete neurale sulla tabella dati "dt". L'avevi cambiato con qualcos'altro.
- La definizione della finestra "w" deve avere il nome completo della finestra NN e se stai eseguendo solo una singola X, a quanto pare JMP lo inserisce come parte del nome della finestra, quindi deve essere in entrambi il comando GetName e l'istruzione IF sottostante. Ma questo è vero solo quando si modella con una singola X. Se ne usi più di uno, non è necessario che ci sia "by..." nel nome della finestra o nell'istruzione IF.
- L'ultima parte è assicurarsi che le statistiche per i dati di training, validazione e test siano richiamate correttamente nel comando Number Col Box().
Il codice seguente funziona sulla tabella dati (anche allegato con script modificato). Funziona con la tabella NN Tuning che ho fornito prima.
Se intendi davvero utilizzare tutte le 86 colonne, devi inserirle manualmente nella parte X(col1, col2,...) dello script. Dovresti quindi modificare anche la parte GetName perché non includerà tutti gli 86 nomi, sarà solo il nome della finestra con la colonna di risposta.
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning" );
dt_results = dt_parms << Subset( All rows, Selected Columns Only( 0 ) );
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( :health designation ),
X(
:OFA...22_c0_g2_i1.p1
),
Validation ( :Validation with test ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
)),
Go,
invisible
) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of health designation by OFA...22_c0_g2_i1.p1" );
If( !Is Missing( Regex( w << Get Window Title, "health designation by OFA...22_c0_g2_i1.p1" ) ) == 1,
ncol_box_v = 10;
ncol_box_test =19;
);
T_stats = w[Outline Box( 3 ), Number Col Box( 1 )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
V_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_v )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
Test_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
Spero che questo ti aiuti!,
DS
Ri: costruzione di più modelli di rete neuraleBeh, ho fallito, ma penso che probabilmente sia a causa di qualche piccolo errore di scripting. Ho utilizzato la tabella di ottimizzazione NN con i miei dati (allegati) e apportato tutti gli aggiornamenti necessari (ho utilizzato tre campioni di formazione+convalida+test). Se esegui l'ultimo script ("confronto della rete neurale"), verrà creata la nuova tabella, ma non verrà eseguita alcuna analisi. Ho incluso solo alcuni termini X, ma in realtà saranno tutte le 86 colonne nel gruppo "dati standardizzati". Quando utilizzo il debugger, dice che qualcosa sta andando storto con il file
" Per ( io = 1 , i <= imax, i++," area. Spero/immagino che uno sceneggiatore più competente possa probabilmente trovare il problema in pochi secondi!
Ri: costruzione di più modelli di rete neuraleSÌ! Questo è esattamente ciò che voglio: una tabella con tutti i parametri di input NN (ad esempio, numero di nodi TanH, numero di livelli, ecc.) che si sincronizza con la piattaforma NN. Non l'ho ancora provato e immagino che ci vorrà un po', ma sto utilizzando un piccolo set di dati di "pratica" di 20 campioni x 90 predittori, quindi potrebbe essere fattibile. In realtà, ho scoperto solo che il tipo di attivazione e il numero di nodi (così come il numero di tour) in realtà abbassano il mio RMSE, con il potenziamento che non aiuta molto. Ma anche in questo caso, sarà molto più veloce che eseguire tutti i circa 500 modelli che avevo pianificato di eseguire (non così tanti quanti avevo intenzione di eseguirli ieri, per fortuna, poiché voglio rimanere sotto i 4 nodi/tipo di attivazione). Domani lo provo e faccio sapere a tutti come va.
Ri: costruzione di più modelli di rete neuraleCIAO @abmayfield ,
Era qualcosa che volevo scrivere da un po' ed è stato davvero divertente, e il tuo post ha dato il via a tutto, grazie! È da un po' che desidero trovare un modo per ottimizzare la piattaforma NN poiché è molto sensibile alle condizioni iniziali ed è piuttosto lento farlo manualmente.
Quindi, ho adattato alcuni script che ho realizzato per altre piattaforme modello per automatizzare i loro processi di ottimizzazione, ad esempio l'albero potenziato, la foresta bootstrap e le piattaforme XGBoost. Gli script devono essere salvati nella tabella dati ed eseguiti con il pulsante verde.
Si spera che tu sappia qualcosa sugli script e sappia dove adattare questi script alle tue situazioni specifiche/struttura dei dati/nomi delle colonne, ecc. Ho inserito alcuni commenti per cercare di aiutare a spiegare cosa sto facendo in ciascun gruppo più grande. Allego due script: uno per Y continui e uno per Y nominali/ordinali. Ho dovuto includere un test per vedere se l'output Y è nominale o ordinale perché il valore Number Col Box() cambia a seconda di ciò. Ho utilizzato la tabella dati Big Class Families.jmp nei dati di esempio come set di dati di test. Includo anche due tabelle di dati di output che generi utilizzando l'ottimizzazione numerica NN o l'ottimizzazione NN nominale/ordinale. Ho eseguito il nominale su :sex utilizzando :age, :weight:, :height, quindi ho cambiato :age da Ordinale a Continuo e ho modellato l'età con :weight e :sex per l'ottimizzazione NN continua.Gli adattamenti e le statistiche sono orribili, ma sono intesi solo allo scopo di vedere se JSL funziona o meno. Ho anche aggiunto una colonna :Validation alla tabella dati stratificando su :age, solo per verificare che tutto funzionasse correttamente.
Sono sicuro che qualcun altro potrebbe scriverlo in modo più elegante per testare la colonna di input Y() in modo che sia di tipo modellante Continuo, Nominale o Ordinale e quindi inserire il valore Number Col Box() appropriato per estrarre i dati in modo appropriato utilizzando solo un codice JSL unico.
Dovrai modificare gli input Y() e X() nella sezione dt << Nerual() nonché nella parte in cui ottieni il nome della finestra del report, poiché prende il nome dalla variabile che stai modellando.
Le tabelle di ottimizzazione NN potrebbero essere trattate come un DOE che riempie lo spazio in linea di principio in cui le impostazioni inferiore e superiore sono qualunque cosa tu voglia impostarle, tranne alcune di esse, come N_Layers può essere solo 1 o 2 perché JMP ne consente solo 1 o 2 strati. Penalty_Method rappresenta solo le opzioni valide nella piattaforma NN e Transform Covariate e Robust Fit assumono solo valori pari a 0 o 1 (disattivato o attivato). Includo anche la tabella di sintonizzazione NN.
Se avete domande fatemi sapere.
Ecco il mio codice per il tipo di modellazione Nominale/Ordinale:
Names Default To Here( 1 );
dt = Data Table( "Big Class Families" );//enter the name of the current data table
dt_parms = Data Table( "NN Tuning" );//enter name of parameter data table for tuning the NN
dt_results = dt_parms << Subset( All rows, Selected Columns Only( 0 ) );//this copies the tuning table with all the different rows in it
//these commands create columns to record the fit results
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//This part just creates a separate modelling progress, delete if you don't want it.
i = 1;
imax = N Row( dt_parms );
dlgStatus = New Window( "Overall Modeling Progress",
V List Box(
Text Box( " Overall Modeling Progress ", <<SET font="" size=""></SET>
Una cosa strana che non capisco è che ricevo questo avviso relativo alla finestra di registro che creo quando la eseguo per la piattaforma NN, ma non l'ho mai ricevuto dalle altre mie piattaforme. Non riesco a capire da dove provenga l'avviso, ma funziona ancora correttamente. Forse qualcuno può sistemare quella parte del mio codice?
Inaspettato",". Forse manca ")".
Tentativo di analizzare l'operando per l'operatore "<<".
Riga 23 Colonna 10: )) ►,
Come ultima nota: fai attenzione alle impostazioni poiché può richiedere MOLTO tempo per eseguire la modellazione se disponi di un numero elevato di boost o tour o funzioni di trasferimento. Basta fare attenzione a non esagerare.
Spero che questo ti aiuti!,
DS
Ri: costruzione di più modelli di rete neuraleA proposito, il trucco dell'"opzione" per far sì che tutte le funzionalità rilevanti mostrino le stesse informazioni della funzionalità che stai selezionando attivamente è in realtà il trucco del "comando" su un Mac (ecco perché in precedenza non funzionava).
Ri: costruzione di più modelli di rete neuraleMarco, grazie per i tuoi suggerimenti. Il secondo che ho provato e ha fallito. Conosco l'opzione "crea tabella combinata" da altre piattaforme, ma forse per qualche motivo è stata lasciata fuori dalla piattaforma neurale. Stranamente, il trucco dell'"opzione", per cui si tiene premuto il tasto opzione, si effettua una selezione e si applica a tutte le parti del report, non funziona né nella piattaforma neurale, altrimenti potrebbe accelerare le cose.
Sarebbe bello se potessi avere i parametri della mia rete neurale (# nodi, #tour, ecc.) come X in un DOE, con l'obiettivo di ridurre al minimo RSME, ma sembra che non sia possibile a causa del modo in cui devi inserire il parametri nelle caselle particolari nel lancio del modello neurale. Dovresti eseguire degli script davvero avanzati, e anche in questo caso non sono sicuro che DOE e Neural possano comunicare correttamente. Ma se qualcuno là fuori conosce un modo in cui potrei fare in modo che la piattaforma neurale esegua sostanzialmente i modelli riflessi in questo screenshot (essendo una sottoselezione del totale complessivo), lo apprezzerei molto. In altre parole, i valori nella prima tabella dello screenshot dovrebbero essere inseriti nelle caselle di input appropriate nel secondo screenshot (ovvero, il lancio del modello neurale).
Ri: costruzione di più modelli di rete neuralePotresti progettare un esperimento con meno livelli per adattarlo a un modello di secondo ordine di RMSE e quindi utilizzare il modello per ottimizzare le impostazioni. Inoltre, puoi creare ciascun modello a turno e quindi estrarre tutti i risultati contemporaneamente facendo clic con il pulsante destro del mouse su una delle tabelle dei risultati e selezionando Trasforma in tabella combinata.