Automatisieren Sie das neuronale NetzwerkHallo zusammen,
Ich arbeite an einem Projekt, bei dem ein neuronales Netzwerkmodell verwendet wird, um die Bodenfeuchtigkeit an verschiedenen Standorten (etwa 1000) vorherzusagen, die durch ihre eindeutigen Koordinaten definiert sind.Die gleiche Struktur für das neuronale Netzwerk in JMP kann auf alle Standorte angewendet werden. Deshalb denke ich darüber nach, die Arbeit zu automatisieren. Dabei kann es sich um ein JMP-Skript handeln, das den Standortkoordinator (X, Y) findet, notwendige Dateneingaben extrahiert und das neuronale Netzwerk betreibt. Am Ende kann das Skript Berichte der Modelle speichern. Haben Sie Hinweise oder Ratschläge, die Sie mir mitteilen können?
Vielen Dank im Voraus.
Jeder Vorschlag oder jede Diskussion ist willkommen.
Betreff: Automatisieren Sie das neuronale NetzwerkHallo @giaMSU ,
Das hört sich sehr machbar an, aber Ihre Frage ist ziemlich offen.Welche Hindernisse sehen Sie, bei denen Sie die Hilfe der Community benötigen?
Ich würde mit dem Skript für das neuronale Netz beginnen und sehen, wo Sie im Skript für jeden Standort Ersetzungen vornehmen müssen.Definieren Sie eine Funktion oder einen Ausdruck, der die ortsspezifischen Informationen extrahiert, die neuronale Netzanalyse durchführt und den Bericht/die Skripte speichert.Durchlaufen Sie jedes Mal die Speicherorte, an denen diese Funktion/dieser Ausdruck ausgeführt wird.
Betreff: Automatisieren Sie das neuronale Netzwerk@giaMSU , was Sie vorhaben, ist möglich.Schritt 1. Verwenden Sie die Funktion „Zusammenfassen“, um eine Liste aller J = 1000+ Standorte zu erstellen.Schritt 2. Indizieren Sie die J-Standorte in der Liste.Schritt 3. Verwenden Sie die Funktionen Select Where und Subset, um einen Datensatz für den j-ten Standort zu erstellen.Schritt 4. Führen Sie das j-te neuronale Netzmodell für den j-ten Standort aus.Schritt 5. Speichern Sie den NN-Plattformbericht im gewünschten Format. Schritt 6. Wiederholen Sie diesen Vorgang, bis Sie den letzten Standort erreicht haben.Ich habe es nicht getestet, aber das Folgende sollte funktionieren oder Ihnen ganz nahe kommen.
//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")
);Betreff: Automatisieren Sie das neuronale Netzwerk@G_M Ich mag deinen Ansatz.
Für @giaMSU , alles, was Sie tun müssen, ist, einen Fall Ihres neuronalen Netzes auszuführen und das Skript im Skriptfenster (oder in der Zwischenablage) zu speichern. (Oberstes rotes Dreiecksmenü, letzte Option in der Liste: „Skript speichern“)
Nehmen Sie das Skript, das G_M geschrieben hat, und ersetzen Sie diesen Teil:
Neural(
Y( :Name( "Y" ) ),
X( :Name( "X1" ), :Name( "X2" ) ),
Validation( :Validation ),
Informative Missing( 0 ),
Set Random Seed( 1121 ),
Fit( NTanH( 3 ) )
);
mit Ihrem neuronalen Skript, und vielleicht sind Sie startklar, oder zumindest zu 90 %.
Betreff: Automatisieren Sie das neuronale NetzwerkIch danke Ihnen für Ihre Hilfe. Ich habe ein Skript mit einem Datensatz mit zwei Standorten geschrieben.
Zuerst habe ich ein neuronales Skript verwendet, das von einem NN-Lauf auf JMP 14 Pro gespeichert wurde. Ich habe zwei versteckte Ebenen mit sechs bzw. drei Knoten verwendet.
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 )
)
);
Dieser Teil funktioniert gut. Dann füge ich eine For-Schleife als G_M-Vorschlag hinzu.
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")Dann funktioniert es nicht.
Wie ich aus dem Skript erfahre, hat die For-Schleife eine Teilmenge erstellt, die alle IDs von j=1 bis j++ enthält. Dann wird diese Teilmenge vom Neural-Skript verwendet. Der neuronale Teil ist jedoch nicht in der For-Schleife enthalten. Dann ist es nicht das, was ich tun möchte.
Ich möchte eine Teilmenge von 1 Standortdaten erstellen und in jedem Schritt die neuronale Funktion für diese Teilmenge ausführen.Bitte korrigieren Sie, wenn ich falsch liege.
Ich habe hier meine Teilmenge der Daten (02 Standorte) angehängt.
Bitte helfen Sie mir, das Problem zu lösen.
Vielen Dank im Voraus.
Betreff: Automatisieren Sie das neuronale NetzwerkHallo G_M,
Ich habe Ihr Skript ausprobiert. Es läuft gut, aber nicht ganz so, wie ich es mir wünsche. Es scheint, als ob das Skript Daten von allen Standorten extrahiert, um eine Teilmenge zu erstellen, und dann die neuronale Funktion ausführt. Ich habe es mit einer Teilmenge von 02 Standorten getestet. Das Neuronal lief zweimal. Ihre Berichte sind jedoch dieselben. Ich denke also, dass die For-Schleife einige Probleme hat. Könnten Sie mir bitte helfen ? Ich habe mein Skript und meine Daten dieser Diskussion beigefügt, falls Sie sie verwenden müssen.
DankeBetreff: Automatisieren Sie das neuronale NetzwerkIch glaube, dass das Problem darin besteht, dass Sie die Char-Funktion um die :ID in der Select Where-Funktion hinzufügen müssen.
Select Where(loc[j] == Char(:ID))
Betreff: Automatisieren Sie das neuronale NetzwerkDas Skript läuft jetzt gut.
Es gibt ein kleines Problem im Skript. Da Sie die Datei „Model Subset File“ genannt haben, ersetzt das Skript die PDF-Datei in jedem Schritt. Wenn es fertig ist, befindet sich nur noch eine Datei im Ordner. Könnten Sie mir helfen, dem Dateinamen eine Standort-ID hinzuzufügen, damit das Skript jeden Bericht mit einem eindeutigen Namen aufzeichnen kann?
Danke
Betreff: Automatisieren Sie das neuronale NetzwerkEs hört sich so an, als ob der Bericht überschrieben wird. Versuchen Sie, die ID wie folgt mit dem Bericht zu verketten:
Save PDF("C:\test\model_"|| Char(i) ||".pdf");Betreff: Automatisieren Sie das neuronale NetzwerkHallo G_M
Als Ihre Hilfe habe ich fast tausend neuronale Netzwerkanalysen durchgeführt. Außerdem habe ich tausend PDF-Dateien der NN-Berichte gespeichert. Dann wurde es zu einem Problem, da ich viele PDF-Dateien manuell lesen musste, um den R2 jedes NN zu erhalten.
Ich habe versucht hinzuzufügen Holen Sie sich den RSquare-Test zum Skript hinzufügen, damit es R2-Werte anzeigen kann. Dann kann ich sie zusammen mit einer Datei mit speichern
obj << Save (Get Gen RSquare Test)
Das Skript läuft noch, speichert den R2-Wert jedoch nirgendwo. Ich kann den Wert nicht erkennen.
Könnten Sie mir bitte bei diesem Problem helfen?
Vielen Dank.
GN
Betreff: Automatisieren Sie das neuronale Netzwerk@giaMSU Daher besteht mein Ansatz wahrscheinlich darin, auf die Berichtsebene zuzugreifen und den Wert aus dem entsprechenden Anzeigefeld in der Baumstruktur der Berichtsebene abzurufen. Nach der Erfassung kann die R^2_i-Statistik aus dem Bericht entweder den Wert in eine Liste einfügen und dann eine Datentabelle aus der Liste erstellen oder eine Datentabelle erstellen und die Werte in einer einzigen Datentabelle verketten. Suchen Sie im Skriptindex nach „Baumstruktur anzeigen“.
Betreff: Automatisieren Sie das neuronale NetzwerkLernen Sie das Skript.Betreff: Automatisieren Sie das neuronale NetzwerkHallo @giaMSU ,
Mir gefällt die Idee, die NN-Anpassung zu automatisieren, und ich habe etwas Ähnliches für andere Plattformen gemacht. Ich denke, ich werde versuchen, etwas Ähnliches für das NN zu tun, um verschiedene Anpassungsparameter in der NN-Plattform zu testen, um eine optimale Anpassung zu finden.
Ich habe etwas sehr Ähnliches gemacht, aber mit einer anderen Modellierungsplattform (zufälliger Wald und verstärkte Bäume). Ich werde unten meinen Code mit Beschreibungen der Funktionsweise der Hauptzeilen einfügen.
Im Allgemeinen geben Sie die neuen Informationen jedoch nicht jedes Mal an die NN-Anpassung weiter, wenn Sie einen neuen Standort auswählen. Die Anpassung muss tatsächlich innerhalb einer FOR-Schleife erfolgen. Ich habe meinen als Skriptcode in meiner Datentabelle und mache das, weil ich eine sehr große Tuning-Tabelle ausführen muss, um die beste Anpassung zu erhalten, und wenn ich es auf diese Weise mache, spart es viel Speicherplatz für meinen Computer und Sie Auf diese Weise können mehr als 24.000 Zeilen in einer Datentabelle verarbeitet und über Nacht ausgeführt werden.
Das ursprüngliche Konzept hierfür und die Idee der Schleife für die Passform habe ich übrigens über einen Beitrag von gzmorgan0 erhalten, aber ich kann mich nicht an den ursprünglichen Beitrag erinnern. Ich benutze es STÄNDIG.
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];
);Ich stelle mir vor, dass Sie in der Lage sein sollten, die Gliederung von oben zu übernehmen und sie an Ihre spezifischen Bedürfnisse anzupassen.
Nebenbei bemerkt: Vergessen Sie nicht, nicht nur eine Anpassungsvalidierung durchzuführen, um sicherzustellen, dass keine Überanpassung vorliegt, sondern auch die Vorhersagefähigkeit an einem völlig unbenutzten Testdatensatz zu testen, den Sie aus den Anpassungsdaten herausgetrennt haben. Wenn Sie es sich leisten können, würde ich außerdem empfehlen, die Anzahl der Touren auf >=25 zu erhöhen. Die NN-Plattform erfordert manchmal viel mehr Versuche, wie zum Beispiel beim DOE, um eine optimale Anpassung für einen bestimmten Satz von Parametern zu finden.
Viel Glück! Ich hoffe, die endgültige Lösung zu sehen. Ich könnte es auch versuchen.
Vielen Dank, dass Sie diesen Thread gestartet haben.
DS