Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 24

 

Alexey, ich habe noch eine weitere Frage zu Ihrer Funktion zur Sichtung von Prädiktoren - welches Intervall von Rückgabewerten sollte sie haben? Ich habe diese Fitnessfunktion auf meine Daten mit zufälligen Eingaben angewandt (fitness_f(runif(predictor_number, min = 0, max = 1))) und Ergebnisse von 0 bis 0,03 gesehen. Ich sehe auch im Code, dass die Funktion im Fehlerfall (Nulleingaben) 0 zurückgibt. Irgendetwas stimmt hier nicht, GenSA versucht, die Ergebnisse zu minimieren, d.h. am Ende wird GenSA einfach auf Nulleingaben kommen und aufhören. Vielleicht sollten wir dann das Vorzeichen des Ergebnisses der Fitnessfunktion ändern, damit GenSA in die entgegengesetzte Richtung wirkt?
Wenn die Fitnessfunktion an einem bestimmten Punkt der Optimierung beginnt, negative Zahlen zu liefern, und je niedriger diese sind, desto besser - dann ist alles in Ordnung.

 
Dr. Trader:

Alexey, ich habe noch eine Frage zu Ihrer Funktion zum Aussieben von Prädiktoren: Welches Intervall von Rückgabewerten sollte sie haben? Ich habe diese Fitnessfunktion auf meine Daten mit zufälligen Eingaben angewendet (fitness_f(runif(predictor_number, min = 0, max = 1))) und Ergebnisse von 0 bis 0,03 gesehen. Ich sehe im Code auch, dass die Funktion im Fehlerfall (Nulleingaben) 0 zurückgibt. Irgendetwas stimmt hier nicht, GenSA versucht, die Ergebnisse zu minimieren, d.h. am Ende wird GenSA einfach auf Nulleingaben kommen und aufhören. Vielleicht sollten wir dann das Vorzeichen des Ergebnisses der Fitnessfunktion ändern, damit GenSA in die entgegengesetzte Richtung wirkt?
Wenn die Fitnessfunktion an einem bestimmten Punkt der Optimierung anfängt, negative Zahlen zu liefern, und je niedriger diese sind, desto besser, dann ist alles in Ordnung.

Das ist eine gute Frage. Sie finden es heraus.

Ich schreibe gerade einen Artikel über diese Methode und hier ist ein Auszug:


Blockdiagramm des Algorithmus, der auf korrigierter gegenseitiger Information und stochastischer Suche nach einer Teilmenge von Prädiktoren beruht.


  • a) Den Datensatz auf eine der bekannten Arten zu kategorisieren.
  • b) Schätzen Sie die Parameter des Datensatzes, wie z. B. die Anzahl der Zeilen, der Prädiktoren, die durchschnittliche Anzahl der Ebenen der Prädiktoren (wenn sie eine unterschiedliche Anzahl von Ebenen haben), und berechnen Sie auf der Grundlage dieser Daten die "optimale Anzahl" der Prädiktoren in der endgültigen Teilmenge.
  • c) Initialisieren Sie einen Vektor vom numerischen Typ mit der Länge der Anzahl der Eingangsvariablen der Menge, indem Sie Zufallszahlen verwenden, die gleichmäßig im Bereich [0, 1] verteilt sind, und weisen Sie die untere (0) und die obere (1) Grenze der Vektorwerte zu - das Argument der SA-Funktion.
  • d) Initialisieren Sie die Multi-Informations-Quantil-Bewertungsfunktion, die Quantil-Funktion der gegenseitigen Information und die Fitness-Funktion, die alle Berechnungen kombiniert.
  • e) Legen Sie die Anzahl der Monte-Carlo-Simulationen zur Schätzung der Quantile von MI und WI fest; legen Sie die Quantile (z. B. 0,9) für die Rauschwerte von MI und WI fest.
  • f) Legen Sie die Zeit oder die Anzahl der Iterationen des Algorithmus fest. Je mehr, desto besser.
  • g) Führen Sie den Algorithmus aus und warten Sie die Ergebnisse ab.


