Hinzufügen von Strafen zur Anzahl der Aufteilungen in der Partitionsplattform, um die Anzahl der Blätter zu reduzieren?Ich habe in letzter Zeit viel Zeit in der Partition-Plattform verbracht und suche derzeit nach einer Möglichkeit, die Analysen zu automatisieren.
Mein Problem ist folgendes: Im Allgemeinen habe ich den Datensatz 50/50 Training/Validierung aufgeteilt und auf "Go" geklickt, wodurch die Validierung RSquare maximiert wird. Aber, Dies führt oft zu Modellen, die eine größere Anzahl von Splits haben, als wirklich glaubwürdig sind , zB hier, wo 5 Splits erstellt werden, um zu Validation RSquare 0.288 zu gelangen, wenn nur die Verwendung von zwei Splits eine fast gleich gute Anpassung von 0.27 erhalten würde.

Infolgedessen muss ich die Aufteilungen im Allgemeinen immer manuell bereinigen, um ein akzeptabel gutes Validierungs-RSquare mit einer akzeptabel niedrigen Anzahl von Modelltermen zu erhalten.
Gibt es eine Möglichkeit, JMP zu bitten, eine Strafe anzuwenden und eine Art "reguläres" Validierungs-RSquare zu erstellen, das die Modellauswahlkriterien basierend auf der Anzahl der Aufteilungen bestraft? Beispielsweise könnte das "regularisierte" Validierungs-RSquare [Validierungs-RSquare] - 0.05*[N Splits] sein. Oder vielleicht gibt es einen besseren Weg zur Regularisierung (z. B. weitere Terme hinzufügen, wenn sie mindestens 5 % der Restvarianz modellieren können, anstatt 5 % der absoluten Varianz).
JSL-Lösungen sind willkommen, da dies in erster Linie für automatisierte Analysen gedacht wäre.
AnalytikSkriptingBetreff: Hinzufügen von Strafen zur Anzahl der Aufteilungen in der Partitionsplattform, um die Anzahl der Blätter zu reduzieren?Hi @markschwab ,
Was Ihr Anliegen betrifft, ist die Anzahl der Splits wirklich glaubwürdig oder ist es eine relativ geringe Anzahl von Splits? Ich glaube, die Anzahl der glaubwürdigen Aufteilungen sind die Zeilen in der Datentabelle minus 1, aber nicht 100%.
Wie auch immer, ich füge ein Code-Snippet bei, das Sie für Ihre automatisierte Partitionierung verwenden können. Ich habe dies mit der Datei Boston Housing.jmp gemacht.
Wenn Sie mit JSL vertraut sind, sollten Sie es an Ihre Bedürfnisse anpassen können. Der Code ist ziemlich einfach, es wird davon ausgegangen, dass Sie eine numerische, kontinuierliche Antwortspalte haben. Es führt die Partitionierung für beliebig viele maximale Partitionen aus, die Sie im ersten Fenster definieren, und speichert dann die Partitionierungsstatistiken. Sie können ganz einfach Ihre eigene Spaltenformel erstellen, um beispielsweise eine "bestrafte" Validierung von RSquare zu erhalten oder wie auch immer Sie die Partition bestrafen möchten. Sie können dann auswählen, welche Partition für Ihre Kriterien am besten geeignet ist, und sie mit der von Ihnen festgelegten festen Anzahl von Splits erneut ausführen. Ich habe einige Ideen, wie ich das Programm aufpeppen könnte, aber das ist für später.
Nebenbei bemerkt, könnten Sie in Erwägung ziehen, eine Validierungsspalte zu erstellen (wenn Sie kein Pro haben, können Sie dies tun, indem Sie im Scripting-Index suchen) und nach Ihrer Antwortspalte stratifizieren, dies gibt den Trainings-/Validierungssätzen mehr Gleiche Vertretung bei Nicht-50/50-Splits. Auf diese Weise haben Sie mehr Daten, um Ihre Partition zu trainieren.
Hoffe das hilft!,
DS
Names Default To Here( 1 );
lbWidth = 168;
//dt = Open( "$SAMPLE_DATA/Boston Housing.jmp" );
// Expression to store the current settings in global variables
recallRolesS1 = Expr(
::dtchosenRecall = dtchosen
);
// Expression to clear all current settings. KW: Clear
clearRoles = Expr(
Try(
colListY << RemoveAll;
ColListX << RemoveAll;
ColListW << RemoveAll;
ColListF << RemoveAll;
colListV << RemoveAll;
)
);
// Expression to store the current settings in global variables
recallRoles = Expr(
::ycolRecall = colListY << GetItems;
::xcolRecall = colListX << GetItems;
::WcolRecall = colListW << GetItems;
::FcolRecall = colListF << GetItems;
::vcolRecall = colListV << GetItems;
);
//Function to choose the data table to model. KW: choose_data
choose_data_table = Function( {},
list = {};
For( i = 1, i <= N Table(), i++,
list[i] = Data Table( i ) << get name
);
win = New Window( "Select a data table",
<<MODAL></MODAL>Betreff: Hinzufügen von Strafen zur Anzahl der Aufteilungen in der Partitionsplattform, um die Anzahl der Blätter zu reduzieren?Vielen Dank @DiedrichSchmidt für die ausführliche antwort! Ich werde einige Zeit brauchen, um das Skript zu verdauen.
Könnten Sie mir vorerst eine kurze Einführung mit einem Anwendungsbeispiel geben? Folgendes habe ich versucht und erhalte eine Fehlermeldung:
1) Entkommentieren Sie die Zeile "dt = Open( "$SAMPLE_DATA/Boston Housing.jmp" );" und führe das Skript aus
2) Klicken Sie auf "Datentabelle auswählen" -> "Boston Gehäuse" -> OK
3) Klicken Sie unter "Aktion" auf "OK".
4) Im Fenster "JSL to help with Partitioning" setze ich "nox" in Y und "age" in X um und drücke "OK"
5) Ich sehe JMP-Warnung " Tiefgestelltes Problem{20} beim Zugriff oder bei der Auswertung von 'w[Outline Box("Partition for " || ycols[1])]' , w[/*###*/Outline Box( "Partition for " || ycols[ 1] )] ". Die Tabelle "Partition_Results" ist null, mit Ausnahme der Spalte "Splits", die von 1-20 reicht.
Betreff: Hinzufügen von Strafen zur Anzahl der Aufteilungen in der Partitionsplattform, um die Anzahl der Blätter zu reduzieren?Hi @markschwab ,
Sie verwenden den Code wie beabsichtigt, ich habe gerade einige Vermutungen angestellt, die nicht generisch genug waren, um unter allen Umständen zu funktionieren. Ich dachte, Sie hätten eine Validierungsspalte und haben sie so geschrieben, dass sie mit einer ausgeführt wird. Das aktualisierte Skript unten umgeht dies, indem Sie den Validierungsteil eingeben können, genau wie im Partitionsplattformfenster. Verwenden Sie jedoch nicht sowohl eine Validierungsspalte als auch einen Validierungsteil – das Skript wurde noch nicht codiert, um dies zu berücksichtigen, und ist wiederum nicht vollständig generisch genug für alle möglichen Benutzereingaben.
Der Fehler, den Sie erhalten haben, lag wiederum daran, dass ich davon ausgegangen bin, dass mehr als ein X-Faktor im Prozess enthalten ist, und daher den Verweis auf das Berichtsfenster entsprechend geskriptet habe. Das ist jetzt behoben, so dass es egal ist, ob es nur 1 X oder mehrere X gibt.
Auch dieses Skript ist nicht vollständig generisch genug, um die nicht numerische/nicht kontinuierliche Antwortspalte Y zu berücksichtigen. Wenn die Antwort kategorisch ist, ist dieses Skript nicht dafür ausgelegt, dies zu berücksichtigen. Es kann bei Bedarf leicht geändert werden, um dies zu tun.
Hoffe das hilft,
DS
UPDATE: Ok, also konnte ich mir nicht helfen, mehr zu programmieren und habe einige bestrafte RSquare-Spalten und eine RSquare-Spalte zur Trainingsvalidierung eingefügt. Sie können die Formel und den Koeffizienten der bestraften Berechnung ändern, indem Sie den Code bearbeiten - ich habe ihn auf Ihr Konzept von Rsquare-0.05*Splits eingestellt. Darüber hinaus habe ich auch Code eingefügt, um die Ergebnisse grafisch anzuzeigen, wenn die Berechnungen abgeschlossen sind.
UPDATE 2: Ich bin zurückgegangen und habe den Code ein bisschen lustiger gemacht -- Jetzt können Sie die Tabellenergebnisse neben den Diagrammergebnissen sehen und indem Sie den Punkt im Diagramm auswählen, der Ihnen am besten gefällt, können Sie die Partition für diesen Punkt erneut ausführen Anzahl der Splits, wenn Sie auf "OK" klicken. Wie zuvor habe ich es nicht für jede Art von Benutzereingabe supergenerisch gemacht, sondern versucht, es für numerische/kontinuierliche Antworten zum Laufen zu bringen. Was Sie jetzt haben, sollte ausreichen, um Sie zum Laufen zu bringen.
PS Verwenden Sie beim Erlernen des Codes den Scripting-Index im Hilfemenü von JMP. Es ist sehr hilfreich, einige der Aufrufe zu verstehen und sie bei der Skripterstellung zu verwenden.
Names Default To Here( 1 );
lbWidth = 168;
dt = Open( "$SAMPLE_DATA/Boston Housing.jmp" );
// Expression to store the current settings in global variables
recallRolesS1 = Expr(
::dtchosenRecall = dtchosen
);
// Expression to clear all current settings. KW: Clear
clearRoles = Expr(
Try(
colListY << RemoveAll;
ColListX << RemoveAll;
ColListW << RemoveAll;
ColListF << RemoveAll;
colListV << RemoveAll;
)
);
// Expression to store the current settings in global variables
recallRoles = Expr(
::ycolRecall = colListY << GetItems;
::xcolRecall = colListX << GetItems;
::WcolRecall = colListW << GetItems;
::FcolRecall = colListF << GetItems;
::vcolRecall = colListV << GetItems;
::max_spRecall = max_sp_input << get;
::partVPRecall = partVP_input << Get;
);
//Function to choose the data table to model. KW: choose_data
choose_data_table = Function( {},
list = {};
For( i = 1, i <= N Table(), i++,
list[i] = Data Table( i ) << get name
);
win = New Window( "Select a data table",
<<MODAL></MODAL>