Aufbau mehrerer neuronaler NetzwerkmodelleIch verwende die neuronale Plattform, um Vorhersagen zu treffen, und da ich neu in der neuronalen Vernetzung bin, bin ich mit allen Eingabeparametern nur wenig vertraut: Anzahl der verborgenen Schichten, Anzahl der Knoten/verborgenen Schicht, Boosting-Modelle, Lernrate und Touren. Ich möchte versuchen, RMSE und die Fehlklassifizierungsrate des Validierungsmodells zu minimieren. Ich habe jeden Parameter iterativ einzeln geändert, die Modellleistungsparameter gespeichert und sie in eine neue JMP-Tabelle eingefügt. Dies wird jedoch Tage dauern, da es so viele Kombinationen von Ebenen, Knoten, Touren usw. gibt. usw. Wäre es möglich, ein Skript zu schreiben, in dem JMP Pro beispielsweise 1.000 Modelle erstellt und die Daten in eine Tabelle speichert, sodass ich nicht jeden Modelleingabeparameter manuell ändern muss?
#Versteckte Ebenen: 1 oder 2
#Sigmoidalknoten: 0, 1, 2, 3 oder 4
#Lineare Knoten: 0, 1, 2, 3 oder 4
#Radialknoten: 0, 1, 2, 3 oder 4
#Boosting-Modelle: Keine Ahnung, 1-5 vielleicht?
#Lernrate: 0-0,5 in 0,1-Schritten
#Touren: 1, 5, 10, 20, 100
Das wären also 2 x 5 x 5 x 5 x 5 x 5 x 5=~30.000.
Ich schätze, ich könnte ein paar davon zusammenfassen, sobald ich mit dem Datensatz besser vertraut bin. Natürlich macht es keinen Sinn, viele Knoten und eine große Anzahl an Boosting-Modellen zu haben (und bestimmte andere Kombinationen auch nicht), aber wir sprechen immer noch über potenziell Hunderte von Modellen, die es wert sind, getestet zu werden. Sicherlich könnte diese Art der Modellüberprüfung/-vergleichung per Skript erfolgen, oder?
Prädiktive Modellierung und maschinelles LernenBetreff: Aufbau mehrerer neuronaler Netzwerkmodelle@SDF1 Ich habe Ihre Nachricht gesehen, aber beim Versuch zu antworten wurde eine seltsame Fehlermeldung angezeigt: abm64@miami.edu .
Übrigens, nachdem ich sie wochenlang nicht verwendet habe, funktioniert die letzte Version der GUI jetzt auf meinem 16-Zoll-Macbook Pro ohne diese Boundary-Box-Probleme (wobei sowohl kontinuierliches als auch kategorisches Y mit allen verschiedenen Validierungstypen verwendet werden). Ich kann mich nicht erinnern, irgendetwas auf meinem Computer aktualisiert zu haben, aber hey, ich bin einfach froh, dass es auch auf diesem Computer funktioniert (auf meinem MacBook Air hat es immer funktioniert, es ist in den letzten Zügen!).
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Interessanterweise scheint es, als ob dieses Problem wirklich mit dem MacBook Pro (und vielleicht dem Betriebssystem, auf dem es läuft) zusammenhängt. Möglicherweise liegt es am Betriebssystem oder vielleicht sogar an der Hardware – zum Beispiel unterscheidet sich die Art und Weise, wie JMP die Grafikverarbeitungseinheit auf einem Pro verwendet, von der Verwendung auf einem Air. Überprüfen Sie möglicherweise, ob der Mac die beiden Computer mit derselben GPU ausgestattet hat oder ob möglicherweise ein Hardwareproblem vorliegt. Ich kann mir jedenfalls vorstellen, dass JMP-Entwickler mehr über die Besonderheiten erfahren möchten, mit denen Sie konfrontiert sind, und es wäre hilfreich, sie auf dem Discover Summit darauf aufmerksam zu machen. Zumindest ist es nicht meine Inkompetenz! 
Ich bin froh, dass Sie es immer noch auf Ihrem Air ausführen können. Ich hoffe, dass Ihr Air weiterhin funktioniert, sodass Sie Ihr Video erstellen und für den Summit einreichen können. Teilen Sie mir Ihren Termin für den Vortrag mit, ich würde ihn gerne sehen.
Danke!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleWeißt du, was ich diese Woche gelernt habe? Das ist im wahrsten Sinne des Wortes die meiste Zeit, die ich jemals mit meinem Arbeits-Macbook Pro verbracht habe? Es gibt VIELE kleine, lästige, aber meist triviale Fehler in JMP Pro 16.1, die auf meinem MacBook Air völlig fehlen. Und alles hat mit Ästhetik zu tun. Wissen Sie beispielsweise, wie Sie Skripte auf der linken Seite gruppieren und dann auf den gruppierten Ordner klicken können, um ihn zu erweitern? Das funktioniert nicht. Nun, manchmal funktioniert es. Sie müssen auf den Erweiterungspfeil klicken, dann auf eine andere Stelle auf dem Bildschirm klicken, zurückkehren, erneut klicken und schließlich wird es erweitert. Es gibt andere kleine, seltsame Dinge wie diese, die mir unter demselben Betriebssystem und derselben Version von JMP Pro auf meinem anderen Mac nie aufgefallen sind. Es muss also ein Problem mit der Kommunikation zwischen JMP und diesem bestimmten Computer vorliegen, das sich dann auf Ihr Skript auswirkt denn es scheint etwas mit dem Aussehen zu tun zu haben. Mit anderen Worten, ich glaube nicht, dass es an Ihrer Inkompetenz liegt, haha, und ich gehe davon aus, dass ich die neue GUI weiterhin auf meinem anderen Computer verwenden werde. Tatsächlich durchläuft es 2.000 NN-Modelle, während ich dies auf meinem Arbeitscomputer tippe. Ich muss diese Probleme mit dem MacBook Pro einfach irgendwann herausfinden, da mein MacBook Air dem Verfall preisgegeben ist. Vielleicht fange ich sogar an, all diese kleinen Fehler und Macken zu protokollieren und versuche, beim Discovery Summit mit einigen Entwicklern zu sprechen. Ich frage mich, ob es wirklich MEIN Computer oder ein allgemeines Problem mit dem MacBook Pro ist. Ich möchte nicht auf das neueste Mac OS (Big Sur) upgraden, frage mich aber, ob das tatsächlich die Lösung sein könnte.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Es tut mir leid zu hören, dass der Fehler weiterhin auftritt. Die Datei „GenAT_ver3.0.jsl“, die ich hochgeladen habe, ist die, die ich verwende. Ich habe es auf meinem Arbeits- (JMP 16.0 Pro) und Privat-PC (JMP EA17) ausprobiert und es funktioniert auf beiden. Ich erhalte auf keinem der PCs den Fehler, wenn ich versuche, Ihre Daten anzupassen. Es muss etwas damit zu tun haben, wie das MacBook Pro mit dem Fit-Report-Fenster umgeht. Ich weiß nicht, wie ich das Problem beheben kann, ohne Zugriff auf den jeweiligen Computer zu haben. Ich müsste mir die Baumstruktur des Berichtsfensters ansehen und versuchen herauszufinden, was der Unterschied zwischen einem PC, einem MacBook und einem MacBook Pro ist.
Ich ging zurück und schaute mir Ihre Protokolldatei genauer an und dachte, dass es vielleicht etwas mit dem spezifischen DOE zu tun hat, das Sie generiert haben, aber selbst wenn ich dieses DOE ausführe und darauf basierend eine Optimierungstabelle erstelle, funktioniert es. Zumindest funktioniert es auf den PCs, die ich verwende.
Das ist schade, denn es hört sich so an, als könnten Sie die GUI für Ihren Vortrag möglicherweise nicht vorführen, wenn sie nicht auf dem Macbook Pro läuft. Ich wünschte, ich könnte Ihnen in dieser Angelegenheit weiterhelfen.
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleEine weitere Sache, die vielleicht informativ ist: Selbst wenn ich ein kontinuierliches Y habe, erhalte ich dieselbe Meldung (unabhängig vom Validierungstyp). Seltsam!
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleIch habe es gerade auf dem Macbook Pro versucht und habe den gleichen Outline-Box/Arg 1-Fehler erhalten, aber mir ist etwas aufgefallen: Die Juli-Version hieß „3.0“. Glauben Sie, Sie haben es aktualisiert, dann aber versehentlich die alte Version hochgeladen?
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleEindrucksvoll! Lass es mich tun Probieren Sie es jetzt aus und melden Sie sich zurück. Wie sich herausstellte, kam der JMP-Support zum gleichen Schluss, daher bin ich zuversichtlich, dass es jetzt funktionieren wird.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Vielen Dank für die Dateien. Sie haben mir geholfen herauszufinden, wo die Fehler aufgetreten sind. Das liegt an meiner mittelmäßigen Programmierung und meinem vollständigen Verständnis der Baumstrukturen in JMP (ich habe mir das alles selbst beigebracht). Wie auch immer, das Datum für die neueste Version ist genau richtig. Ich habe die Dinge etwa Anfang Juli aktualisiert, um der Tatsache Rechnung zu tragen, dass die Anpassungsstatistiken ihre Position in der Baumstruktur ändern, je nachdem, um welche Art von Modellierungsdaten es sich bei den Y-Werten handelt, z. B. numerisch , ordinal oder kategorial. Da ich fast 100 % der Zeit mit rein numerischen Antworten arbeite, ist mir dieser Fehler nicht regelmäßig aufgefallen. Um korrekte Informationen zu den Anpassungsstatistiken für andere Modellierungsdatentypen bereitzustellen, musste ich die Zuweisung dieser Variablen ändern. Zum Glück war von JMP-Seite aus alles ziemlich logisch, sodass die Änderungen nicht so schwierig waren.
Im Anhang finden Sie die Version 3.0, die dieses Problem beheben sollte, unabhängig von Ihrem Betriebssystem oder Ihrer JMP-Version. Ich glaube nicht, dass der Support viel helfen kann, da es sich gewissermaßen um einen „Drittanbieter“-Code handelt. Wie auch immer, probieren Sie Version 3.0 bitte aus und lassen Sie mich wissen, wenn das Problem weiterhin besteht.
Danke!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleIch habe JMP Pro 15 ausprobiert und immer noch die gleiche Fehlermeldung erhalten:
erwartetes Zeichen arg 1 beim Zugriff oder bei der Auswertung von „Outline Box“, Outline Box/*###*/(o_box)
Ich verwende GUI-Version 3 ab etwa dem 10. Juli. Das war das Neueste, oder?
Als ich den Debugger ausführte, sagte er mir: „Object Button Box erkennt die gesendete Nachricht nicht; vielleicht meinen Sie eine dieser …“ Dann werden einige Alternativen aufgelistet. Aber die Schaltflächenbox lässt sich gut formen und alle Schaltflächen funktionieren.
Ich würde denken, dass Ihr Baumstrukturargument das Problem sein könnte, aber es ist dasselbe Betriebssystem (Catalina). Ich werde mich an den technischen Support wenden.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleIch hänge das Protokoll und die Tabelle mit der GUI an (das letzte Skript). Ich habe alle Validierungstypen ausprobiert, die für einige der Dinge, die ich vorhersagen möchte (die Y), sinnvoll waren. Normalerweise würde ich einfach alles auf meinem persönlichen MacBook machen (wo alles funktioniert), aber dieser Computer ist noch Wochen davon entfernt, den Staub zu beißen, also hoffe ich, dass ich alles auf diesem neueren, schöneren MacBook Pro zum Laufen bringen kann! In der Zwischenzeit werde ich ein paar Dinge ausprobieren. Es besteht eine geringe Wahrscheinlichkeit, dass ich gerade eine ältere Version der GUI kopiert habe (die noch Fehler aufwies), was eine einfache Lösung wäre, obwohl ich nicht glaube, dass das das Problem ist, da es auf der anderen Seite trotzdem funktioniert hat Computer. Ich bin gespannt, ob Sie etwas Seltsames finden, und danke nochmals, dass Sie sich damit befasst haben.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Ich muss sagen, dass es ein seltsames Verhalten ist, dass es mit einem Air und nicht mit einem Pro funktioniert. Wenn ich mich richtig erinnere, dient dieser o_box-Aufruf dazu, einige der Statistiken der Anpassung zu extrahieren, und er kann sich abhängig von der Art der verwendeten Validierungsmethode ändern: Holdback, ausgeschlossene Zeilen usw. Es hört sich nicht so an, als wäre es eine JMP-Version, da Sie auf beiden Versionen 16.1 ausführen. Verwenden Sie für beide Computer dieselbe Validierungsmethode? Welche Methode(n) verwenden Sie?
Meine einzige Vermutung ist, dass, wenn es von einem Macbook-Modell zum nächsten nicht funktioniert, eine Änderung in der Baumstruktur des Berichts vorliegen muss und der JSL-Code nach einem Wert sucht, der sich an einer bestimmten Stelle befindet, aber er kommt zurück leer oder NAN oder so und es wird der Fehler ausgegeben. Das übersteigt vielleicht ein wenig meine Programmierkenntnisse – es betriebssystemunabhängig zu machen, könnte mir ein Rätsel sein. Ich verwende einen PC, Windows 10. Ich habe keinen Zweifel, dass es bei JMP erfahrenere Programmierer gibt, die herausfinden könnten, wie man dieses Problem umgehen kann, sodass es auf verschiedenen Betriebssystemen usw. ausgeführt werden kann.
Wenn ich den Fehler reproduzieren kann, kann ich ihn relativ einfach beheben, aber ich habe keinen Zugriff auf das Macbook Pro. Können Sie es in der Zwischenzeit auf dem Macbook Pro ausführen und in der Protokolldatei nachsehen, ob dort angegeben wird, bei welcher Codezeile es abstürzt? Dies könnte mir helfen, den Ort des Fehlers einzugrenzen und vielleicht zu sehen, wie ich ihn beheben kann.
Danke!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleG R essen. Vielen Dank. Mir ist etwas Wei aufgefallen 3. heute: Auf meinem 13-Zoll MacBook Air mit Catalina und JMP Pro 16.1 funktioniert alles. Ich bin dann auf mein 16-Zoll-Arbeits-MacBook Pro migriert, auf dem auch Catalina und JMP Pro 16.1 laufen, habe genau dieselbe Datentabelle und Ihre GUI verwendet und beim Zugriff oder bei der Auswertung von „Outline Box“ das seltsame „erwartete Zeichen arg 1“ angezeigt. , Outline Box/*###*/(o_box)" unabhängig davon, was ich eingebe. Glauben Sie, dass es tatsächlich an der Anzeige (dh dem größeren Bildschirm) liegen könnte? Sicher nicht. Es erscheint seltsam, dass ein Skript auf einem Computer ausgeführt wird und auf dem anderen nicht. Irgendwelche Ideen?
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Kein Problem, ich bin froh, dass es helfen konnte. Ja, das Tuning des XGBoost kann etwas aufwändiger sein. Ich habe einen Blog gefunden Hier Das ist sehr nützlich – letzter Blogeintrag auf dieser Seite, aber aus irgendeinem Grund reagiert der Link zum Blogartikel nicht wirklich. Es gibt ein Beispiel dafür, wie es in Python gemacht werden kann, aber in JMP ist es im Wesentlichen dasselbe, sobald Sie den Jargon für die Modellparameter herausgefunden haben. Das habe ich auch gefunden Website und die begleitende Dokumentation SEHR hilfreich beim Nachlesen, was XGBoost macht und welche Parameter es zu einem mehr oder weniger konservativen Modell machen. Eine Sache, die mir daran gefällt, ist, dass es viel stabiler ist als Boosted Tree oder Random Forest. Beide weisen in R^2 ein gewisses stochastisches Verhalten auf, was dazu führt, dass sich die Modelle bei jeder Durchführung der Anpassung leicht unterscheiden, wobei alle Parameter gleich sind. XGBoost bietet Ihnen jedes Mal die gleiche Anpassungsqualität, wenn Sie denselben Parametersatz ausführen.
Bitte erwähnen Sie die NN-GUI gerne in Ihrem Discovery-Vortrag – ich habe vor, virtuell teilzunehmen, und wollte versuchen, zu dem persönlichen Besuch in Cary zu gehen (ich bin nur eine Stunde entfernt), aber ich denke, mit dem Aufgrund der anhaltenden Probleme aufgrund der Pandemie stoppten sie das persönliche Treffen. Ich habe die GUI auf der Add-Ins-Seite gepostet, also schätze ich, dass sie technisch gesehen „veröffentlicht“ und verfügbar ist. Vielen Dank, dass Sie gefragt und darüber nachgedacht haben, es vielleicht sogar vorzuführen. Ich hoffe, dass es reibungslos läuft! Ich bin nicht der beste Programmierer, aber ich kann Dinge zum Laufen bringen. Wenn Sie auf Probleme stoßen, lassen Sie es mich bitte wissen und ich werde versuchen, das Problem so schnell wie möglich zu beheben.
Danke!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleWow! Vielen Dank r die Tabelle und die Erklärung. Ich dachte, da ich endlich mit dem gesamten NN-Jargon vertraut bin, wäre XGBoost ein Kinderspiel, aber es scheint, als müsste ich noch viel lernen (einfach nur, um den Jargon in den Griff zu bekommen)! Es scheint, dass XGBoost im Moment so etwas wie der „Liebling“ der Welt des maschinellen Lernens ist, aber was noch wichtiger ist, dass es tatsächlich besser für die von mir generierten Datentypen geeignet ist, also muss ich mich auf jeden Fall eingehend damit befassen All dies (zum Beispiel, während Ihre GUI im Hintergrund läuft!). Apropos: Würde es Ihnen etwas ausmachen, wenn ich in meinem JMP Discovery-Vortrag (den ich diese Woche aufzeichne) die NN-GUI erwähnen und höchstwahrscheinlich sogar vorführen würde? Ich würde Ihnen auf jeden Fall Anerkennung zollen, aber ich verstehe vollkommen, wenn Sie derjenige sein möchten, der es einem größeren Publikum vorstellt, und Ihnen nicht „den Wind aus den Segeln stehlen“ möchten. Ich würde die neuronale Plattform nur verwenden, da ich bezweifle, dass ich bis Freitag (wenn ich den Vortrag aufzeichne) der Meister von XGBoost sein werde, haha.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Ich habe noch kein Upgrade auf 16.1 durchgeführt, daher ist bei mir nicht derselbe Fehler aufgetreten. Ich werde jedoch die Augen offen halten, falls es passiert, und bei Bedarf ein Update veröffentlichen.
Was XGBoost betrifft, habe ich eine Tuning-Tabelle, um diese zu optimieren. Es ist hier beigefügt. Die XGBoost-Plattform verfügt über viele verschiedene Tuning-Parameter, die geändert werden können. Einige sind einflussreicher als andere. Normalerweise verfolge ich eine schrittweise Optimierung des Modells, da es sich einfach um einen so großen Parameterraum handelt. Ich habe nicht alle möglichen Parameter für die Tuning-Tabelle, sondern nur die einflussreichsten (Sie können jederzeit weitere hinzufügen, indem Sie die Spalten entsprechend benennen). Sie können auf die gesamte Parameterliste der Plattform zugreifen, indem Sie das Untermenü „Erweiterte Optionen“ im XGBoost-Fenster öffnen. Da Sie erwähnt haben, dass Ihr Datensatz stark unausgeglichen ist, sollten Sie sicherstellen, dass der Parameter „scale_pos_weight“ auf 1 gesetzt ist.
Tatsächlich können Sie sogar ein Tuning-Design von der Plattform selbst aus ausführen, wobei das raumfüllende DOE zum Generieren der Tuning-Tabelle verwendet wird. Es ist ziemlich praktisch und flexibel. Ich finde jedoch, dass es aus Gründen der CPU-Auslastung und RAM-Minimierung besser ist, es so auszuführen, wie meine GUI in JMP funktioniert.
Ich habe festgestellt, dass die folgenden Schritte in meinen Situationen für XGBoost sehr gut funktionieren:
1. Korrigieren Sie Lernrate, max_ Depth, min_child_weight, Gamma, Subsample und colsample_bytree, um zunächst die richtige Anzahl von Bäumen zu finden. Diese anderen Parameter werden später angepasst. Ich habe sie zunächst auf ihre Standardwerte gesetzt.
2. Passen Sie max_ Depth und min_child_weight an
3. Gamma anpassen (es ist eine gute Idee, die Anzahl der Bäume neu anzupassen, bevor Sie mit Schritt 4 fortfahren)
4. Optimieren Sie subsample und colsample_bytree
5 Passen Sie Alpha und Lambda an, die Regularisierungsparameter
6. Lernrate optimieren: Reduzieren Sie die Lernrate und erhöhen Sie die Anzahl der Bäume.
Bei jedem Schritt erstelle ich eine Tuning-Tabelle für den Parameter, den ich optimieren möchte, während ich die anderen Parameter auf ihrem Wert für diesen Schritt belasse. Normalerweise spiele ich diese Sequenz zweimal durch. Es ist wichtig, dass Sie beim Ausführen von XGBoost eine Kreuzvalidierung (entweder K-fach oder Validierungsspalte) verwenden. Sie können die Anpassung ohne Kreuzvalidierung durchführen, aber dann riskieren Sie eine Überanpassung der Daten und am Ende kein wirklich gutes Vorhersagemodell.
Hoffe das hilft!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleVergessen Sie Punkt 1. Ich denke, es war etwas Seltsames von meiner Seite oder eine geeignete Schichtung der Proben in Training, Validierung und Test. Grundsätzlich habe ich ein völlig unausgewogenes Design, bei dem eine Gruppe, die ich vorherzusagen versuche, viel häufiger vorkommt, also denke ich, dass dies die Ursache des Problems ist!
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleIch habe nach dem Upgrade auf JMP Po 16.1 wieder damit begonnen, Ihre NN-GUI zu verwenden, und ich habe festgestellt, dass erneut der Fehler „Indexbereich“ angezeigt wird. Sind Sie auf dieses Problem gestoßen?
Haben Sie außerdem ein DOE-Skript für die XGBoost-Tuning-Tabelle? Ich werde diesen Ansatz auch mit Ihrer GUI erkunden! Vielen Dank
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleVielen Dank für alle Infos. Ich hätte tatsächlich versucht, Tonnen von Modellen zu bauen, ohne eine Ahnung zu haben, was ich tat. Vor zwei Jahren habe ich das mit einem anderen Ansatz gemacht und war kurz davor, einen Nature-Artikel zu schreiben, weil ich dachte, ich hätte die Meeresbiologie, wie wir sie kennen, verändert, bis mir klar wurde, dass ich das Modell völlig falsch interpretierte, haha. Zum Glück sind KI- und maschinelle Lernmodelle derzeit in aller Munde, wo ich arbeite. Auch wenn meine Motivation, sie zu verwenden, von den traditionellen Ansätzen getrieben wurde, die NICHT ausreichen (und nicht, dass ich KI machen wollte, weil sie „sexy“ ist) Ich hoffe, dass ich dieses wachsende Interesse an solchen Analysen nutzen kann, um zu versuchen, alle Einzelheiten zu erfahren.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Was das XGBoost-Add-in betrifft, müssen Sie das Add-in separat herunterladen und installieren. Es funktioniert ab JMP Pro 15 und höher. Sie finden das Add-In Hier . Lesen Sie unbedingt die Dokumentation und probieren Sie einige der von Russ im Beitrag erläuterten Testmodellierungen aus, bevor Sie mit der eigenen Modellierung fortfahren. Im Moment ist diese Plattform immer noch eine Plattform, die vom Benutzer einiges mehr Verständnis für die Modifizierung/Manipulation der Hyperparameter der Anpassung erfordert. ich habe das gefunden Blog Dies ist sehr hilfreich, wenn es um die Optimierung der XGBoost-Plattform geht (es müssen VIELE verschiedene Parameter angepasst werden, was den gesamten Bereich ziemlich umständlich macht). Obwohl es für Python-Benutzer geschrieben wurde, funktioniert die gleiche Grundidee gut für die JMP-Plattform. Das Video ist ebenfalls hilfreich, und Sie sollten sich auch darüber informieren, was die einzelnen Parameter im Modell bewirken, welche Arbeitsbereiche sie haben und warum Sie den Standardwert möglicherweise ändern möchten oder nicht Hier . Es ist definitiv keine Plattform, in die man einfach eintauchen kann, ohne ein paar Hintergrund-Hausaufgaben zu machen. Ich habe das auf die harte Tour herausgefunden, als ich mich zuerst damit beschäftigt habe, und mir wurde klar, dass ich nicht wusste, was ich tat. Also habe ich ein paar Hausaufgaben gemacht und es hat sehr geholfen. Jetzt kann ich Modelle ziemlich schnell optimieren, indem ich das Framework aus dem oben aufgeführten Blog verwende.
Viel Glück!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleVielen Dank für die Erklärung und ich bin froh, dass ich gefragt habe, denn meine Annahme war falsch. Es macht jedoch mehr Sinn, dass jeder „Lauf“ ein zufälliges Mischen im Hinblick darauf wäre, welche Proben sich im Trainingsmodell befinden und welche zurückgehalten werden. Wie Sie bereits sagten, ist es bei meinem kleinen, umfangreichen Datensatz sinnvoller, Zeilen manuell auszuschließen oder eine Validierungsspalte zu erstellen. Ich versuche also eigentlich nur sicherzustellen, dass ich alle verschiedenen Optionen „beherrsche“, da ich hoffentlich in der In Zukunft werde ich über einen Datensatz verfügen, in dem Holdback und Kfold eingesetzt werden könnten. Besonders Letzteres finde ich attraktiv/clever.
Ich habe ungefähr 15.000 Modelle mit Ihrer GUI, keine Übertreibung. Jetzt denke ich, dass ich mit dem Vergleich von NN und XGBoost herumspielen werde, einer Technik, von der ich bis zu Ihrer GUI noch nie gehört habe. Ich weiß nicht einmal, ob es in JMP Pro 16 enthalten ist (obwohl es vielleicht irgendwo versteckt ist)!
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Entschuldigung für die späte Antwort, ich war letzte Woche im Urlaub.
Was Ihre Frage zum Holdback-Anteil betrifft, so ist es meines Wissens, dass JMP den Prozentsatz der Zeilen basierend auf Ihrem Holdback-Wert zufällig auswählt. Wenn Sie also 100 Zeilen haben und 0,3 als Holdback-Teil auswählen, wählt JMP jedes Mal, wenn die NN-Plattform ausgeführt wird, einen neuen zufälligen Satz von 30 Zeilen als Validierungsteil aus. Im Hinblick auf die Verwendung der Tuning-Tabelle ruft die Plattform also jede Iteration auf, bei der sie einen neuen Satz von Modellparametern an die NN-Plattform sendet. Wenn Sie die Holdback-Option für die Validierung ausgewählt und eine Zahl zwischen 0 und 1 eingegeben haben, wählt JMP bei jedem neuen Lauf in der Optimierungstabelle einen anderen Satz von Zeilen entsprechend dem Holdback-Teil aus. Wenn Sie jedoch während einer einzelnen NN-Modellanpassung mehrere Touren ausführen, werden bei jeder Tour dieselben Holdback-Zeilen verwendet. Bei jedem Aufruf der NN-Plattform wird eine neue Teilmenge zur Validierung generiert. Das ist zumindest mein Verständnis.
In der oben genannten Situation ist es nicht möglich zu wissen, welche Zeilen zurückgehalten werden (zumindest nicht, wenn mir das bekannt ist). Wenn Sie so etwas tun möchten, würde ich die Option zur Holdback-Validierung ausgeschlossener Zeilen wählen. Anschließend können Sie auswählen, welche Zeilen in Ihrer Datentabelle ausgeschlossen werden sollen und nur diese für die Validierung verwendet werden. Vermutlich könnten Sie der NN-Plattform einen bestimmten Zufallsstartwert, beispielsweise 10191, für jeden Optimierungslauf mit einem Holdback-Anteil zuführen, und sie wird diese Zufallszahl jedes Mal verwenden, um die Teilmenge für die Validierung zu generieren. Da bei jedem Aufruf der NN-Plattform mit demselben Zufallsstartwert begonnen wird, sollte JMP theoretisch bei jedem Optimierungslauf die gleichen Zeilen auswählen. Allerdings wüssten Sie in diesem Fall immer noch nicht, um welche Zeilen es sich handelt. Auch dies ist mein Verständnis davon, wie es funktioniert.
Hoffe das hilft!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleDank Ihrer epischen Benutzeroberfläche habe ich jetzt buchstäblich 10.000 Modelle ausgeführt. Ich hatte eine Frage zum Holdback. Angenommen, meine Tuning-Tabelle hat 100 Zeilen (dh verschiedene Modelle zum Testen). Erhält jede Zeile einen zufälligen Holdback basierend auf dem Prozentsatz oder wird für jedes Modell die gleiche Anzahl an Stichproben zurückgehalten? Ich vermute, es ist Letzteres. Mit anderen Worten: Wenn die Proben A, B, C und D von Modell Nr. 1 zurückgehalten werden, werden dieselben vier Proben von Modell Nr. 2 zurückgehalten. Ich schätze, meine Folgefrage würde trotzdem lauten: Ist es möglich zu WISSEN, welche Proben zurückgehalten werden? Wie wir besprochen haben, ist es in meinem Fall auf jeden Fall sinnvoller, eine geschichtete Validierungsspalte zu haben, da ich sicherstellen kann, dass mindestens eine Stichprobe aus jeder Behandlung als Training, Validierung und Test einbezogen wird, während ein zufälliger 30-Prozent-Rückstand theoretisch möglich wäre Halten Sie NUR Proben aus derSELBEN Behandlung zurück (was die Vorhersage zugunsten dieser Behandlung verzerren würde!).
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Ich freue mich sehr zu hören, dass es bei Ihnen funktioniert, und hoffe, dass die Fehler behoben wurden. Ich wünschte, ich hätte eine bessere Lösung für das Problem mit der obersten Stapeldatentabelle. Ich weiß ehrlich gesagt nicht, wie ich das umgehen soll.
Ich glaube jedenfalls, dass Sie mit der Kfold-Xvalidierung Recht haben. Diese Methode funktioniert normalerweise besser bei hohen Tischen und nicht so gut bei breiten Tischen. Wenn Sie nur sehr wenige Dateneinträge haben, ist die Verwendung einer Validierungsspalte, die auf der Antwort basiert, eine gute Idee. Wenn Sie die GenReg-Plattform nutzen, können Sie auch den Leave-one-out-Ansatz verwenden. Aber normalerweise ist Kfold nicht die beste Lösung, wenn Sie nur wenige Datenpunkte berücksichtigen müssen.
Ich würde auf jeden Fall empfehlen, einen Blick auf XGBoost zu werfen. Sie können das Add-In von der Add-In-Seite auf JMP herunterladen. Es ist ein sehr stabiler und robuster Algorithmus. XGBoost funktioniert wirklich gut mit einer Validierungsspalte.
Sie könnten auch einen Blick auf Support-Vektor-Maschinen werfen, über die JMP Pro verfügt. Es wurde ursprünglich für Klassifizierungsprobleme entwickelt, kann aber auch Regressionsprobleme bewältigen. In jedem Fall ist es immer eine gute Idee, verschiedene Modelle mit einem Hold-Out-Datensatz zu vergleichen, der nicht beim Training oder bei der Validierung des Modells verwendet wurde. Normalerweise erstelle ich mehrere verschiedene Modelle und schaue mir dann an, wie sie mit einem völlig neuen Datensatz verglichen werden, um herauszufinden, welches das Ergebnis am besten vorhersagt.
Froh, dass ich helfen konnte!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleDas ist SO großartig. Ich führe Stapel von 100 Iterationen für jede Validierungsmethode durch und habe noch keinen Fehler festgestellt. Ich habe „ausgeschlossene Zeilen“ noch nicht ausprobiert, bin aber zuversichtlich, dass es funktionieren wird.
kfold bietet mir immer die gleiche, perfekte (überpasste?) Lösung, obwohl ich denke, dass dies ein Beweis für die Größe/das Format meines Datensatzes ist und nicht für irgendeinen Fehler im Skript.
Aus wissenschaftlicher Sicht habe ich einige Nachforschungen angestellt und es scheint, dass meine „kleinen“ Datensätze (Dutzende von Proben und Hunderte von potenziellen Prädiktoren) wahrscheinlich besser für XGBoost geeignet sind oder neuronale Netze möglicherweise übertrieben sind, also werde ich das versuchen Plattform auch. Ich wusste nicht einmal, dass XGBoost in JMP überhaupt unterstützt wird (während ich zufällige Gesamtstrukturen und wahrscheinlich den anderen Ansatz in Ihrer GUI gesehen habe). Mit anderen Worten: Ich freue mich darauf, ALLE Komponenten dieses hervorragenden Recherchetools zu nutzen! Vielen Dank für Ihre Hilfe (nochmals) und ich werde Sie informieren, wenn mir weitere Fehler auffallen.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Also fand ich heraus, was das Problem in meiner Codierung war. Es war kein Problem von einer JMP-Version zur anderen, es hat damit zu tun, wie viele Ebenen es für eine nominale oder ordinale Antwort gibt. Dadurch ändert sich die Position des Spaltennummernfelds im Berichtsfenster. Ich musste den Code anpassen, um zu berücksichtigen, dass die Statistiken für die Anpassung ihre Position im Bericht ändern, wenn von einer Antwort mit 2 oder 3, 4 oder 6 Ebenen ausgegangen wird. Das Schöne daran ist, dass die Änderungen in einem festen Umfang vorgenommen werden, abhängig davon, wie viele Ebenen es gibt, sodass ich den Code relativ einfach korrigieren konnte. Es hat allerdings eine Weile gedauert, bis ich diesen Fehler herausgefunden habe, weil ich die PowderMetallurgy-Datei aus den Beispieldaten verwendet hatte, aber es sind nur zwei Ebenen, nicht vier wie bei Ihnen.
Im Anhang finden Sie die aktualisierte Version, die allgemeiner auf verschiedene Ebenen der Antwortvariablen ausgerichtet ist. Der Code sollte bereits für Validierungsspalten mit zwei oder drei Ebenen sowie für nominale, ordinale und kontinuierliche Antworten funktionieren.
Ich habe alle passenden Plattformen getestet: NN, BT, Bootstrap Forest und XGBoost mit Ihrem Datensatz und es funktioniert bei allen Datentypen und den verschiedenen Validierungsoptionen einwandfrei. Bitte beachten Sie, dass JMP derzeit mithilfe der Boosted-Tree-Plattform nur eine zweistufige Antwort (nominal oder ordinal) anpassen kann. Die anderen Plattformen können mehr Level bewältigen.
Ich bin mir ziemlich sicher, dass es jetzt wie vorgesehen funktioniert (außer dass standardmäßig die zuletzt geöffnete Datentabelle verwendet wird – ich weiß nicht, wie ich das umgehen kann). Sollten Sie jedoch einen Fehler darin finden, lassen Sie es mich bitte wissen.
Danke und viel Glück!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Ich habe das gleiche Problem mit meinen Datentabellen. Ich denke, Sie haben Recht. Wenn Sie es nicht direkt aus der Datentabelle ausführen, aus der Sie modellieren, wird standardmäßig die zuletzt geöffnete Datentabelle in Ihrem JMP-Startfenster verwendet. Ich weiß nicht, wie ich das umgehen soll.
Hmm, der Code sollte mit einer Validierungsspalte funktionieren, die nur Training und Validierung oder alle drei umfasst. Ich habe es geschrieben, um die Anzahl der Ebenen in der Validierungsspalte zu überprüfen und entsprechend anzupassen, d. h. um die entsprechenden Anpassungsstatistiken aufzuzeichnen, unabhängig davon, ob es zwei oder drei Ebenen gibt. Ich werde das morgen noch einmal überprüfen. Ich denke, dass der Indexbereichsfehler wahrscheinlich auf die Änderungen zwischen 15 und 16 zurückzuführen ist. Als 16 herauskam, habe ich den Code nicht noch einmal überprüft, um sicherzustellen, dass er funktionierte, sondern ich habe ihn in 15 mehreren Tests unterzogen und alles hat funktioniert. Nichtsdestotrotz werde ich das beheben und die Dinge korrigieren lassen, damit es wie erwartet funktioniert. Ich werde nur bis Freitagmorgen keine Zeit haben, damit anzufangen.
Nochmals vielen Dank, dass Sie mir beim Debuggen des Codes geholfen haben, und entschuldigen Sie die Unannehmlichkeiten. Ich melde mich bei Ihnen, wenn ich es auf alle Datentypen und Codetypen überprüft habe, wie ich es bei der Übermittlung als JMP-Add-In getan habe.
Danke!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleEINDRUCKSVOLL! Jetzt kochen wir mit Feuer. Das Einzige, was ich jetzt sehe, ist, dass es manchmal zu Verwechslungen kommt, auch wenn die GUI Sie auffordert, ihr mitzuteilen, welche Datentabelle und welche Tuning-Tabelle ist. Ich denke, standardmäßig wird der Tisch verwendet, der näher an der „Oberseite des Stapels“ liegt (ich habe normalerweise 10 bis 20 Tische offen, sonst wäre das wahrscheinlich kein Problem).
Wäre es möglich, eine einfache „Regel“ hinzuzufügen, die besagt: „Wenn die Validierungsspalte nur Trainings- und Validierungsbegriffe enthält, berechnen Sie die Testdaten nicht“ oder etwas in diese Richtung? Ich denke, die Alternative besteht darin, den Code manuell durchzugehen und das „//“ vor alle „Test“-Optionen zu setzen. Ich frage, weil ich manchmal NUR Training und Validierung anstelle von Training/Validierung/Test verwende (da meine Stichprobengrößen klein sind). Wenn Sie jetzt eine Validierungsspalte mit NUR Trainings- und Validierungsbegriffen eingeben, erhalten Sie den Fehler „Indexbereich“, und ich denke, das liegt daran, dass nach „Test“-Daten gesucht wird, die nicht vorhanden sind!
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Nochmals vielen Dank, dass Sie das verstanden und mich informiert haben – meine Modelle neigen dazu, numerische Antworten zu haben, sodass ich normalerweise keine Dinge für nominale Datentypen bearbeiten muss.
Wie auch immer, ich glaube, dass es zwischen JMP 15 und 16 eine Änderung gegeben haben könnte, die zu unterschiedlichen Zahlenspaltenfeldern in den Berichtsfenstern geführt hat, weil ich alle gleichen Werte von dem, was sie waren, auf das ändern musste, was sie jetzt sind, und das hat vorher funktioniert JMP 15, ich erinnere mich, es ausprobiert zu haben. Ich habe es noch einmal überprüft und diese aktualisierte Version läuft korrekt mit den verschiedenen Validierungsmethoden für NN: Holdback für ausgeschlossene Zeilen, Holdback, Kfold und Validierungsspalte. Bitte entschuldigen Sie noch einmal die Unannehmlichkeiten. Ich freue mich, dass Sie es testen und mir die Fehler mitteilen können, damit es besser wird und anderen helfen kann. Bitte lassen Sie mich wissen, wenn Sie noch etwas finden!
Danke!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleVielen Dank, dass Sie sich das angeschaut haben, und es funktioniert jetzt mit einer Validierungsspalte, aber ich erhalte den gleichen Fehlercode, wenn ich Holdback oder Kfold verwende. Ich frage mich, ob das daran liegt, dass diese Methoden die Daten nicht unbedingt dahingehend schichten, wo jeder Bin, den ich vorhersagen möchte, dargestellt ist? Ich werde es mit einem größeren Datensatz versuchen und sehen, ob ich den gleichen Fehler „Indexbereich“ erhalte.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Es tut mir leid, dass es etwas gedauert hat, bis wir uns bei Ihnen gemeldet haben. Ich konnte den Fehler, den Sie erhalten haben, reproduzieren und habe herausgefunden, wo der Fehler in meinem Code war. Die Zeilen 348 und 349 hatten die falschen Werte für die Variablen ncol_box_v und ncol_box test. Sie sollten 10 bzw. 19 sein. Ich habe das korrigiert und den NN mit der Validierungsspalte erneut ausgeführt, und es funktioniert wie es sollte. Ich füge den korrigierten Code bei. Entschuldigen Sie die Unannehmlichkeiten. Vielen Dank, dass Sie das erkannt haben. Wenn Sie weitere Fehler finden, lassen Sie es mich bitte wissen.
Hoffe das hilft!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleWow, diese GUI hat wirklich ein Upgrade bekommen! Das Einzige ist, dass ich jetzt die Fehlermeldung bekomme: „
Tiefgestellter Bereich beim Zugriff oder bei der Auswertung von 'V_stats[ /*###*/5]' , V_stats[/*###*/5" unabhängig vom Validierungstyp, den ich verwende. Ich frage mich, ob es daran liegt, dass ich eine so kleine Stichprobengröße habe, weil ich versuche, Trainings-, Validierungs- und Teststichproben für jede der vier Gruppen (als Y-Gruppen) zu erstellen.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Nein, ich vermute, das liegt daran, dass Sie eine Validierungsspalte für die Auswahl des Optionsfelds ausgewählt haben (im Vergleich zu Holdback oder Holdback ausgeschlossen usw.), aber vergessen haben, die Validierung in die Liste der Spalten aufzunehmen, als Sie die Spalten in die ausgewählten Spalten umwandelten Rollen. Das ist meine Vermutung, aber wenn nicht, benötige ich möglicherweise eine Schritt-für-Schritt-Beschreibung von Ihnen.
Ich habe den Code auch etwas aktualisiert, um einige andere Fehler zu korrigieren. Mein Code enthält das Fortschrittsfenster, was Sie meiner Meinung nach nicht wollten, aber ich hänge trotzdem die neue GenAt.jsl-Datei an, damit Sie den Quellcode haben. Ich verwende es ständig zur Unterstützung meiner Modellierung – NN, Boosted Tree, Random Forest und XGBoost. Mir gefällt es, aber es erfordert ein gewisses Wissen/Verständnis darüber, was Sie aus Modellierungsperspektive tun und was die verschiedenen Plattformen Ihnen ermöglichen.
Ich weiß nicht, ob das so ist Verknüpfung wird funktionieren, aber ich habe versucht, eine Beschreibung zu schreiben, wie man es für das Add-Ins-Repository verwendet. Ich weiß, dass ich über mein SAS-Konto auf diesen Link zugreifen kann, bin mir aber nicht sicher, ob andere das können. Es ist jedoch noch nicht im Repository veröffentlicht.
Hoffe das hilft!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo!
Ich bin nach einer sechsmonatigen Pause wieder bei dieser NN-Arbeit und habe festgestellt, dass ich beim Versuch, Ihre NN-GUI auszuführen, eine neue Fehlermeldung erhalte: „Sende erwartet skriptfähiges Objekt beim Zugriff auf die Auswertung von ‚Liste‘, {/ *###*/"Validierung"})." Glauben Sie, dass dies an einer Änderung zwischen JMP 15 und 16 liegen könnte (d. h. bestimmte JMP 15-Skripte müssen für JMP 16 geändert werden)?
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleDas ist großartig! Lass es mich wissen, wenn du es postest. Ich werde es auf jeden Fall ausprobieren, vor allem, da ich mich noch in einem frühen Stadium der Berechnung dieses Datensatzes befinde (obwohl NN der klare Gewinner gegenüber allen anderen Modelltypen war, die ich auf JMP Pro 16 getestet habe). Ich sehe den Wert darin, nicht DIREKT zu NN zu gehen, aus den von Ihnen genannten Gründen UND weil es für die Reduzierung der Antwortvariablen nicht gut ist. In meinem Fall müsste ich dieselbe Suite von 30–40 Proteinen in jeder Probe wiederholt messen (ohne fehlende Daten, wie Sie betont haben), was die Kosten im Vergleich zu einem traditionelleren Biomarker-Kandidatenansatz (mit einem einzigen) in die Höhe treibt oder nur ein paar Prädiktoren). Daher erstelle ich grundsätzlich einfache, abgespeckte Modelle mit nur wenigen Biomarkern (normalerweise unter Verwendung von Gen-reg) und vergleiche sie mit dem optimierten NN-Modell aus Ihrem Skript. In DIESEM Fall ist NN überlegen, aber das heißt nicht, dass es IMMER aus jedem zukünftigen Datensatz stammen wird, den ich sammeln werde! Ich freue mich darauf, die GUI, Fehler und alles auszuprobieren.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Ich stimme definitiv mit Ihnen überein, dass es keine allzu komplexen Modelle gibt. Das ist unbedingt ein Problem, das vermieden werden sollte.
Meiner Meinung nach unterscheidet sich die NN-Modellierung nicht allzu sehr von anderen Plattformen. Jeder hat seine Vor- und Nachteile. Beispielsweise sind NNs nicht so gut im Umgang mit fehlenden Daten, sie sind rechnerisch nicht sehr skalierbar und bekanntermaßen schwer zu interpretieren. Für Menschen, die solche Modelle zum Aufbau von Theorien verwenden, ist diese Interpretation wichtig. NNs können auch nicht alle Arten von Datensätzen oder irrelevanten Eingaben verarbeiten. Allerdings fließen in das Modell keine Annahmen ein und es weist tendenziell eine hohe Vorhersagefähigkeit auf.
Da jedoch jede Modellierungsmethode unterschiedliche Vor- und Nachteile mit sich bringt, neige ich dazu, plattformübergreifend zu modellieren und dann die besten Modelle jeder Plattform anhand eines neuen Datensatzes miteinander zu vergleichen, um herauszufinden, welche die besten Ergebnisse bei der Vorhersage erzielen Erstellen Sie einen neuen Datensatz und verwenden Sie diesen.
Abgesehen davon habe ich gerade Version 1.0 einer GUI-Schnittstelle fertiggestellt, die über einen JMP-Menü-Hotbutton ausgeführt werden kann (nicht nur aus der Datentabelle). Sie füttern es mit Ihrer Datentabelle und Ihrer Tuning-Tabelle, und je nachdem, welche der vier Methoden Sie wählen (NN, Boosted Tree, Bootstrap Forest, XGBoost), führt es die Anzahl der Anpassungen aus, die Sie ihm basierend auf der Tuning-Tabelle senden. Es funktioniert über die verschiedenen Datentypen für die Y-Eingabe und über verschiedene Validierungsspaltentypen hinweg, sogar über mehrere Validierungsspalten für die XGBoost-Plattform. Es ist keineswegs fehlerfrei, aber ich bin ziemlich aufgeregt, dass ich es innerhalb einer Woche nach der Veröffentlichung der ersten GUI für die NN-Plattform zum Laufen gebracht habe. Es erfordert, dass der Benutzer weiß, welche Optimierungstabelle er für jede Plattform verwenden soll, und über andere plattformspezifische Anforderungen verfügt – zum Beispiel muss er wissen, dass die Boosted-Tree-Plattform in JMP nicht mit mehr als zweistufigen nominalen/ordinalen Daten funktioniert ( (zumindest mit JMP 15) oder dass die XGBoost-Plattform mehrere Validierungsspalten verwenden kann, jede jedoch nur zweistufig sein darf.
Es hat Spaß gemacht, an diesem Projekt zu arbeiten und wird mir bei zukünftigen Bemühungen helfen. Danke!
Viel Glück,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleIch denke, ein Teil davon hängt möglicherweise damit zusammen, dass Sie bei vielen Modellierungstypen NICHT immer komplexere Modelle erstellen möchten: wenn ein einfaches Modell gut zu Ihren Daten passt und die Validierungs- oder Test-RSME-Werte gut passen niedrig, dann hör einfach dort auf. Für NN ist das Hinzufügen von Ebenen, Knoten, Boosts, Touren usw. jedoch nicht unbedingt eine SCHLECHTE Sache, da sie zwar komplexer, aber auch flexibler sind. Daher kann ich einigermaßen verstehen, warum diese GUI für ALLE Modellierungsplattformen dazu führen kann, dass diejenigen, die mit der Modellierung nicht vertraut sind, ihre Daten im Wesentlichen erschöpfend und zu ihrem Nachteil durchsuchen. Nach meinem begrenzten Verständnis von NN gilt jedoch: Wenn ein Modell unter den Standardbedingungen von TanH=3 einen respektablen Validierungs-RSME hat, hat ein anderes Modell 3 TanH-, 3 lineare und 3 Gaußsche Knoten über zwei verborgene Schichten hinweg, weist aber dennoch einen ähnlichen RSME auf. Sie würden das letztgenannte Modell nicht automatisch ablehnen, weil es komplexer, aber im Hinblick auf RSME gleichermaßen angemessen ist, da es möglicherweise flexibler für zukünftige Testdatensätze ist. Daher könnte es durchaus sein, dass die meisten Menschen gut daran tun würden, potenziell Hunderte bis Tausende von NN-Modellen zu bauen. Es ist jedoch durchaus möglich, dass ich falsch liege und NN sich nicht von anderen Modellierungstypen unterscheidet, bei denen unter ansonsten gleichen Bedingungen einfach besser ist. Ich frage mich nur, warum es nicht mehr Leute gibt, die versuchen, NN-Eingabeparameter zu optimieren: Ist das aus Unwissenheit oder aus Angst vor Data Mining?!
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Vielen Dank für Ihr Feedback und Ihre netten Worte. Ja, ich hatte auch das Problem, dass die falsche Datentabelle aufgerufen wurde, wenn sie nicht „oben“ war. Ich bin mir nicht sicher, warum es das überhaupt tut. Es ist auch etwas seltsam, wie es darauf reagiert, wenn ich bestimmte Dinge im neuen Fenster aufrufe, um sie später an den Anpassungsteil weiterzugeben. Die Schaltfläche „Abbrechen“ funktioniert nicht so, wie ich es beabsichtigt habe, und die Schaltfläche „Hilfe“ führt im Moment nirgendwo hin, aber es ist ein Anfang! Ich denke, dass ein Scripting-Experte diese Fehler leicht beheben und dafür sorgen könnte, dass es wie vorgesehen funktioniert. Wenn ich die Dinge so eingerichtet habe, dass es auf mehr Plattformen läuft und diese Fehler nicht auftreten, könnte ich es vielleicht auf der Add-In-Seite posten. Es wäre mir eine Ehre, es in JMP zu integrieren.
Es hilft mir bei meiner Arbeit, da es den Prozess der Optimierung meiner Modelle noch automatisierter und einfacher macht. Ich wollte schon immer etwas für die NN-Plattform machen, habe es aber bis zu Ihrem Beitrag aufgeschoben, und jetzt, wo ich die GUI erstellt habe, möchte ich sie erweitern, um sie funktionsübergreifender zu machen. Die Möglichkeit, eine große Anzahl von Modellen zu optimieren und sich nur auf die Statistiken zu konzentrieren, trägt wirklich dazu bei, den Hyperparameterraum einzugrenzen, sodass es einfacher ist, Modelle auf verschiedenen Plattformen zu vergleichen und herauszufinden, welches Modell am besten neue Daten vorhersagen kann. Anschließend können Sie zurückgehen und die optimalen Einstellungen in der Standardplattform ausführen und das umfassende grafische Feedback erhalten, das JMP zur Visualisierung des Modells und aller anderen Dinge bereitstellt.
Viel Glück!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleWow! Das ist wirklich großartig. Der einzige kleine Fehler besteht darin, dass, wenn sich das Skriptfenster direkt über der „Tuning“-Tabelle befindet, die Tuning-Tabelle im Modellfenster anstelle der Datentabelle „aufgerufen“ wird. Solange die Datentabelle und das Skript im Vordergrund Ihres Bildschirms angezeigt werden, werden die Modellbegriffe korrekt geladen. Tatsächlich habe ich in nur wenigen Minuten 100 Modelle ausgeführt. Ich frage mich, ob Sie dies in das „Add-In“-Depot (den tatsächlichen Namen vergessen) auf der JMP-Website stellen können, damit es größere Aufmerksamkeit erhält. Ich bin mir sicher, dass dies VIELEN Menschen helfen würde (wenn nicht sofort, dann in Zukunft, da immer mehr Menschen den Nutzen von NN beim Modellbau erkennen). Verdammt, es sollte wahrscheinlich in irgendeiner Form in JMP Pro 17 Einzug halten (für 16 könnte es zu spät sein). Vielen Dank für all Ihre Hilfe und ich hoffe, dass dies auch Ihrer eigenen Forschung hilft.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Ich hoffe, dass das JMP und/oder das Zurücksetzen des Computers geholfen hat. Wenn nicht, bin ich auch zurückgegangen und habe eine GUI für die NN-Modellierung erstellt – ich habe vor, sie zu erweitern, damit sie auf verschiedenen Plattformen funktioniert. Es funktioniert nicht perfekt und ich bekomme manchmal seltsame Fehler (ein erfahrener Scripter kann es wahrscheinlich innerhalb von Sekunden debuggen). Das Schöne daran ist jedoch, dass es mit jeder Art von Eingabedatenspalte funktioniert – ordinal, nominal und kontinuierlich – und mit den akzeptablen Validierungsmethoden für NN – ausgeschlossene Zeilen, Holdback, Kfold und Validierungsspalte. Es funktioniert sowohl mit Validierungsspalten, die Testdaten enthalten, als auch mit solchen, in denen dies nicht der Fall ist. Es ist das Skript namens NN GUI in Ihrer Datentabelle (im Anhang).
Für Interessierte: Ich habe mir einen Blog von JMP-Mitarbeitern zunutze gemacht .@juliagong (im Ruhestand) Hier und eine Support-Mitteilung von .@Wendy_Murphrey Hier . Ich habe vor, eine GUI zu erstellen, die dies für die anderen Plattformen automatisieren kann, die ich ebenfalls aus Datentabellen heraus automatisiert habe: Boosted Tree, Bootstrap Forest und XGBoost. Ich habe vor, es in der Community zu veröffentlichen, aber es könnte einige Zeit dauern – insbesondere, um sicherzustellen, dass es vollständig debuggt ist.
Die einzige Änderung vom folgenden Code zur GUI in der Datentabelle besteht darin, dt = Data Table ("...") in dt = Current Data Table() zu ändern.
Ich hoffe, dass dies dazu beiträgt, Ihre Arbeit voranzubringen. Für mich ist das der Fall, da ich dies verbessern kann, um auch meine Modellierungsbemühungen zu erleichtern!
Viel Glück,
DS
NN-GUI-Code:
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>Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHmmm, ich habe Ihre neue Tabelle heruntergeladen und erhalte jetzt jedes Mal die Fehlermeldung „Umrissrahmen“. Ich werde einen JMP-Neustart und dann einen Computer-Neustart versuchen. Es kommt mir seltsam vor, dass es bei Ihnen funktionieren würde, bei mir jedoch nicht!
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Ich veröffentliche dies noch einmal, da es so aussieht, als ob mein ursprünglicher Beitrag, den ich zu bearbeiten versuchte, irgendwie verloren gegangen ist. Vielen Dank für die Weitergabe der Datentabelle. Sie hat geholfen, die Probleme zu beheben.
Wie auch immer, ich habe einige Änderungen vorgenommen, also ein paar Dinge, die es zu beachten gilt:
- Ich habe es so gestaltet, dass ein einzelner Code auf den Modellierungstypen Ordinal, Nominal und Kontinuierlich ausgeführt werden kann. Zwei verschiedene Versionen werden nicht mehr benötigt.
- Sie müssen die Variable y_resp, die die Y-Antwortspalte darstellt, bearbeiten, indem Sie den Spaltennamen in Anführungszeichen eingeben (siehe Zeile 8). Sie müssen es im Aufruf innerhalb von Neural() nicht mehr bearbeiten. Sie müssen jedoch weiterhin die Liste der X()s bearbeiten.
- Anschließend testet der Code den Modellierungstyp der y_resp-Spalte, legt einige Variablen fest und generiert die entsprechenden Spalten in der Ausgabedatentabelle.
- Die Ausgabedatentabelle erhält nun je nach Validierungstyp und Hostdatentabelle einen Namen. Auf diese Weise können Sie alle Validierungstypen ausführen und dann vergleichen, ohne dass seltsame Namensprobleme von JMP auftreten.
- Ich habe jedes der verschiedenen Validierungsskripts, die Sie in Ihrer Datentabelle haben, bearbeitet und sie können problemlos in neue Datentabellen kopiert/eingefügt werden. Ich habe dies an Ihrem vorherigen Tisch getestet, den Sie gesendet haben, und es hat einwandfrei funktioniert.
- Ich habe den Fehler behoben, den mein Code bei jeder Ausführung in die Protokolldatei schrieb, und musste eine Klammer an eine neue Position verschieben.
- Ich habe herausgefunden, dass der Grund dafür, dass Ihr Holdback und mein K-Fold nicht richtig funktionierten, darin liegt, dass Sie bei diesem Typ „Validation()“ in „Validation Method()“ ändern müssen. Ich habe das für Ihre verschiedenen Methoden getan und die Skripte sind behoben.
Es verbessert sich Stück für Stück, also ist das schön. Ich würde es wirklich vorziehen, den Antwortspaltentyp und die Validierungsmethode testen zu lassen, bevor die zusätzlichen Spalten generiert werden, aber ich bin mir noch nicht sicher, wie ich das machen soll. Vielleicht bearbeite ich das für den nächsten Rollout!
Unten finden Sie das Codebeispiel für die Kfold-Validierung. Ich habe auch Ihre neue Datentabelle mit den darin gespeicherten korrigierten Skripten angehängt.
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];
);
);
Lassen Sie mich wissen, wenn Sie weitere Probleme finden, und ich werde versuchen, sie zu beheben.
Hoffe das hilft!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Vielen Dank für die Weitergabe der Datentabelle. Ich konnte einiges finden.
- Ich habe herausgefunden, wo der Fehler lag, dass ständig in das Protokollfenster geschrieben wurde, und den Fehler behoben. Es ist im str-Aufruf. Musste eine Klammer an eine andere Stelle verschieben.
- Ich habe herausgefunden, dass Sie beim K-Fold oder Holdback die Validation() in Validation Method() ändern müssen. Dann funktioniert es und proportioniert die Daten entsprechend.
- Ich habe neu codiert, wie der Modellierungstyp der Spalte getestet wird, und einige damit verbundene Änderungen vorgenommen.
- Ich habe es auch geschrieben, damit derselbe Code für Nominal, Ordinal und Kontinuierlich verwendet werden kann. Dies kann einfach durch Ändern der Variablen y_resp – dem Namen der Y-Antwortspalte – erfolgen. Den Rest erledigt es automatisch.
- Außerdem habe ich der Ergebnisdatentabelle einen Titel hinzugefügt, der sich mit der „Host“-Datentabelle und dem Validierungstyp ändert, sodass Sie alle drei Methoden ausführen können und es zu keinen Namensstörungen durch JMP kommt.
- Die drei NN-Anpassungsskripte in Ihrer Datentabelle können jetzt problemlos von einer Datentabelle in die nächste kopiert und eingefügt werden. Ich habe es mit der ersten von Ihnen gesendeten Datentabelle getestet und es hat einwandfrei funktioniert.
Es wird jetzt etwas automatisierter und etwas verbessert. Ich würde es vorziehen, die Validierungsmethode überprüfen zu lassen und dann die zusätzlichen Spalten zu generieren und entsprechende Werte zuzuweisen. Vielleicht beim nächsten Rollout!
So sieht der Code im Allgemeinen aus. Beachten Sie, dass ich die Temperaturspalte getestet habe, um nach kontinuierlichen Modellierungstypen zu suchen.
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];
);
);Lassen Sie mich wissen, wenn es weitere Probleme gibt.
Danke!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleEs ist komisch. Wenn ich das Skript einfach weiter ausführe, wird es irgendwann funktionieren!
Eine weitere seltsame Sache: Ganz gleich, wie ich den Holdback-Prozentsatz ändere, erhalte ich immer 11 Training vs. 9 Validierung (~55/45 %). Ist es beispielsweise nicht möglich, 70/30 % zu erreichen? Ich habe das starke Gefühl, dass das daran liegt, dass ich den Befehl einfach falsch eingegeben habe, und nicht, dass es unmöglich ist!
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Der Umrissrahmenfehler ist wahrscheinlich darauf zurückzuführen, dass versucht wird, die Statistikwerte aus dem NN-Fenster abzurufen. Können Sie mir die neue Datentabelle und den Code mitteilen? Ich kann das Problem beheben und prüfen, ob ich es einfacher machen kann, es von einer Datentabelle in eine andere zu portieren.
Ich denke, es hängt möglicherweise damit zusammen, wie ich den Teil eingerichtet habe, um den Datenspaltentyp zu überprüfen und der Variablen ncol_box einen anderen Wert zuzuweisen. Wenn es sich um einen nominalen Wert handelt, unterscheidet er sich von einem ordinalen oder sogar numerischen Wert.
Wenn Sie die Datentabelle und den Code teilen können, mit denen dieser Fehler auftritt, kann ich ihn sicher beheben. Wenn Sie möchten, können Sie die Datentabelle anonymisieren: Tabellen > Anonymisieren.
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleOkay, großartig. Dies beantwortet einige zusätzliche Fragen, die ich hatte. Jetzt habe ich nur noch Probleme: Wenn ich das Skript kopiere, einfüge und in einer neuen Datentabelle ausführe, erhalte ich einen Gliederungsrahmenfehler, auf den Sie in den Skriptkommentaren hinweisen. „Erwartetes Zeichen arg 1 beim Zugriff oder bei der Auswertung des Gliederungsfelds.“ Was bedeutet das?? Ich habe die Zahlen erhöht und verringert, erhalte jedoch jedes Mal die gleiche Fehlermeldung und das Skript wird nicht ausgeführt. Ich weiß nicht einmal, was ein Gliederungsrahmen ist. Es ist seltsam, dass die Baumstruktur identisch ist. Ich habe gerade den Dateinamen geändert. Der Dateiname ist länger. Bedeutet das vielleicht, dass ich einen größeren Umrissrahmen benötige?Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Wenn Sie zurückgehen und das Skript überprüfen, wird in der zweiten Zeile definiert, welche Datentabelle während der Analyse verwendet werden soll. Der JSL-Code dt = Current Data Table() definiert eine lokale Variable „dt“, die dann im Rest des Skripts verwendet wird, anstatt die Datentabelle namentlich aufrufen zu müssen. Ebenso ist dt_parms die lokale Variable, die der NN-Tuning-Tabelle „NN-Tuning“ zugewiesen ist. Diese beiden Tabellen sind eigentlich die einzigen Dinge, die Sie dem Skript zuführen. Der Rest ist alles intern.
Wenn Sie den JSL-Code kopieren/in eine neue Datentabelle einfügen, sollte er automatisch funktionieren, da Sie ihn lokal in dieser Datentabelle ausführen.
Sie sollten den Aufruf dt << Nerual() nicht ändern, außer um Ihre Y()s und X()s und möglicherweise die Validation()-Methode zu definieren. Der JSL-Code dt << Nerual() ist ein Befehl, der JMP anweist, eine NN-Modellierung für die Datentabelle „dt“ durchzuführen. Daher die Definition von dt am Anfang des Codes.
Sie müssen außerdem den Aufruf „w = Window()“ ändern, um den Titel des NN-Berichtsfensters sowie den Regex() darunter wiederzugeben. Abhängig davon, ob Sie den „Test“-Datensatz tatsächlich als Teil einer Validierungsspalte haben möchten oder nicht, möchten Sie ihn entweder auskommentieren (mit dem Befehl // am Anfang der Zeile) oder den Kommentar entfernen am Anfang des Codes ausgegeben, wenn die Testergebnisspalten sowie die Test_stats-Definition erstellt werden und der Code die Ergebnisse in die neue Ausgabedatentabelle schreibt.
Ansonsten sollten Sie überhaupt nicht viel bearbeiten müssen.
Was Ihre letzte Frage betrifft, hängt es irgendwie davon ab, wie Sie den Code implementieren. Wenn Sie es aus der Datentabelle heraus ausführen, d. h. es im Skriptteil der Datentabelle gespeichert ist und Sie es über den grünen Hot-Button ausführen, müssen Sie nur Y() und X( ändern. ), die Sie als Prädiktoren und Antwort verwenden, um die Spaltennamen aus der neuen Datentabelle abzugleichen. Dazu muss natürlich die Tabelle „NN-Tuning“ geöffnet sein. Wenn Sie dies andererseits als separates Skript ausführen, möchten Sie möglicherweise die Definition von dt von dt = Current Data Table() in dt = Data Table (" ") ändern, wo Sie das einfügen würden Name der neuen Datentabelle zwischen den Anführungszeichen.
Das „Neural“, auf das Sie sich beziehen, ist keine Datentabelle, sondern der JMP-Befehl zum Ausführen eines Neural Net-Modells für eine bestimmte Datentabelle. Der Befehl „<<“ bedeutet, die Aktion rechts vom << auf dem Objekt links auszuführen. Am Anfang des Codes können Sie dies mit dem neuen Spaltenbefehl sehen. Wo dt_results << New Column() steht, weist der Code JMP an, eine neue Spalte für das Objekt dt_results zu erstellen, bei dem es sich um die aus der Datentabelle dt_parms generierten Teildaten handelt.
Hoffe das hilft!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleIch habe eine (wahrscheinlich einfache) Scripting-Frage. Angenommen, ich möchte den Eingabe-DT in einen anderen ändern. Sollte ich nicht einfach in der Lage sein, das Skript zu kopieren und einzufügen und das dt von „Neural“ durch etwas anderes zu ersetzen?
str = Eval Insert(
"report = (dt << Neural (
Y( :health designation ),
X(
Wenn ich die ursprüngliche „Neural“-Datei lösche und sie durch eine andere Tabelle mit genau denselben Informationen und einem anderen Namen ersetze, funktioniert das Skript nicht! Ist es erforderlich, dass in zwei Datentabellen, von denen eine den Namen „Neural“ trägt, exakt dieselben Daten vorhanden sind? Vielleicht habe ich diesen Teil verpasst!
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleFreut mich zu hören, dass es bei Ihnen klappt. Viel Erfolg beim Modellieren! Möglicherweise möchten Sie auch andere Modellplattformen prüfen und dann die Modelle anhand eines Testdatensatzes vergleichen, um herauszufinden, welches der beste Prädiktor ist.
DSBetreff: Aufbau mehrerer neuronaler NetzwerkmodelleWow, ich kann nicht glauben, dass ich dank Ihrer Skripthilfe vor dem Mittagessen 300 neuronale Netzwerkmodelle ausgeführt habe. Ich hoffe, dass dies aufgegriffen und gelobt wird, denn ich kann mir vorstellen, dass immer mehr Menschen, wenn sie den Wert der NN-Plattform erkennen, sich zu so etwas hingezogen fühlen, insbesondere wenn es sich um einen brandneuen Datensatz handelt und Sie das nicht wirklich tun Sie wissen, wo Sie angesichts der verwirrenden Menge an NN-Modell-Eingabeparametern, die leicht angepasst werden können, „eintauchen“ müssen (was manchmal zu großen Unterschieden führt, selbst wenn beispielsweise nur die Lernrate von 0,05 auf 0,1 erhöht wird). Als nächstes werde ich mit den verschiedenen Validierungsansätzen herumspielen (Validierungsspalte vs. Holdback vs. KFold). Angesichts meiner (derzeit) geringen Stichprobengröße muss ich auf jeden Fall vorsichtig sein (in der Hoffnung, diese vorläufigen Daten nutzen zu können, um Mittel für das Hinzufügen weiterer „Reihen“, z. B. Korallen, zu erhalten).
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Kfold ist auch eine weitere großartige Möglichkeit, den kurzen Datensatz zu validieren. Ja, den Zeilenausschluss würden Sie als Zeilenstatus festlegen. Dies können Sie erreichen, indem Sie den Datensatz „Test“ auswählen und den Zeilenstatus auf „ausgeschlossen“ festlegen. Wenn Sie Kfold oder Holdback verwenden, verwendet JMP diese zur Validierung der Daten und nicht zum Testen der Daten. Hoffentlich verfügen Sie auch über einen separaten Datensatz, den Sie als Testdaten verwenden können, und haben ihn nicht in derselben Datentabelle wie die Trainings- und Validierungsdaten.
Ich würde einfach Kfold zur Validierung verwenden und dann die Teile auskommentieren, die Sie zum Ausführen des Skripts nicht benötigen. Unten finden Sie die bearbeitete Version mit einer 5-fach-Validierungseinstellung für die NN-Plattform.Sollte funktionieren, bei mir hat es funktioniert.
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];
);
Viel Glück!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleWeitere hervorragende Vorschläge, insbesondere zur Art der Validierung. Ich sehe, dass Neural Holdback, Kfold oder Zeilenausschluss unterstützt (wobei ich vermute, dass ich einfach zufällig ein paar Zeilen zum Auslassen auswählen würde). Wenn ich das Skript ändern möchte, um die Art der Validierung zu ändern, würde ich dann einfach die Zeile „Validierung (:Validierung mit Test)“ ändern? Und wären die zurückgehaltenen Proben in den Augen von JMP als Validierungsproben gleichwertig? Wenn nicht, müsste ich die Validierungsspalten entfernen (oder umbenennen) und auch die Testspalten müssten entfernt werden.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Ich bin froh, dass es Ihr Problem behoben hat.
Mit der baumbasierten Modellierung (XGBoost, Boosted Trees und Bootstrap Forest) können Sie die Tuning-Tabellen-GUI in JMP problemlos verwenden, um viele Modelle auszuführen. Ein Nachteil ist jedoch, dass es viel RAM verbraucht. Das Schöne daran, es auf diese Weise auszuführen, ist, dass Sie Zehntausende verschiedener Parametereinstellungen ausführen können und es nicht viel RAM, sondern nur CPU-Verbrauch verbraucht. Ich habe bis zu 40.000 verschiedene Einstellungen mit Bootstrap Forest ausgeführt (was langsam ist), und auf meinem Arbeitslaptop (32 GB RAM und 2 GHz CPU) kann es ein paar Tage dauern.
Ich bin auch ein Early Adopter von JMP 16, und die Modellüberprüfung ist gut, aber wie Sie betonen, geht es dabei nicht darum, eines der Modelle zu optimieren, was etwas irreführend sein kann. Es werden lediglich die Standardeinstellungen verwendet, die nicht immer die besten Einstellungen zum Erstellen eines Vorhersagemodells sind. Es könnte Ihnen zumindest dabei helfen, herauszufinden, welche Plattformen den Zeitaufwand für eine weitere Feinabstimmung wert sind und welche es nicht wert sind, näher untersucht zu werden.
Möglicherweise möchten Sie auch die SVM-Plattform zur Modellierung Ihrer Nominaldaten in Betracht ziehen, da dies auch eine gute Methode für diese Art von Daten sein soll.
Was den Simulator betrifft, so ist das etwas anderes und soll dazu dienen, die Schätzungen mit unterschiedlichen Anfangsbedingungen zu testen (Randomisierung). Dadurch erhalten Sie eine Werteverteilung für die Schätzung und erhalten ein Konfidenzintervall für die ursprüngliche Schätzung. Anschließend können Sie entscheiden, ob das Modell mit den angegebenen Schätzungen gut ist oder nicht.
Was das DOE betrifft, könnten Sie einen faktoriellen oder sogar einen raumfüllenden Versuchsplan mit entsprechend eingestellten Faktoren durchführen, und ich denke, dass diese Plattform auch bedingte Einschränkungen zulässt. Außerdem könnten Sie erwägen, ein Prädiktor-Screening oder Bootstrapping für die Prädiktoren durchzuführen, um zu sehen, ob Sie tatsächlich alle 89 davon benötigen oder ob Sie wirklich nur eine kleinere Teilmenge verwenden können.
Als letzte Anmerkung: Da Sie über eine kurze und breite Datentabelle verfügen, sollten Sie anstelle der Verwendung einer Validierungsspalte möglicherweise einen „Leave One Out“-Ansatz für die Validierung in Betracht ziehen. Wenn Sie das tun, müssen Sie das Skript dafür bearbeiten.
Viel Glück!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleAha! Vielen Dank, dass Sie es für mich noch einmal gemacht haben. Da ich offensichtlich keine Skriptkenntnisse habe, habe ich einfach „Neural“ in den Namen meiner Datentabelle geändert ... was offensichtlich nicht funktionieren würde. Nachdem ich den Namen meiner Datentabelle in „Neural“ geändert, die Testspalten hinzugefügt und die anderen von Ihnen empfohlenen Änderungen vorgenommen hatte, funktionierte es.
Was ich jetzt tun könnte, wäre, DOE zu verwenden, um einen bedingt faktoriellen Entwurf zu erstellen (da man, wie Sie bemerkt haben, nicht mit mehreren versteckten Ebenen steigern kann) und ein paar hundert Modelle auf meinem Arbeitscomputer auszuführen (um meine 8 nicht zu sehr zu belasten). -GB-RAM-Laptop).
Ich habe das Gefühl, dass Ihr Skript eine GUI oder ein Add-In werden muss (irgendwelche Interessenten?). JMP Pro 16, das ich in der Beta-Phase teste, verfügt über ein wirklich großartiges „Modell-Screening“-Tool, aber ich denke, es testet verschiedene Modellierungstypen (z. B. PLS vs. Gen-Reg), nicht INNERHALB der potenziell Tausenden von Modellen, die es geben könnte Es wird innerhalb jedes Modellierungstyps erstellt (andernfalls hört es möglicherweise nie auf zu laufen). Ich habe vom „Simulator“ gehört, aber ich denke, dass er etwas anderes macht (nicht Unmengen von simulierten Modellen generiert), obwohl ich mich irren könnte. Nochmals vielen Dank für Ihre Hilfe. Das wird mir sicherlich TAGE Zeit sparen!
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Vielen Dank für die Weitergabe der Datentabelle. Sie hat beim Debuggen der von Ihnen im Skript vorgenommenen Änderungen geholfen.
Ein paar Dinge sind mir aufgefallen:
- Sie mussten zusätzliche Spalten für die „Test“-Datensatzstatistiken hinzufügen, die Sie aufzeichnen möchten.
- Sie haben versehentlich die Definition für imax entfernt, was die Anzahl der Zeilen der Parametertabelle angibt
- Sie haben auch versehentlich den Aufruf zur NN-Plattform geändert, wo im Skript dt << Neural() steht. Hier wird der Befehl gesendet, um die neuronale Netzmodellierung für die Datentabelle „dt“ durchzuführen. Sie hatten es in etwas anderes geändert.
- Die Definition des Fensters „w“ muss den vollständigen Namen des NN-Fensters enthalten, und wenn Sie nur ein einzelnes X ausführen, fügt JMP diesen offenbar als Teil des Fensternamens ein, sodass er in beiden enthalten sein muss den GetName-Befehl und die IF-Anweisung darunter. Dies gilt jedoch nur bei der Modellierung mit einem einzelnen X. Wenn Sie mehr als eine verwenden, ist das „by…“ nicht im Fensternamen oder in der IF-Anweisung erforderlich.
- Der letzte Teil besteht darin, sicherzustellen, dass die Statistiken für die Trainings-, Validierungs- und Testdaten im Befehl Number Col Box() korrekt aufgerufen werden.
Der folgende Code funktioniert mit Ihrer Datentabelle (auch mit geändertem Skript angehängt). Es funktioniert mit der NN-Tuning-Tabelle, die ich zuvor angegeben habe.
Wenn Sie wirklich alle 86 Spalten verwenden möchten, müssen Sie diese manuell im X(col1, col2,...)-Teil des Skripts einfügen. Anschließend sollten Sie auch den GetName-Teil bearbeiten, da er nicht alle 86 Namen enthält, sondern nur den Fensternamen mit der Antwortspalte.
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];
);
Hoffe das hilft!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleNun, ich habe versagt, aber ich denke, das liegt wahrscheinlich an einem kleinen Skriptfehler. Ich habe Ihre NN-Tuning-Tabelle mit meinen Daten (im Anhang) verwendet und alle notwendigen Aktualisierungen vorgenommen (ich habe drei Trainings-, Validierungs- und Testbeispiele verwendet). Wenn Sie das letzte Skript („Vergleich neuronaler Netze“) ausführen, wird die neue Tabelle erstellt, es werden jedoch keine Analysen ausgeführt. Ich habe nur ein paar X-Begriffe eingefügt, aber es werden tatsächlich alle 86 Spalten in der Gruppe „Standardisierte Daten“ sein. Wenn ich den Debugger verwende, wird mir angezeigt, dass mit dem etwas schiefläuft
" Für ( ich = 1 , i <= imax, i++," Bereich. Ich hoffe/vermute, dass ein kompetenterer Drehbuchautor das Problem wahrscheinlich in Sekundenschnelle finden kann!
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleJa! Das ist genau das, was ich möchte: eine Tabelle mit allen NN-Eingabeparametern (z. B. Anzahl der TanH-Knoten, Anzahl der Schichten usw.), die mit der NN-Plattform synchronisiert wird. Ich habe es noch nicht ausprobiert und kann mir vorstellen, dass es eine Weile dauern wird, aber ich verwende einen kleinen „Übungs“-Datensatz mit 20 Stichproben x 90 Prädiktoren, sodass es möglicherweise machbar ist. In Wirklichkeit habe ich nur festgestellt, dass die Art der Aktivierung und die Anzahl der Knoten (sowie die Anzahl der Touren) meinen RMSE tatsächlich senken, wobei Boosten nicht viel hilft. Aber selbst dann wird dies viel schneller gehen als alle ~500 Modelle, die ich ausführen wollte (nicht annähernd so viele, wie ich gestern ausführen wollte, zum Glück, da ich unter 4 Knoten/Aktivierungstyp bleiben möchte). Ich werde es morgen ausprobieren und alle wissen lassen, wie es läuft.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleHallo @abmayfield ,
Das war etwas, worüber ich schon seit einiger Zeit schreiben wollte, und es hat wirklich Spaß gemacht, und Ihr Beitrag hat den Anstoß gegeben, es in Gang zu bringen, danke! Ich wollte schon seit einiger Zeit eine Möglichkeit haben, die NN-Plattform zu optimieren, da sie sehr empfindlich auf die Anfangsbedingungen reagiert und es ziemlich langsam ist, dies manuell vorzunehmen.
Deshalb habe ich einige Skripte angepasst, die ich für andere Modellplattformen erstellt habe, um deren Optimierungsprozesse zu automatisieren, zum Beispiel die Boosted Tree-, Bootstrap Forest- und XGBoost-Plattformen. Die Skripte sollen in Ihrer Datentabelle gespeichert und mit dem grünen Hot-Button ausgeführt werden.
Hoffentlich wissen Sie etwas über Skripterstellung und wissen, wo Sie diese Skripte an Ihre spezifischen Situationen/Datenstruktur/Spaltennamen usw. anpassen können. Ich habe einige Kommentare eingegeben, um zu erklären, was ich in den einzelnen größeren Gruppen mache. Ich füge zwei Skripte bei – eines für kontinuierliche Y-Werte und eines für nominale/ordinale Y-Werte. Ich musste einen Test einschließen, um zu sehen, ob die Ausgabe Y nominal oder ordinal ist, da sich der Wert von Number Col Box() abhängig davon ändert. Ich habe die Datentabelle „Big Class Families.jmp“ in den Beispieldaten als Testdatensatz verwendet. Ich füge auch zwei Ausgabedatentabellen hinzu, die ich entweder mit der numerischen NN-Abstimmung oder der nominalen/ordinalen NN-Abstimmung erzeuge. Ich habe :sex mit :age, :weight:, :height nominal gemacht und dann :age von Ordinal auf Continuous geändert und das Alter mit :weight und :sex für die kontinuierliche NN-Abstimmung modelliert.Die Anpassungen und Statistiken sind schrecklich, aber sie dienen nur dazu, festzustellen, ob die JSL funktioniert oder nicht. Ich habe der Datentabelle auch eine :Validation-Spalte hinzugefügt, indem ich nach :age geschichtet habe, nur um zu überprüfen, ob alles richtig funktioniert hat.
Ich bin mir sicher, dass jemand anders ein eleganteres Skript erstellen könnte, um die Y()-Eingabespalte auf den Modellierungstyp „Kontinuierlich“, „Nominal“ oder „Ordinal“ zu testen und dann den entsprechenden Number Col Box()-Wert einzufügen, um die Daten mit nur a entsprechend zu extrahieren einzelner JSL-Code.
Sie müssen die Eingaben Y() und
Die NN-Tuning-Tabellen könnten sich im Prinzip wie ein raumfüllendes DOE verhalten, bei dem die unteren und oberen Einstellungen das sind, was Sie einstellen möchten, mit Ausnahme einiger davon, wie zum Beispiel, dass N_Layers nur 1 oder 2 sein kann, weil JMP nur 1 oder 2 zulässt Lagen. Bei Penalty_Method handelt es sich nur um die Optionen, die in der NN-Plattform gültig sind, und die Transformationskovariate und Robust Fit nehmen nur Werte von 0 oder 1 (aus oder ein) an. Ich füge auch die NN-Tuning-Tabelle hinzu.
Wenn Sie Fragen haben, lassen Sie es mich wissen.
Hier ist mein Code für den Modellierungstyp Nominal/Ordinal:
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>
Eine seltsame Sache, die ich nicht verstehe, ist, dass ich diese Warnung bezüglich des Protokollfensters erhalte, das ich erstelle, wenn ich es für die NN-Plattform ausführe, aber ich habe sie nie von meinen anderen Plattformen erhalten. Ich kann nicht nachvollziehen, woher diese Warnung kommt, aber sie läuft trotzdem korrekt. Vielleicht kann jemand diesen Teil meines Codes reparieren?
Unerwartet ",". Möglicherweise fehlt ein „)“.
Es wird versucht, den Operanden für den Operator „<<“ zu analysieren.
Zeile 23 Spalte 10: ))►,
Als letzter Hinweis: Seien Sie vorsichtig mit den Einstellungen, da die Ausführung der Modellierung SEHR lange dauern kann, wenn Sie über eine große Anzahl von Boosts, Touren oder Übertragungsfunktionen verfügen. Seien Sie nur vorsichtig, dass Sie es nicht übertreiben.
Hoffe das hilft!,
DS
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleÜbrigens ist der „Option“-Trick, mit dem alle relevanten Funktionen dieselben Informationen anzeigen lassen wie die Funktion, die Sie aktiv auswählen, eigentlich der „Befehl“-Trick auf einem Mac (weshalb das früher nicht funktionierte).
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleMark, Danke für deine Vorschläge. Den zweiten habe ich versucht und bin gescheitert. Ich kenne die Option „In kombinierte Tabelle umwandeln“ von anderen Plattformen, aber vielleicht wurde sie aus irgendeinem Grund bei der neuronalen Plattform weggelassen. Seltsamerweise funktioniert der „Option“-Trick, bei dem man die Wahltaste gedrückt hält, eine Auswahl trifft und dieser auf alle Teile des Berichts angewendet wird, weder auf der neuronalen Plattform noch, sonst könnte das die Sache beschleunigen.
Es wäre cool, wenn ich meine neuronalen Netzwerkparameter (#Knoten, #Touren usw.) als X in einem DOE haben könnte, mit dem Ziel, RSME zu minimieren, aber das scheint aufgrund der Art und Weise, wie man sie eingeben muss, nicht möglich zu sein Parameter in den jeweiligen Feldern beim Start des neuronalen Modells. Sie müssten einige wirklich fortgeschrittene Skripte erstellen, und selbst dann bin ich mir nicht sicher, ob DOE und Neural richtig kommunizieren könnten. Aber wenn irgendjemand da draußen eine Möglichkeit kennt, wie ich die neuronale Plattform dazu bringen könnte, im Wesentlichen die in diesem Screenshot dargestellten Modelle auszuführen (die eine Unterauswahl der Gesamtsumme darstellen), wäre ich sehr dankbar. Mit anderen Worten: Die Werte in der ersten Screenshot-Tabelle müssten in die entsprechenden Eingabefelder im zweiten Screenshot (d. h. beim Start des neuronalen Modells) übernommen werden.
Betreff: Aufbau mehrerer neuronaler NetzwerkmodelleSie könnten ein Experiment mit weniger Ebenen entwerfen, um es an ein RMSE-Modell zweiter Ordnung anzupassen, und dann das Modell verwenden, um die Einstellungen zu optimieren. Sie können auch jedes Modell nacheinander erstellen und dann alle Ergebnisse auf einmal extrahieren, indem Sie mit der rechten Maustaste auf eine der Ergebnistabellen klicken und „In kombinierte Tabelle umwandeln“ auswählen.