Punkt "b" bedarf der Klärung. Die optimale Anzahl der Variablen ist ein bedingter Wert, der anhand der Formel berechnet wird:

optim_var_num < - log(x = Stichprobenumfang / 100, base = round(mean_levels, 0))


Die Intuition ist, dass unter derAnnahme der Unabhängigkeit der Eingangsvariablen die durchschnittliche Anzahl der Ebenen einer Variablen auf die erforderliche Potenz erhöht werden muss, um eine Gesamtzahl eindeutiger interagierender Ebenen zu erhalten, so dass jede von ihnen im Durchschnitt mindestens n Beobachtungen konzentriert, wobei n als 100 angenommen wird.

Wir können nicht zu viele Inputvariablen mit zu vielen Niveaus haben, da eine vorsichtige Schätzung der Häufigkeit von Beobachtungen über die Inputniveaus zu klein wäre, um eine statistische Schlussfolgerung über die Abhängigkeit der Outputvariablen von der Menge der Inputniveaus zu ziehen.

Indem wir den Schwellenwert festlegen, bei dessen Überschreitung die Vektorwerte der Anzahl der Eingangsvariablen in 1 umgewandelt werden (das Kennzeichen für die Einbeziehung des Variablenindex), führen wir eine Wahrscheinlichkeitsberechnung durch:

Schwellenwert < - 1 - optim_var_num / predictor_number


Das Wesentliche ist, dass wir den maximalen Wahrscheinlichkeitswert festlegen, um die berechnete optimale Anzahl von Eingängen auszuwählen. Und diese Logik wird durch die Anwendung der Binomialverteilung überprüft.

Nehmen wir zum Beispiel unsere Daten: die Hälfte des gesamten Datensatzes, der für das Training verwendet wird.

Wir haben 17.973 Zeilen, 12 Prädiktoren, jeder mit 5 Stufen. Die Anwendung der obigen Formeln ergibt, dass die optimale Anzahl von Prädiktoren 3.226 beträgt.

Wendet man die Schwellenwertformel für die Aufnahme eines Prädiktors in den Satz an, erhält man 0,731.

Welche Anzahl ausgewählter Variablen ist bei einer Binomialverteilung am wahrscheinlichsten zu erhalten?


Die Höchstzahl beträgt 3 Beobachtungen. Um genau zu sein, würde 5 ^ 3.226 178 Stufen ergeben, die jeweils durchschnittlich 100 Beobachtungen umfassen würden.
 
Fortsetzung folgt. Der Wert 0 am Ausgang der Funktion ist der Worst-Case-Maximalwert. Wenn kein Element des Par-Vektors den Schwellenwert überschreitet, ist der Wert automatisch 0. Der bestmögliche Wert ist -1. Bedeutet, dass die Ausgabe aus der Teilmenge der Eingaben vollständig deterministisch ist.
 

Ja, ich habe eine Untergruppe von Prädiktoren mit einem negativen Fitnesswert gefunden. Es gab eine Menge Prädiktoren, mehrere Tausend, ich habe gensa auf nur 2 Iterationen beschränkt, dafür habe ich 8 Stunden gebraucht :). Das Ergebnis der Fitnessfunktion beträgt 6%. Beim Fronttest dieser Prädiktoren mit nnet habe ich 45% Fehler. Es ist nicht viel, ich glaube nicht, dass der EA im Gewinn sein würde. Ich habe wieder ein Limit von 10 Iterationen gesetzt, um ein besseres Ergebnis zu finden, habe es laufen lassen, warte seit 24 Stunden, hoffentlich wird gensa jemals fertig. Ich werde Genetics (GA-Bibliothek) ausprobieren müssen, es wird schneller mit mehreren Threads funktionieren (GA minimiert das Ergebnis, anstatt es zu maximieren, d.h. das Ergebnis der Fitnessfunktion für GA sollte sein Vorzeichen ändern). Ich werde weiter experimentieren.

