Vergleich der Computerleistung mit statistischen Methoden mit Große Daten , wir können nur zufällige Daten generieren und die Leistung danach messen, oder? Nun, es kann sein, dass simulierte Daten möglicherweise nicht mit echten Daten identisch sind. Lass es uns herausfinden.
Logistische Regression
Nehmen wir an, wir vergleichen die logistische Regression. Daher erstellen wir einige Regressoren als zufällige Uniform und erstellen eine kategoriale Antwort, die von den Regressoren beeinflusst wird. Wir verwenden eine Million Zeilen. Hier ist ein Beispiel für ein Skript, das das zu tun:
dt = newTable ("BenchmarkLogistic.jmp");
dt <
dt <
dt <
dt <
dt <
Wenn (RandomUniform () <1 / (1 + Exp (- (: X1-X2 + X3))), "Y", "N")));
Jetzt führen wir Fit Model ein JMP und zeit es.
startTime = TickSeconds ();
Fit Modell (
Y (: YCat),
Effekte (: X1,: X2,: X3),
Persönlichkeit (Nominallogistik),
Lauf (Wahrscheinlichkeitsverhältnis-Tests (1), Wald-Tests (0))
);
firstTime = TickSeconds () - startTime; show (firstTime);
Auf meinem Rechner läuft das rein 6,53 Sekunden . Nicht schlecht für eine Million Reihen.
Ich wollte diese Daten zu einem anderen System übertragen, um sie zu vergleichen, aber es war ein Ärgernis, all diese Dezimalstellen in den zufälligen einheitlichen Zahlen zu haben. Der Benchmark sollte genauso gut funktionieren, wenn ich sie auf eine Dezimalstelle gerundet habe. Deshalb habe ich mein Datengenerator-Skript durch Hinzufügen einer Round-Funktion geändert.
dt = newTable ("BenchmarkLogistic2.jmp");
dt <
dt <
dt <
dt <
dt <
Wenn (RandomUniform () <1 / (1 + Exp (- (: X1-X2 + X3))), "Y", "N")));
Jetzt führe ich die gleiche logistische Regression aus, mit Ausnahme der Rundung, und es dauert 1 Sekunde . Ja, es läuft sechsmal so schnell durch Verwendung gerundeter Daten!
Muss die Maschine härter arbeiten, um mit mehr Dezimalstellen zu rechnen? Natürlich nicht. Es verwendet nicht einmal Dezimalarithmetik. Es wird in binär konvertiert und die Bits erstrecken sich genauso wie die ungerundeten Daten.
Was ist also das Geheimnis?
Nun, es stellt sich heraus, dass mit nur 11 möglichen Werten für jedes X, da es drei X gibt, es nur 1,331 eindeutige Kombinationen für die drei Variablen gibt. Die Logistikplattform ermittelt tatsächlich alle eindeutigen Kombinationen in den Daten. Und wenn es viele Übereinstimmungen gibt, kann es Beobachtungen kombinieren und einfach durch die einzigartigen Kombinationen iterieren. Für die Logistik wurden die meisten Berechnungen in 1.331 Kombinationen statt in allen 1 Million Zeilen durchgeführt. Also nur eine Sekunde statt 6,53 Sekunden.
Was ist also die Lektion für die Verwendung von Logistic? Selbst wenn Sie über viele Daten verfügen, zählt die Anzahl der eindeutigen Wertekombinationen mehr als die Anzahl der Zeilen.
Und was ist die Lektion für die Verwendung simulierter Daten? Wenn Sie mit einer kleinen Anzahl von Ebenen rechnen, auch wenn die Variable stetig ist, sollten Sie anstelle einer kontinuierlichen Zufallsverteilung mit dieser kleinen Anzahl eindeutiger Werte simulieren.
Mit einer kleinen Anzahl von Regressoren können die einzigartigen Kombinationen leicht genutzt werden. Mit zunehmender Anzahl von Regressoren ist es jedoch immer unwahrscheinlicher, dass Sie die Daten zu einer kleinen Anzahl eindeutiger Kombinationen zusammenfassen können.
Andere Montageplattformen
Führen die anderen passenden Plattformen diese Gruppierung durch? Die Least Squares-Persönlichkeit sucht auch nach einzigartigen Kombinationen, die Berechnungen jedoch nicht zu beschleunigen. Sie müssen sie für den fehlenden Passungstest finden. Es stellt sich jedoch heraus, dass bei Dutzenden von Millionen von Zeilen der Test der fehlenden Passform Sekunden dauern kann, und der Test ist in der Regel ohnehin für große Fälle nicht interessant. Um die Dinge zu beschleunigen, ändert sich die Standardeinstellung, wenn die Anzahl der Zeilen 20.000 oder mehr beträgt, wenn sie nicht passt, so dass sie nicht all die Zeit damit verbringt, etwas zu tun, was normalerweise nicht erwünscht ist.
Was ist mit Daten in anderen Fällen, wie zum Beispiel Entscheidungsbäumen? Macht es einen Unterschied, ob die simulierten Daten eindeutig oder gerundet sind? Ja tut es. Beim Sortieren nach diesen X-Werten werden Bindungen ausgenutzt, indem sie zur Seite gelegt werden, sodass sie nicht erneut verglichen werden müssen. Je weniger Werte Sie haben, desto schneller ist die Sortierung.
Clustering
Was ist mit dem Clustering? Ist es wichtig, wie die Daten zur Geschwindigkeitsmessung zufällig generiert werden?
Ich beschloss, vier Sätze simulierter Daten zu generieren, um zu sehen, ob die Details einen Unterschied machen. Ich habe mit reinen, unabhängigen, normalen Zufallsdaten begonnen: 10.000 Zeilen zu 50 Spalten. Die Zeit zum Cluster war 28,83 Sekunden .
In der realen Welt sind Daten jetzt nicht unabhängig. Es ist korreliert. Der nächste Durchlauf bestand also aus der gleichen Art von Daten, wurde jedoch so umgewandelt, dass sie stark korreliert war. Jede Kolonne hatte eine Korrelation von 0,95 mit den anderen. Die Zeit zum Cluster war nur 4,18 Sekunden - mehr als sechsmal schneller !
Warum wäre das so? Es stellt sich heraus, dass bei diesen Korrelationen, wenn Sie Hauptkomponenten nehmen, 95% der Abweichung in der ersten Hauptkomponente liegt. Wenn Sie also Entfernungen zwischen Punkten betrachten und die Entfernungsschleife abkürzen, wenn Sie mehr als die Entfernung erhalten haben, mit der Sie verglichen haben, muss die meiste Zeit nur das erste Element betrachtet werden, um es zu wissen dass ein gewisser Abstand nicht der kleinste ist. Im hierarchischen Cluster führen wir immer ein Einzelwertzerlegung (SVD) der Daten vor dem Clustering, damit der Algorithmus schneller ausgeführt wird. Die SVD ist im Allgemeinen viel billiger als das hierarchische Clustering, daher ist dies normalerweise einen Preis wert.
Aber die reale Welt hat Daten in Büscheln, sonst würden wir keine Clusterung durchführen. Geht es schneller, wenn sich die Daten in natürlichen Clustern befinden und nicht gleichmäßiger im Raum verteilt werden? Wir haben eine Reihe unkorrelierter, aber klumpiger Daten generiert, bei denen es 100 gut getrennte Klumpen mit 100 Punkten in jedem Klumpen gab. Die Zeit zum Cluster war nur 2,83 Sekunden . Wenn die Daten auf natürliche Weise gruppiert sind, ist die Suche nach Nachbarn schneller, da der Raum besser organisiert wird.
Was ist, wenn Sie die Klumpenbildung und hohe Korrelationen kombinieren? In diesem Fall läuft die Zeit auf 0,98 Sekunden . 29 mal schneller als zu Beginn, obwohl die Daten die gleiche Größe und Randverteilung hatten.
|
| Nicht korrelierte Zufallszahlen |
|
28.833|
| Korrelierte Zufallszahlen |
|
4.183|
| Nicht korreliert klumpig |
|
2.833|
| Korreliert klumpig |
|
0,983
Was wäre, wenn Sie dieselben Benchmarks in einem anderen Clustering-Programm durchgeführt hätten? Die klassischen hierarchischen Clustering-Algorithmen sind langsam und benötigen immer etwas proportional zur Zeit n ^ 3 * p. Mit JMPs Verwendung von SVD und einer sehr schnellen Near-Neighbor-Version der Ward-Methode ist diese Methode jedoch viel schneller als die klassische Methode - auch wenn dies von den Daten abhängt, wie schnell, während die klassische Methode wesentlich konsistenter ist und natürlich viel langsamer.
// Nicht korrelierter Zufall
dtUncorr = asTable (J (10000,50, RandomNormal ()));
startTime = TickSeconds ();
dtUncorr <
timeUnCorr = TickSeconds () - startTime;
// korrelierte zufällige
theCorr = 0,05 * Identität (50) +. 95 * J (50,50);
dtCorr = asTable (J (10000,50, RandomNormal ()) * Cholesky (theCorr) `);
startTime = TickSeconds ();
dtCorr <
timeCorr = TickSeconds () - startTime;
// Unkorrelierte geballte zufällige 100 Klumpen, 100 pro Klumpen
dtClumped =
AsTable (DirectProduct (J (100,50,20 * RandomUniform ()), J (100,1,1)) +. 1 * J (10000,50, RandomNormal ()));
startTime = TickSeconds ();
dtClumped <
timeClumped = TickSeconds () - startTime;
// korrelierte geballte zufällige 100 Klumpen, 100 pro Klumpen
data = DirectProduct (J (100,50,20 * RandomUniform () - 10), J (100,1,1)) +. 1 * J (10000,50, RandomNormal ());
dtClumpedCorr = AsTable (data * Cholesky (theCorr) `); Daten = 0;
startTime = TickSeconds ();
dtClumpedCorr <
timeClumpedCorr = TickSeconds () - startTime;
Kategorisieren
Was ist mit anderen Orten in JMP? Ist es wichtig, welche Eigenschaften die Daten haben?
Ja tut es. Im Allgemeinen geht es mit Kategorien schneller, wenn es nicht zu viele davon gibt. Wenn es weniger als 5.000 Ebenen einer Kategorie gibt, verwendet es assoziative Array-Methoden zum Erstellen von Kategorien und nutzt außerdem das Multithreading. Wenn es jedoch mehr als 5.000 Ebenen gibt, und insbesondere bei Millionen von Ebenen, wird die Arbeitsspeicherzuordnung teuer und es werden stattdessen Sortiermethoden verwendet.
Fazit
Wenn Sie die Leistung einer Methode anhand von simulierten Daten vergleichen müssen, ist es sehr wichtig, mit welchen Eigenschaften Sie simulieren. Es ist am besten, die Eigenschaften der Daten, auf die Sie sie anwenden möchten, zu duplizieren.
Zusamenfassend, es hängt davon ab, ob ; die Details sind wichtig.
JMP ist sehr bemüht, die typischen Eigenschaften realer Daten zu nutzen.
Hinweis: Dies ist Teil einer Big Statistics-Reihe von Blogbeiträgen von John Sall. Lesen Sie alle seine Große Statistikbeiträge .