Automatizza la rete neuraleCiao a tutti,
Sto lavorando a un progetto utilizzando un modello di rete neurale per prevedere l'umidità del suolo in luoghi diversi (circa 1000) definiti dalle loro coordinate univoche.La stessa struttura per la rete neurale in JMP può essere applicata a tutti i siti. Quindi, sto pensando di automatizzare il lavoro. Può essere uno script JMP in grado di trovare il coordinatore della posizione (X, Y), estrarre gli input di dati necessari ed eseguire la rete neurale. Al termine, lo script può salvare i report dei modelli. Hai qualche suggerimento o consiglio che puoi condividere con me?
Grazie in anticipo.
Qualsiasi suggerimento o discussione è apprezzato.
Re: automatizzare la rete neuraleCIAO @Marco1 ,
Non sono sicuro di seguire il motivo per cui vorresti prevedere un certo numero di periodi senza avere una colonna di output. Se sai di avere un buon set di predittori per il tuo modello, che sia NN o basato su albero o kNN, allora non penso che sia davvero importante, si tratta solo di prevedere se il modello fa o meno un buon lavoro i prossimi eventi. Devi alimentare una colonna Y ai modelli, altrimenti non hanno risultati da provare e prevedere per l'addestramento e la convalida del modello. Le piattaforme ti consentono di salvare la formula di previsione nella tabella dei dati o di pubblicarla nel deposito per il confronto con altre previsioni che generi, in modo da poterle testare su nuovi dati e vedere qual è il modello migliore, che dipende dalla metrica che usi stai guardando e se stai facendo classificazione o regressione.
Dovrò esaminare il bordo di Pareto quando avrò un po' di tempo in più, grazie per il componente aggiuntivo.
Anche se sarebbe fantastico per una GUI one-stop eseguire tutte le diverse piattaforme di modellazione all'interno di JMP, è un po' troppo per me da intraprendere in questo momento. Forse nelle versioni future posso aggiungere piattaforme aggiuntive. Al momento, può eseguire NN, albero potenziato, foresta bootstrap e XGBoost. Ho intenzione di aggiungere anche kNN, ingenuo Bayes e SVM all'elenco. Ci vuole tempo per risolvere bug e quant'altro, specialmente quando si chiamano più piattaforme diverse.
Grazie!,
DS
Re: automatizzare la rete neuraleCiao Dierich,
Buona spiegazione, una domanda: riguardo alla previsione delle serie temporali con le reti neurali JMP, come si potrebbe ottenere una previsione dei prossimi 2, 3, 4, 5 o più periodi in futuro, con 1, 2, 3 o più colonne di input ? ... ovvero senza colonne di output.
Per quanto riguarda l'ottimizzazione multiobiettivo (bordo di pareto), ho allegato un'ottima GUI che può essere scaricata dalla comunità JMP, forse aiuterà nell'aggiornamento della GUI su cui stai lavorando.
Sarebbe fantastico se la GUI potesse ottimizzare i parametri di qualsiasi piattaforma di cui dispone JMP, comprese le serie temporali (ARIMA, Winter ...) evitando che l'utente debba svolgere il lavoro che potrebbe svolgere un'ottimizzazione.
Grazie per l'aiuto!
Saluti,
Marco
Re: automatizzare la rete neuraleCIAO @giaMSU ,
Se vuoi davvero confrontare diversi NN con diversi schemi di convalida, imposterei il seme casuale su un numero, diciamo 12345. In questo modo, partirà sempre dallo stesso punto. Dove va da lì dipende dai parametri utilizzati nel modello e dal set di convalida, ma almeno tutto inizierà dallo stesso punto.Nella mia esperienza, avere un buon schema di convalida è molto importante. Se selezionando esempi specifici per l'addestramento o la convalida, potresti creare un set di dati altamente squilibrato che preferisce un risultato piuttosto che un altro, che finirebbe per adattarsi eccessivamente all'addestramento e non prevedere bene il set di convalida o viceversa. Potresti anche considerare di creare colonne di convalida K-fold, che è una specie di schema di convalida k-fold nidificato, quindi potresti esaminare le previsioni di adattamento e persino le statistiche di adattamento per ciascuna delle colonne nidificate. Solo un pensiero.
Buona fortuna!,
DS
Re: automatizzare la rete neuraleCIAO @Marco1 ,
Non sono sicuro di quale piattaforma in JMP si userebbe per eseguire la generazione DOE del confine di Pareto. Nella mia GUI che sto aggiornando ora, chiamo la piattaforma Space Filling DOE, che riempie in modo ottimale lo spazio iperparametrico con punti basati sui valori di input bassi e alti per Space Filling DOE. La tabella di dati risultante che viene generata salva tutte le statistiche di adattamento in modo che sia possibile valutare ogni adattamento e persino tornare indietro ed eseguirle manualmente nelle piattaforme in un secondo momento.
Per quanto ne so, JMP non supporta più di due livelli. Non ricordo i dettagli, ma è stato menzionato durante una delle sessioni del Discover Summit Americas della scorsa settimana. Penso che sia perché durante la valutazione delle prestazioni (in particolare le prestazioni predittive), più di due livelli non hanno aggiunto molto per il tempo di calcolo aggiuntivo nella costruzione del modello. Inoltre, tieni presente che durante il potenziamento con NN, è consentito solo un livello. Spesso il numero di nodi è più significativo del numero di livelli.
Per quanto ne so, dovresti essere in grado di modellare le serie temporali con la piattaforma NN. Non vedo alcuna limitazione lì. L'unica sfida, ovviamente, è l'interpretabilità del modello NN. È molto più difficile interpretare le trasformazioni di X -> Y in NN.
Allego una tabella di sintonizzazione NN di base (NN Tuning) e un DOE di riempimento dello spazio per esplorare lo spazio degli iperparametri. Nota che ho solo due dei quattro metodi di penalità nel mio DOE. Inoltre, ho consentito a ogni variabile (tranne l'adattamento robusto) di variare, ma poiché il potenziamento è consentito solo per un modello a livello singolo, il codice elimina automaticamente le scelte a due livelli e ritorna a un'opzione di potenziamento. Come nota finale, tutte le 13 colonne devono essere presenti nella tabella di ottimizzazione selezionata durante l'esecuzione della GUI. Se non sono presenti, genererà un errore.
Le piattaforme DOE rimuoveranno qualsiasi fattore che è una costante per impostazione predefinita. Se manca una colonna dopo aver generato il DOE, è necessario copiarla nuovamente dalla tabella dei fattori (e inserire il valore fino alla fine della tabella), da qui l'esempio in cui Robust Fit è mantenuto costante a 0. Ho usato un seme casuale di 1234, con 120 esecuzioni per generare il DOE Space Filling.
Spero che questo ti aiuti,
DS
Re: automatizzare la rete neuraleCiao Dierich,
Sono lieto di salutarti, sarebbe eccellente se la GUI potesse eseguire l'ottimizzazione multi-oggetto (bordo di pareto) in tutti gli iperparametri che l'utente deve regolare e creare più di 2 livelli (deep learning)
Una domanda: è possibile fare previsioni di serie temporali con le reti neurali di JMP?
L'esempio che ho inviato, ovvero la tabella di aggiustamento è stata creata dal DOE personalizzato di JMP, sto solo imparando a usare NN e DOE, quali colonne DOE elimina? Quali colonne devo inserire e in quale tabella? Cioè, la tabella dei dati o la tabella degli aggiustamenti?
Per favore, potresti inviare un esempio?
Grazie per la risposta e l'aiuto!!!
Saluti,
Marco
Re: automatizzare la rete neuraleCIAO @Marco1 ,
Grazie. In realtà sto aggiornando ulteriormente il JSL in modo che generi la tabella di ottimizzazione per l'utente. Il problema con farlo manualmente è, sì, è necessario conoscere abbastanza bene i dettagli del codice. Il problema che stai riscontrando è che il codice si aspetta che determinate colonne siano nella tabella dei dati di ottimizzazione, anche se sono costanti perché ogni riga contiene i parametri che vengono inviati alla piattaforma di modellazione.
La mia ipotesi è che quando hai creato la tabella di ottimizzazione, JMP abbia automaticamente eliminato tutti i termini costanti. La tabella di ottimizzazione risultante non contiene le colonne corrette e pertanto genererà un errore. Non sono il miglior programmatore, quindi cercare di affrontare tutti i possibili scenari richiede del tempo.
Nel frattempo, prima che esca la mia prossima versione, ti suggerisco di ricopiare le colonne che JMP ha rilasciato e quindi di riempire i valori fino alla fine della tabella. Questo dovrebbe farti andare avanti. Se hai ulteriori problemi, fammi sapere.
Spero che questo ti aiuti!,
DS
Re: automatizzare la rete neuraleCiao Diedrich Schmidt,
Mi congratulo con te per la GUI Gen_AT_v3.0, a quanto pare non so come usarla, ottengo un errore:
C'è un manuale o esempi?
In allegato tabella delle serie temporali e tabella dei parametri.
Grazie per il vostro sostegno.
Saluti,
Marco





Re: automatizzare la rete neuraleCiao DS,
Grazie per l'aiuto. Onestamente, ho rinunciato e l'ho fatto manualmente.
Ho provato lo script molte volte chiedendo alle persone o imparando da solo con JMP Scripting Index. Ad esempio, ho utilizzato l'opzione Get RSquare Validation in fit() o add rSquare = (report(obj)["Convalida"]["mvalue"][NumberColBox(1)]< mostra (rSquare);
Entrambi non hanno funzionato.
Informazioni sul tuo suggerimento sulla selezione casuale del set di dati di convalida K-fold. È una buona idea. Tuttavia, voglio mantenere la coerenza della struttura NN in modo da poter confrontare le prestazioni tra NN. La maggior parte degli articoli che ho letto, utilizzando Artificial NN, non menziona il modo in cui selezionano il loro set di dati di convalida durante le iterazioni.
Proverò a vedere qualsiasi miglioramento in R2. Vi farò sapere presto il risultato.
Migliore
Re: automatizzare la rete neuraleCerto, felice che aiuti!Re: automatizzare la rete neuraleGrazie mille.
Re: automatizzare la rete neuraleGrazie, .@G_M!Re: automatizzare la rete neuraleBel lavoro, @SDF1 .
Re: automatizzare la rete neuraleCIAO @giaMSU E @G_M ,
In precedenza in questo thread, ho pubblicato una sezione dello script che utilizzo sempre quando eseguo migliaia di set di allenamento per salvare solo R ^ 2, RASE, ecc.
COME @G_M menzionato, ti consigliamo di entrare nella struttura ad albero del rapporto per scoprire dove i valori devono essere salvati. Alla fine dello script, appena prima della fine del ciclo FOR, è qui che estrae i valori dalla struttura ad albero del report.
Ho modificato il mio script precedente che automatizza l'adattamento NN e ho incluso la parte del mio post precedente che estrarrà i valori di adattamento (R2 e RMSE). Se vuoi altri valori, puoi aggiungerli anche tu. Lo script crea una nuova tabella di dati che ha i risultati dell'adattamento NN per ogni ID di posizione. Ho anche modificato la parte in cui ogni tabella di dati viene generata in base all'ID di posizione in modo che la tabella di dati abbia il proprio identificatore univoco basato sull'ID di posizione, anche se alla fine chiudo comunque ogni tabella di dati; in linea di principio puoi tenerli tutti aperti commentando il comando di chiusura alla fine del ciclo FOR, ma poi avrai un'enorme quantità di tabelle di dati aperte.
Prima di implementare il codice, ti consiglio vivamente di leggere i commenti e capire cosa sta facendo lo script. Una volta acquisita familiarità con lo scripting, cambierà per sempre la tua vita in JMP!
In una nota a margine, hai davvero bisogno di avere sempre lo stesso seme casuale? Consiglio di lasciarlo vuoto per l'adattamento in modo da ottenere davvero casualità con l'adattamento, che può renderlo più robusto. Inoltre, hai abbastanza osservazioni nei tuoi dati da poter creare una colonna di convalida con un set di addestramento, convalida (e test) in modo da poter effettivamente scoprire quale dei modelli è effettivamente il migliore nella previsione. È possibile stratificare questa colonna di convalida in base alla colonna :Y ("SoilMoisture(kg.m-2) o (mm)"). Puoi automatizzare anche questo e averlo nella parte in cui crea ciascuna delle tabelle di dati dopo aver riepilogato su: ID.
Eseguendo lo script seguente sulla tabella dei dati, ottengo il seguente output:

Names Default To Here( 1 ); //keeps variables local, not global
dt = Data Table( "Subset of 765-450" ); //defines your starting data table
Summarize( locs = BY( dt:ID ) ); //creates a list of the different location IDs
<BR />//This FOR loop creates all the different data tables based on location ID and also names them based on location ID
For( j = 1, j <= N Items( locs ), j++,
file = dt << Select Where( locs[j] == Char( :ID ) ) << Subset( file, Output Table Name( "Model Subject File Location ID " || locs[j] ) )
);
<BR />//this portion of the code generates the list of data tables that will be used to train the models for each location.
dt_list = {};
one_name = {};
For( m = 1, m <= N Table(), m++,
dt_temp = Data Table( m );
one_name = dt_temp << GetName;
If( Starts With( one_name, "Model" ),
Insert Into( dt_list, one_name )
);
);
<BR />//this portion of the code creates the fit result data table that will record the statistics for each fit, to be reviewed later. Also adds the label column property to the Loc_ID column.
dt_fit_results = New Table( "Fit Results", Add Rows( N Items( dt_list ) ), New Column( "Loc_ID", "Continuous" ) );
dt_fit_results << New Column( "R² Training" );
dt_fit_results << New Column( "R² Validation" );
dt_fit_results << New Column( "RMSE Training" );
dt_fit_results << New Column( "RMSE Validation" );<BR />dt_fit_results:Loc_ID << Label;
<BR />//this FOR loop makes sure that each row of the fit result table also includes the location ID
For( l = 1, l <= N Items( dt_list ), l++,
dt_fit_results:Loc_ID[l] = dt_list[l]:ID[l]
);
//this FOR loop is the fitting routine for each location data table.
For( i = 1, i <= N Items( dt_list ), i++,
NN = Data Table( dt_list[i] ) << Neural(
Y( :Name( "SoilMoisture(kg.m-2) or (mm)" ) ),
X(
:Name( "Tmax(K)" ),
:Name( "Tmin(K)" ),
:Name( "Precip(mm)" ),
:LAI_hv,
:LAI_lv,
:Name( "Winspeed(m/s)" ),
:Name( "Evatransporation(kgm-2s-1)" ),
:LandCover,
:USDASoilClass,
:Forecast_Albedo
),
Informative Missing( 0 ),
Transform Covariates( 1 ),
Validation Method( "KFold", 7 ),
Set Random Seed( ), //I took away the random seed, so your fits will be different from mine.
Fit(
NTanH( 1 ),
NLinear( 1 ),
NGaussian( 1 ),
NTanH2( 3 ),
NLinear2( 0 ),
NGaussian2( 3 ),
Transform Covariates( 1 ),
Robust Fit( 1 ),
Penalty Method( "Absolute" ),
Number of Tours( 1 ) //I only did one tour just for proof of concept, so you'll want to change this
)
);
NNReport = NN << Report;<BR />//These next lines of code are what pull the actual values from the fit report and saves them to the fit results data table.
Train = NNreport["Training"][Number Col Box( 1 )] << Get;
Valid = NNreport["Validation"][Number Col Box( 1 )] << Get;
dt_fit_results:Name( "R² Training" )[i] = Train[1];
dt_fit_results:Name( "RMSE Training" )[i] = Train[2];
dt_fit_results:Name( "R² Validation" )[i] = Valid[1];
dt_fit_results:Name( "RMSE Validation" )[i] = valid[2];
Close( dt_list[i], no save );
);Buona fortuna!,
DS
Re: automatizzare la rete neuraleCiao DS
Grazie per il tuo contributo.
Ho ancora un piccolo problema con il problema. Ho salvato un migliaio di file pdf dei rapporti NN. Quindi, è diventato un problema poiché ho bisogno di leggere manualmente molti file pdf per ottenere l'R2 di ogni NN.
Voglio eseguire uno script per estrarli automaticamente. Mi potete aiutare?
Cordiali saluti
G.N
Re: automatizzare la rete neuraleCIAO @giaMSU ,
Grazie per aver pubblicato la tabella di dati più piccola che hai e lo script con cui stavi lavorando. L'ho modificato un po' e l'ho fatto funzionare. Prova quanto segue. Non mi ero reso conto che stavi creando sottoinsiemi di tabelle di dati e usando solo quelli per l'adattamento.
Ecco l'output che ho ottenuto dall'esecuzione di una versione modificata del tuo script:

Ecco lo script modificato:
Names Default To Here( 1 );
dt = Data Table( "Subset of 765-450" );
Summarize( locs = BY( dt:ID ) );
For( j = 1, j <= N Items( locs ), j++,
file = dt << Select Where( locs[j] == Char( :ID ) ) << Subset( file, Output Table Name( "Model Subject File" ) )
);
dt_list = {};
one_name = {};
For( m = 1, m <= N Table(), m++,
dt_temp = Data Table( m );
one_name = dt_temp << GetName;
If( Starts With( one_name, "Model" ),
Insert Into( dt_list, one_name )
);
);
For( i = 1, i <= N Items( dt_list ), i++,
NN = Data Table( dt_list[i] ) << Neural(
Y( :Name( "SoilMoisture(kg.m-2) or (mm)" ) ),
X(
:Name( "Tmax(K)" ),
:Name( "Tmin(K)" ),
:Name( "Precip(mm)" ),
:LAI_hv,
:LAI_lv,
:Name( "Winspeed(m/s)" ),
:Name( "Evatransporation(kgm-2s-1)" ),
:LandCover,
:USDASoilClass,
:Forecast_Albedo
),
Informative Missing( 0 ),
Transform Covariates( 1 ),
Validation Method( "KFold", 7 ),
Set Random Seed( 1234 ),
Fit(
NTanH( 1 ),
NLinear( 1 ),
NGaussian( 1 ),
NTanH2( 3 ),
NLinear2( 0 ),
NGaussian2( 3 ),
Transform Covariates( 1 ),
Robust Fit( 1 ),
Penalty Method( "Absolute" ),
Number of Tours( 10 )
)
);
NNReport = NN << Report;
NNReport << Save PDF("E:/Ready_for_ANN/result") // I actually didn't do this part.
);Se disponi di molti ID di posizione diversi, potresti voler salvare ogni risultato con il codice carattere ID univoco per differenziarli. Forse modificare la riga "salva" in qualcosa del tipo:
NNReport << Save PDF("E:/Ready_for_ANN/result_LocID_"|| Char(dt_list[i]:ID[1]));Spero che questo ti aiuti!,
DS
Re: automatizzare la rete neuraleCIAO @giaMSU ,
Mi piace l'idea di automatizzare l'adattamento NN e ho fatto qualcosa di simile per altre piattaforme. Penso che proverò a fare qualcosa di simile per NN per testare vari parametri di adattamento nella piattaforma NN per trovare un adattamento ottimale.
Ho fatto qualcosa di molto simile, ma con una piattaforma di modellazione diversa (foresta casuale e alberi potenziati). Includerò il mio codice di seguito con le descrizioni di ciò che fanno le linee principali.
In generale, tuttavia, non fornisci le nuove informazioni all'NN fit ogni volta che selezioni una nuova posizione. L'adattamento deve effettivamente essere dentro un ciclo FOR. Ho il mio come codice di script all'interno della mia tabella di dati e lo faccio perché ho bisogno di eseguire una tabella di sintonizzazione molto grande per ottenere l'adattamento migliore, e quando lo faccio in questo modo, risparmia molta memoria per il mio computer, oltre a te può fare più di 24k + righe in una tabella di dati in questo modo, lasciandolo funzionare durante la notte.
A proposito, il concetto originale di questo e l'idea del ciclo per l'adattamento mi sono venuti tramite un post di gzmorgan0, ma non ricordo il post originale. Io lo uso per tutto il tempo.
Names Default To Here( 1 );//keeps all variables local<BR />
dt = Data Table( "My data table" ); //this is where you specify your data table with the :Y and :X columns
dt_pars = Data Table( "tuning table" ); //for me, this is my tuning table that has modified tuning parameters. For you, it might be the "Model Subject File" data table.
dt_results = dt_pars << Subset( All rows, Selected columns only( 0 ) ); //this just duplicate the above dt because I want to add columns for recording fit parameters.
<BR />//the below portion creates new columns for recording the fit parameters.<BR />dt_results << New Column("Overall In Bag RMSE");
dt_results << New Column("Overall Out of Bag RMSE");
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
<BR />//The FOR loop here is to actually run the fit with each of the different tuning parameters.
For( i = 1, i <= N Row( dt_pars ), i++,<BR /> //these next few lines pulls the NEW fit parameters to put into the model fit. This would be each new row of data (location) for your case
NumTrees = dt_pars:Number Trees[i];
NumTerms = dt_pars:Number Terms[i];
PortBoot = dt_pars:Portion Bootstrap[i];
MinSplpTr = dt_pars:Minimum Splits per Tree[i];
MaxSplpTr = dt_pars:Maximum Splits per Tree[i];
MinSplSz = dt_pars:Minimum Size Split[i];<BR /><BR /> //this next section is a string that will be evaluated below and represents what you would do via a normal GUI in JMP.
str = Eval Insert(
"report = (dt << Bootstrap Forest( //this is the fit method
Y( :Y_Response ), //whatever your response variable is
X(
:X_1, //these are all your x variables that you put in (which you want to be changing each time)
:X_2,
:X_3,
),
Minimum Size Split( ^MinSplSz^ ), //here is where something is changing and the new values are inserted via the ^ ^ and fed to the fit method. Here is where you'd want to do something similar, but above with the :X's
Validation Portion( 0.2 ), //this too can even be a variable and changed each time.
Set Random Seed( ),
Method( \!"Bootstrap Forest\!" ), //this again defines the method
Minimum Splits per Tree( ^MinSplpTr^ ),
Maximum Splits per Tree( ^MaxSplpTr^ ),
Portion Bootstrap( ^PortBoot^ ),
Number Terms( ^NumTerms^ ),
Number Trees( ^NumTrees^ ),
Early Stopping( 0 ),
Go,
invisible
)) << Report;"
); //this closes the Eval Insert() command<BR />
Eval( Parse( str ) ); //this actually runs the fit for each iteration<BR /><BR /> //The below lines, I pull out the relevant fit statistic I want to evaluate from the report and save it to the data table called dt_results. I can then analyze my multiple thousand data points later and not chew up too much RAM.
Overall=report["Overall Statistics"][Number Col Box( 1 )] << Get;
R2 = report["Overall Statistics"][Number Col Box( 2 )] << Get;
RMSE = report["Overall Statistics"][Number Col Box( 3 )] << Get;
report << Close Window;
dt_results:Name("Overall In Bag RMSE")[i]=Overall[1];
dt_results:Name("Overall Out of Bag RMSE")[i]=Overall[2];
dt_results:Name("R² Training")[i] = R2[1];
dt_results:Name("R² Validation")[i] = R2[2];
dt_results:Name("RMSE Training")[i] = RMSE[1];
dt_results:Name("RMSE Validation")[i] = RMSE[2];
);Immagino che dovresti essere in grado di prendere lo schema dall'alto e modificarlo in base alle esigenze specifiche che hai.
In una nota a margine, non dimenticare di eseguire non solo la convalida dell'adattamento per non overfitting, ma anche di testare la sua capacità predittiva su un set di dati di test completamente inutilizzato che hai separato dai dati di adattamento. Inoltre, se te lo puoi permettere, ti consiglio di aumentare il numero di tour >=25. La piattaforma NN a volte ha bisogno di molti più tentativi, come nel DOE per trovare un adattamento ottimale per un dato set di parametri.
Buona fortuna! Spero di vedere la soluzione finale. Potrei anche provarci.
Grazie per aver aperto questo thread.
DS
Ri: Automatizzare la rete neuraleCIAO @giaMSU ,
Sembra molto fattibile, ma la tua domanda è piuttosto aperta.Quali sono gli ostacoli che vedi per i quali hai bisogno dell'aiuto della comunità?
Inizierei con lo script per la rete neurale e vedrei dove sarà necessario apportare sostituzioni nello script per ciascuna posizione.Definire una funzione o un'espressione che estrae le informazioni specifiche della posizione, esegue l'analisi della rete neurale, salva il report/gli script.Scorri ogni volta le posizioni che eseguono quella funzione/espressione.
Ri: Automatizzare la rete neurale@giaMSU , ciò che intendi fare è possibile.Passo 1. Utilizza la funzione Riepiloga per creare un elenco di ciascuna delle J = 1000+ posizioni.Passo 2. Indicizzare le posizioni J nell'elenco.Passaggio 3. Utilizzare le funzioni Seleziona dove e Sottoinsieme per creare un set di dati per la jesima posizione.Passaggio 4. Esegui il jesimo modello di rete neurale per la jesima posizione.Passaggio 5. Salva il report della piattaforma NN nel formato desiderato. Passaggio 6. Ripeti fino a raggiungere l'ultima posizione.Non ho testato, ma quanto segue dovrebbe funzionare o avvicinarti molto.
//assumes data table is "dt" and location is in a variable called "Location"
Summarize( locs = BY(dt:Location) );
For(
j=1, j<=NItems(locs), j++,
file = dt << Select Where(locs[j] == :Location) << Subset(
file,
Output Table Name("Model Subset File")
);
NN = file << Neural(
Y( :Name( "Y" ) ),
X( :Name( "X1" ), :Name( "X2" ) ),
Validation( :Validation ),
Informative Missing( 0 ),
Set Random Seed( 1121 ),
Fit( NTanH( 3 ) )
);
NNReport = NN << Report;
NNReport << Save PDF("Path")
);Ri: Automatizzare la rete neurale@G_M Mi piace il tuo approccio.
Per @giaMSU , tutto quello che devi fare è eseguire un caso della tua rete neurale e salvare lo script nella finestra dello script (o negli appunti). (Menu in alto con il triangolo rosso, ultima opzione nell'elenco, "Salva script")
Prendi lo script scritto da G_M e sostituisci questa parte:
Neural(
Y( :Name( "Y" ) ),
X( :Name( "X1" ), :Name( "X2" ) ),
Validation( :Validation ),
Informative Missing( 0 ),
Set Random Seed( 1121 ),
Fit( NTanH( 3 ) )
);
con il tuo script neurale e potresti essere a posto, o almeno al 90% del percorso.
Ri: Automatizzare la rete neuraleGrazie per l'aiuto. Ho scritto uno script con un set di dati di 2 posizioni.
Innanzitutto, ho utilizzato lo script neurale salvato da un'esecuzione NN su JMP 14 Pro. Ho utilizzato due livelli nascosti rispettivamente con sei e tre nodi.
Neural(
Y( :Name( "SoilMoisture(kg.m-2) or (mm)" ) ),
X(
:Name( "Tmax(K)" ),
:Name( "Tmin(K)" ),
:Name( "Precip(mm)" ),
:LAI_hv,
:LAI_lv,
:Name( "Winspeed(m/s)" ),
:Name( "Evatransporation(kgm-2s-1)" ),
:LandCover,
:USDASoilClass,
:Forecast_Albedo
),
Informative Missing( 0 ),
Transform Covariates( 1 ),
Validation Method( "KFold", 7 ),
Set Random Seed( 1234 ),
Fit(
NTanH( 1 ),
NLinear( 1 ),
NGaussian( 1 ),
NTanH2( 3 ),
NGaussian2( 3 ),
Transform Covariates( 1 ),
Robust Fit( 1 ),
Penalty Method( "Absolute" ),
Number of Tours( 10 )
)
);
Questa parte funziona bene. Quindi aggiungo il ciclo For come suggerimento G_M.
dt = Open( "E:/Ready_for_ANN/Subset of 765-450.jmp" );
Summarize(locs=BY(dt:ID))
For (
j=1, j<=NItems(locs),j++,
file = dt << Select Where(locs[j])== :ID << Subset(
file,
Output Table Name ("Model Subject File"))
);
NN = file << Neural(
Y( :Name( "SoilMoisture(kg.m-2) or (mm)" ) ),
X(
:Name( "Tmax(K)" ),
:Name( "Tmin(K)" ),
:Name( "Precip(mm)"),
:LAI_hv,
:LAI_lv,
:Name( "Winspeed(m/s)" ),
:Name( "Evatransporation(kgm-2s-1)" ),
:LandCover,
:USDASoilClass,
:Forecast_Albedo
),
Informative Missing( 0 ),
Transform Covariates( 1 ),
Validation Method( "KFold", 7 ),
Set Random Seed( 1234 ),
Fit(
NTanH( 1 ),
NLinear( 1 ),
NGaussian( 1 ),
NTanH2( 3 ),
NLinear2( 0 ),
NGaussian2( 3 ),
Transform Covariates( 1 ),
Robust Fit( 1 ),
Penalty Method( "Absolute" ),
Number of Tours( 10 )
)
);
NNReport = NN << Report;
NNReport << Save PDF("E:/Ready_for_ANN/result")Quindi, non funziona.
Come apprendo dallo script, il ciclo For ha creato un sottoinsieme che include tutti gli ID da j=1 a j++. Quindi questo sottoinsieme verrà utilizzato dallo script neurale. Ma la parte neurale non è inclusa nel Ciclo For. Allora non è quello che voglio fare.
Voglio creare un sottoinsieme di 1 dati sulla posizione ed eseguire il neurale per questo sottoinsieme in ogni passaggio.Per favore correggi se sbaglio.
Ho allegato qui il mio sottoinsieme di dati (02 posizioni).
Per favore aiutami a risolvere il problema.
Grazie in anticipo.
Ri: Automatizzare la rete neuraleCiao G_M,
Ho provato il tuo script. Funziona bene ma non esattamente come vorrei. Sembra che lo script estragga i dati da tutte le posizioni per creare un sottoinsieme e quindi esegua il file neural. L'ho testato con un sottoinsieme di 02 posizioni. Il neurale ha funzionato due volte. Tuttavia, i loro rapporti sono gli stessi. Quindi penso che il For Loop abbia alcuni problemi. Per favore potete aiutarmi ? Ho allegato il mio script e i miei dati in questa discussione nel caso in cui sia necessario utilizzarli.
GrazieRi: Automatizzare la rete neuraleCredo che il problema sia che sia necessario aggiungere la funzione Char attorno a :ID nella funzione Seleziona dove.
Select Where(loc[j] == Char(:ID))
Ri: Automatizzare la rete neuraleLo script funziona bene ora.
C'è un piccolo problema nella sceneggiatura. Poiché il nome del file è "File sottoinsieme modello", lo script sostituisce il file PDF in ogni passaggio. Al termine, nella cartella è presente solo un file. Potresti aiutarmi ad aggiungere l'ID della posizione nel nome del file in modo che lo script possa registrare ogni rapporto con un nome univoco?
Grazie
Ri: Automatizzare la rete neuraleSembra che il rapporto sia ormai finito. Prova a concatenare l'ID al report come nel caso seguente:
Save PDF("C:\test\model_"|| Char(i) ||".pdf");Ri: Automatizzare la rete neuraleCiao G_M
Per aiutarti, ho eseguito quasi mille analisi di reti neurali. Inoltre, ho salvato un migliaio di file PDF dei rapporti NN. Quindi, è diventato un problema poiché dovevo leggere manualmente molti file PDF per ottenere l'R2 di ciascun NN.
Ho provato ad aggiungere Ottieni il test RSquare allo script in modo che possa mostrare i valori R2. Quindi posso salvarli insieme a un file utilizzando
obj << Save (Get Gen RSquare Test)
Lo script è ancora in esecuzione, ma non salva il valore R2 da nessuna parte. Non riesco a vedere il valore.
Potresti per favore aiutarmi con questo problema?
Grazie mille.
GN
Ri: Automatizzare la rete neurale@giaMSU , quindi il modo in cui probabilmente mi avvicinerò sarà accedere al livello del report e ottenere il valore dalla casella di visualizzazione appropriata nella struttura ad albero del livello del report. Una volta acquisita, la statistica R^2_i del report può inserire il valore in un elenco e quindi creare una tabella dati dall'elenco oppure creare una tabella dati e concatenare i valori in un'unica tabella dati. Cerca Mostra struttura ad albero nell'indice degli script.
Ri: Automatizzare la rete neuraleImpara la sceneggiatura.Ri: Automatizzare la rete neuraleCiao @giaMSU ,
Mi piace l'idea di automatizzare l'adattamento NN e ho fatto qualcosa di simile per altre piattaforme. Penso che proverò a fare qualcosa di simile per NN per testare vari parametri di adattamento nella piattaforma NN per trovare un adattamento ottimale.
Ho fatto qualcosa di molto simile, ma con una piattaforma di modellazione diversa (foresta casuale e alberi potenziati). Includerò il mio codice di seguito con le descrizioni di cosa fanno le righe principali.
In generale, tuttavia, non fornisci le nuove informazioni all'adattamento NN ogni volta che selezioni una nuova posizione. L'adattamento in realtà deve essere all'interno di un ciclo FOR. Ho il mio come codice script all'interno della mia tabella dati e lo faccio perché ho bisogno di eseguire una tabella di ottimizzazione molto grande per ottenere la soluzione migliore e, quando lo faccio in questo modo, risparmio molta memoria per il mio computer, oltre a te può eseguire più di 24.000 righe in una tabella di dati in questo modo, lasciandola funzionare durante la notte.
A proposito, il concetto originale di questo e l'idea del ciclo per l'adattamento mi sono venuti tramite un post di gzmorgan0, ma non riesco a ricordare il post originale. Io lo uso per tutto il tempo.
Names Default To Here( 1 );//keeps all variables local<BR />
dt = Data Table( "My data table" ); //this is where you specify your data table with the :Y and :X columns
dt_pars = Data Table( "tuning table" ); //for me, this is my tuning table that has modified tuning parameters. For you, it might be the "Model Subject File" data table.
dt_results = dt_pars << Subset( All rows, Selected columns only( 0 ) ); //this just duplicate the above dt because I want to add columns for recording fit parameters.
<BR />//the below portion creates new columns for recording the fit parameters.<BR />dt_results << New Column("Overall In Bag RMSE");
dt_results << New Column("Overall Out of Bag RMSE");
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
<BR />//The FOR loop here is to actually run the fit with each of the different tuning parameters.
For( i = 1, i <= N Row( dt_pars ), i++,<BR /> //these next few lines pulls the NEW fit parameters to put into the model fit. This would be each new row of data (location) for your case
NumTrees = dt_pars:Number Trees[i];
NumTerms = dt_pars:Number Terms[i];
PortBoot = dt_pars:Portion Bootstrap[i];
MinSplpTr = dt_pars:Minimum Splits per Tree[i];
MaxSplpTr = dt_pars:Maximum Splits per Tree[i];
MinSplSz = dt_pars:Minimum Size Split[i];<BR /><BR /> //this next section is a string that will be evaluated below and represents what you would do via a normal GUI in JMP.
str = Eval Insert(
"report = (dt << Bootstrap Forest( //this is the fit method
Y( :Y_Response ), //whatever your response variable is
X(
:X_1, //these are all your x variables that you put in (which you want to be changing each time)
:X_2,
:X_3,
),
Minimum Size Split( ^MinSplSz^ ), //here is where something is changing and the new values are inserted via the ^ ^ and fed to the fit method. Here is where you'd want to do something similar, but above with the :X's
Validation Portion( 0.2 ), //this too can even be a variable and changed each time.
Set Random Seed( ),
Method( \!"Bootstrap Forest\!" ), //this again defines the method
Minimum Splits per Tree( ^MinSplpTr^ ),
Maximum Splits per Tree( ^MaxSplpTr^ ),
Portion Bootstrap( ^PortBoot^ ),
Number Terms( ^NumTerms^ ),
Number Trees( ^NumTrees^ ),
Early Stopping( 0 ),
Go,
invisible
)) << Report;"
); //this closes the Eval Insert() command<BR />
Eval( Parse( str ) ); //this actually runs the fit for each iteration<BR /><BR /> //The below lines, I pull out the relevant fit statistic I want to evaluate from the report and save it to the data table called dt_results. I can then analyze my multiple thousand data points later and not chew up too much RAM.
Overall=report["Overall Statistics"][Number Col Box( 1 )] << Get;
R2 = report["Overall Statistics"][Number Col Box( 2 )] << Get;
RMSE = report["Overall Statistics"][Number Col Box( 3 )] << Get;
report << Close Window;
dt_results:Name("Overall In Bag RMSE")[i]=Overall[1];
dt_results:Name("Overall Out of Bag RMSE")[i]=Overall[2];
dt_results:Name("R² Training")[i] = R2[1];
dt_results:Name("R² Validation")[i] = R2[2];
dt_results:Name("RMSE Training")[i] = RMSE[1];
dt_results:Name("RMSE Validation")[i] = RMSE[2];
);Immagino che dovresti essere in grado di prendere lo schema dall'alto e modificarlo in base alle esigenze specifiche che hai.
Nota a margine, non dimenticare non solo di eseguire la convalida dell'adattamento per non eseguire un adattamento eccessivo, ma anche di testare la sua capacità predittiva su un set di dati di test completamente inutilizzato che hai separato dai dati di adattamento. Inoltre, se te lo puoi permettere, consiglierei di aumentare il numero di tour >=25. La piattaforma NN a volte necessita di molti più tentativi, come in DOE, per trovare un adattamento ottimale per un dato insieme di parametri.
Buona fortuna! Spero di vedere la soluzione finale. Potrei provarci anch'io.
Grazie per aver iniziato questo thread.
DS