Ich habe verschiedene Artikel über das Hauptkomponentenmodell gelesen und versucht, dem Modell nicht nur beizubringen, wie man R^2 misst und durch die Auswahl von Prädiktoren maximiert, sondern auch, wie man das Modell anhand von Fronttestdaten testet. Es kommt irgendwie zweideutig rüber. Einerseits habe ich den R^2 des Modells erhöht, indem ich korrelierte Paare von Prädiktoren entfernt habe (Funktion findCorrelation aus bibiloteka caret), aber wie sich herausstellte, sinkt der R^2 beim Testen des Modells auf den Fronttest-Daten. Das Wunder ist nicht geschehen, das PCA-Modell wird ebenfalls neu trainiert. Ich möchte eine komplexere Prädiktorenschätzung ausprobieren - die Trainingsstichprobe in zwei Teile aufteilen - für das eigentliche Training und für die Validierung, das PCA-Modell trainieren, dann sofort an der Validierungsstichprobe testen und das minimale R^2 als Endergebnis zurückgeben. Wenn eine solche Funktion für die Bewertung eines Satzes von Prädiktoren und die Maximierung dieses Wertes verwendet wird, dann werden nur die Sätze von Prädiktoren gefunden, die gute Ergebnisse auf den trainierten und neuen Daten liefern. Wir müssen das überprüfen.

Außerdem muss ich den Text des ersten Artikels über PKA in diesem Thread falsch verstanden haben. Es hieß, dass die Anzahl der Komponenten so gewählt werden muss, dass sie 95 % der Variation beschreiben. Ich dachte, es ginge um die Genauigkeit der Vorhersage der Zielvariablen. Das ist aber nicht der Fall, denn die Hauptkomponenten werden ganz ohne Zielvariablen konstruiert, und die 95%ige Genauigkeit ergibt sich daraus, wie genau die Rohdaten durch eben diese Komponenten beschrieben werden. Und die Vorhersagegenauigkeit hat damit überhaupt nichts zu tun.

 
Dr. Trader:

Ja, ich habe eine Untergruppe von Prädiktoren mit einem negativen Fitnesswert gefunden. Es gab eine Menge Prädiktoren, mehrere Tausend, ich habe gensa auf nur 2 Iterationen beschränkt, dafür habe ich 8 Stunden gebraucht :). Das Ergebnis der Fitnessfunktion beträgt 6%. Beim Fronttest dieser Prädiktoren mit nnet habe ich 45% Fehler. Es ist nicht viel, ich glaube nicht, dass der EA im Gewinn sein würde. Ich habe wieder ein Limit von 10 Iterationen gesetzt, um ein besseres Ergebnis zu finden, habe es laufen lassen, warte seit 24 Stunden, hoffentlich wird gensa jemals fertig. Ich werde Genetics (GA-Bibliothek) ausprobieren müssen, es wird schneller mit mehreren Threads funktionieren (GA minimiert das Ergebnis, anstatt es zu maximieren, d. h. das Ergebnis der Fitnessfunktion für GA sollte sein Vorzeichen ändern). Ich werde weiter experimentieren.

Ich habe verschiedene Artikel über das Hauptkomponentenmodell gelesen und versucht, das Modell nicht nur zu trainieren, um R^2 zu messen und durch die Auswahl von Prädiktoren zu maximieren, sondern auch, um das Modell wirklich an Fronttestdaten zu testen. Es kommt irgendwie zweideutig rüber. Einerseits habe ich den R^2 des Modells erhöht, indem ich korrelierte Paare von Prädiktoren entfernt habe (Funktion findCorrelation von bibiloteka caret), aber wie sich herausstellte, sinkt der R^2 beim Testen des Modells auf den Fronttest-Daten. Das Wunder ist nicht geschehen, das PCA-Modell wird ebenfalls neu trainiert. Ich möchte eine komplexere Prädiktorenschätzung ausprobieren - die Trainingsstichprobe in zwei Teile aufteilen - für das eigentliche Training und für die Validierung, das PCA-Modell trainieren, dann sofort an der Validierungsstichprobe testen und das minimale R^2 als Endergebnis zurückgeben. Wenn eine solche Funktion für die Bewertung eines Satzes von Prädiktoren und die Maximierung dieses Wertes verwendet wird, dann werden nur die Sätze von Prädiktoren gefunden, die gute Ergebnisse auf den trainierten und neuen Daten liefern. Wir werden das überprüfen müssen.

Außerdem muss ich den Text des ersten Artikels über PKA in diesem Thema falsch verstanden haben. Es hieß, dass die Anzahl der Komponenten so gewählt werden sollte, dass sie 95 % der Variation beschreiben. Ich dachte, es ginge um die Genauigkeit der Vorhersage der Zielvariablen. Das ist aber nicht der Fall, denn die Hauptkomponenten werden ganz ohne Zielvariablen konstruiert, und die 95%ige Genauigkeit ergibt sich daraus, wie genau die Rohdaten durch eben diese Komponenten beschrieben werden. Und die Vorhersagegenauigkeit hat damit überhaupt nichts zu tun.

Ja, es stellt sich heraus, dass Sie es nicht verstehen.

Die PCA kann als eigenständiges Instrument eingesetzt werden, aber darauf wird in dem Artikel nicht eingegangen.

Es wird erörtert, wie das Rauschen aus einem großen Satz von Prädiktoren herausgefiltert werden kann.

Nach meinem Verständnis geschieht dies in folgenden Schritten:

1. Y-bewusst. Dies ist die Skalierung der Prädiktoren in Abhängigkeit von der Zielvariablen

2. Mit Hilfe des PCA-Algorithmus wird ein Satz von Prädiktoren geordnet und der Teil ausgewählt, der 95 % der Varianz erklärt.

2. oder so (ich habe es selbst noch nicht herausgefunden): Mit Hilfe des PCA-Algorithmus wird ein neuer Satz von Prädiktoren erstellt, indem der ursprüngliche Satz mit den berechneten Koeffizienten (Ladung) multipliziert wird. Dieses Set ist bestellt. Wir nehmen so viele dieser neuen Vektoren, dass sie 95 % der Varianz erklären.

PS.

Gehen wir zu den Veröffentlichungen, die Y-aware ist der neue Peep im Bereich der Rauschvorhersagefilterung.

Erfolg

 
SanSanych Fomenko:

2. Mit Hilfe des PCA-Algorithmus wird die Menge der Prädiktoren geordnet und der Teil, der 95 % der Varianz erklärt, ausgewählt.

Das habe ich noch nicht herausgefunden. (Ich werde jetzt nur über den y-bewussten Ansatz schreiben, um ihn nicht mit dem anderen Ansatz zu verwechseln). Der Artikel selbst ist hier zu finden:http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Nach dem Code"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" gibt es eine Situation: Daten werden gelesen, mit Y skaliert, PC-Komponenten werden erstellt. Diese Funktion schränkt die Anzahl der Komponenten nicht ein - so viele, wie es Prädiktoren gibt. Als erstes sollte nur ein Teil davon ausgewählt werden (es wird empfohlen, 95 % der Varianten zu beschreiben). Im Artikel selbst sah sich der Autor das sdev-Diagramm (einige nicht spezifizierte Varianzen) für die Komponenten an und sagte, dass 2 oder 5 ausreichen würden, weil sie im Diagramm hervorstechen. Irgendwie sticht nichts hervor, die Kurve ist gleichmäßig abnehmend.

Es gibt eine sdev-Tabelle, deren Anzahl der Einträge der Anzahl der Komponenten entspricht. Ist es möglich zu berechnen, wie viele Komponenten daraus zu entnehmen sind? Die Summe aller Zahlen ist nicht notwendigerweise auf 1 beschränkt, ich habe eine Summe von 6 gesehen, und wahrscheinlich mehr.

> princ$sdev
[1] 0.17585066 0.15322845 0.13818021 0.13090573 0.12177070 0.11854969
[7] 0.11176954 0.10910302 0.10616631 0.10265987 0.10056754 0.09441041
[13] 0.09343688 0.08832101 0.08620753 0.08235531 0.08132748 0.07992235
[19] 0.07800569 0.07575063 0.07463254 0.07311194 0.07210698 0.07032990
[25] 0.06907964 0.06763711 0.06634935 0.06544930 0.06451703 0.06260861
 
Dr. Trader:

Das habe ich noch nicht herausgefunden. (Ich werde jetzt nur über den y-bewussten Ansatz schreiben, um ihn nicht mit dem anderen Ansatz zu verwechseln). Der Artikel selbst ist hier zu finden:http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Nach dem Code"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" haben wir folgende Situation: Daten werden gelesen, nach Y skaliert, PC-Komponenten werden konstruiert. Diese Funktion schränkt die Anzahl der Komponenten nicht ein - so viele, wie es Prädiktoren gibt. Als erstes sollte nur ein Teil davon ausgewählt werden (es wird empfohlen, 95 % der Varianten zu beschreiben). Im Artikel selbst sah sich der Autor das sdev-Diagramm (einige nicht spezifizierte Varianzen) für die Komponenten an und sagte, dass 2 oder 5 ausreichen würden, weil sie im Diagramm hervorstechen. Irgendwie sticht nichts hervor, die Kurve ist gleichmäßig abnehmend.

Es gibt eine sdev-Tabelle, deren Anzahl der Einträge der Anzahl der Komponenten entspricht. Ist es möglich zu berechnen, wie viele Komponenten daraus zu entnehmen sind? Die Summe aller Zahlen ist nicht notwendigerweise auf 1 beschränkt, ich habe eine Summe von 6 gesehen, und wahrscheinlich mehr.

Ich lasse Rattle laufen und bekomme drei Tische:

  • Standardabweichungen: hier kann man alle möglichen Werte haben und sagen, dass die Summe = 1 nicht notwendig ist
  • Drehung: dies sind die Koeffizienten, mit denen die ursprünglichen Vektoren multipliziert werden müssen, um die neuen zu erhalten
  • Bedeutung der Komponenten. was diskutiert wird

In der letzten Spalte steht in der ersten Spalte, dass, wenn man nur PC1 nimmt, dies 0,9761 der Variabilität (kumulativer Anteil) erklärt, wenn man ZWEI Komponenten - PC1 und PC2 - nimmt, erklärt dies 0,99996 usw.

(Ich weiß nicht, wie man Tabellen einfügt)

Die Bedeutung der Komponenten:

PC1 PC2 PC3 PC4 PC5

Standardabweichung 2,2092 0,34555 0,01057 0,008382 0,004236

Anteil der Varianz 0,9761 0,02388 0,00002 0,000010 0,000000

Kumulierter Anteil 0,9761 0,99996 0,99998 1,000000 1,000000

 

Ich habe lange nach dieser Tabelle gesucht und sie schließlich in der Zusammenfassung gefunden. Eigentlich der naheliegendste Ort :) Danke, dass Sie es gezeigt haben. Dies ist der Fall, wenn etwas in der Zusammenfassung steht, aber nicht in den Objektattributen.

summary(princ)$importance[3,]

Es stellt sich heraus, dass dieser Artikel eine Fortsetzung hat, die genau der Frage der Komponentenauswahl gewidmet ist, mit einer speziellen Lösung für Y-aware. Ich habe es noch nicht ausprobiert.

http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/

 
Dr. Trader:

Ich habe lange nach dieser Tabelle gesucht und sie schließlich in der Zusammenfassung gefunden. Eigentlich der naheliegendste Ort :) Danke, dass Sie es gezeigt haben. Dies ist der Fall, wenn etwas in der Zusammenfassung steht, aber nicht in den Objektattributen.

Es stellt sich heraus, dass dieser Artikel eine Fortsetzung hat, die genau der Frage der Komponentenauswahl gewidmet ist, mit einer speziellen Lösung für Y-aware. Ich habe es noch nicht ausprobiert.

http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/

In diesem R, sobald Sie ein Objekt erhalten, setzen Sie str und Zusammenfassung auf sie, und auch plotten. Man kann eine Menge erstaunlicher Dinge sehen. Der Punkt ist, dass die "Objekt"-Sache in R viel komplizierter ist als in vielen anderen Programmiersprachen.
 
Dr. Trader:

Ja, ich habe eine Untergruppe von Prädiktoren mit einem negativen Fitnesswert gefunden. Es gab eine Menge Prädiktoren, mehrere Tausend, ich habe gensa auf nur 2 Iterationen beschränkt, dafür habe ich 8 Stunden gebraucht :). Das Ergebnis der Fitnessfunktion beträgt 6%. Beim Fronttest dieser Prädiktoren mit nnet habe ich 45% Fehler. Es ist nicht viel, ich glaube nicht, dass der EA im Gewinn sein würde. Ich habe wieder ein Limit von 10 Iterationen gesetzt, um ein besseres Ergebnis zu finden, habe es laufen lassen, warte seit 24 Stunden, hoffentlich wird gensa jemals fertig. Ich werde Genetics (GA-Bibliothek) ausprobieren müssen, es wird schneller mit mehreren Threads funktionieren (GA minimiert das Ergebnis, anstatt es zu maximieren, d. h. das Ergebnis der Fitnessfunktion für GA sollte sein Vorzeichen ändern). Ich werde weiter experimentieren.

Ich habe verschiedene Artikel über das Hauptkomponentenmodell gelesen, und nun habe ich versucht, das Modell nicht nur zu trainieren, um R^2 zu messen und durch die Auswahl von Prädiktoren zu maximieren, sondern das Modell auch wirklich an Fronttestdaten zu testen. Es kommt irgendwie zweideutig rüber. Einerseits habe ich den R^2 des Modells erhöht, indem ich korrelierte Paare von Prädiktoren entfernt habe (Funktion findCorrelation von bibiloteka caret), aber wie sich herausstellte, sinkt der R^2 beim Testen des Modells auf den Fronttest-Daten. Das Wunder ist nicht geschehen, das PCA-Modell wird ebenfalls neu trainiert. Ich möchte eine komplexere Prädiktorenschätzung ausprobieren - die Trainingsstichprobe in zwei Teile aufteilen - für das eigentliche Training und für die Validierung, das PCA-Modell trainieren, dann sofort an der Validierungsstichprobe testen und das minimale R^2 als Endergebnis zurückgeben. Wenn eine solche Funktion für die Bewertung eines Satzes von Prädiktoren und die Maximierung dieses Wertes verwendet wird, dann werden nur die Sätze von Prädiktoren gefunden, die gute Ergebnisse auf den trainierten und neuen Daten liefern. Wir werden das überprüfen müssen.

Außerdem muss ich den Text des ersten Artikels über PKA in diesem Thema falsch verstanden haben. Dort wurde gesagt, dass die Anzahl der Komponenten so gewählt werden sollte, dass sie 95 % der Variation beschreiben, ich dachte, es ginge um die Genauigkeit der Vorhersage der Zielvariablen. Das ist aber nicht der Fall, denn die Hauptkomponenten werden ganz ohne Zielvariablen konstruiert, und die 95%ige Genauigkeit ergibt sich daraus, wie genau die Rohdaten durch eben diese Komponenten beschrieben werden. Und die Vorhersagegenauigkeit hat damit überhaupt nichts zu tun.

Ich bin mir nicht ganz sicher, warum es so lange dauert. Wie viele optim_var_number haben Sie erhalten? Sie sollte innerhalb von 10 liegen. Stellen Sie es auf 1200 Sekunden ein und es sollte schon etwas sein.