English Русский 日本語 Português
preview
Quantisierung beim maschinellen Lernen (Teil 1): Theorie, Beispielcode, Analyse der Implementierung in CatBoost

Quantisierung beim maschinellen Lernen (Teil 1): Theorie, Beispielcode, Analyse der Implementierung in CatBoost

MetaTrader 5Maschinelles Lernen | 8 März 2024, 14:41
161 0
Aleksey Vyazmikin
Aleksey Vyazmikin

Einführung

Der Artikel befasst sich mit der theoretischen Anwendung der Quantisierung bei der Konstruktion von Baummodellen Es werden keine komplexen mathematischen Gleichungen verwendet. Beim Verfassen des Artikels habe ich festgestellt, dass es in den wissenschaftlichen Werken verschiedener Autoren keine einheitliche Terminologie gibt, sodass ich die Terminologie wählen werde, die meiner Meinung nach die Bedeutung am besten wiedergibt. Außerdem werde ich in den Fragen, die von anderen Forschern nicht behandelt werden, meine eigenen Begriffe verwenden. In diesem Artikel werden Begriffe und Konzepte verwendet, die ich zuvor in dem Artikel „Der Algorithmus CatBoost von Yandex für das maschinelle Lernen, Kenntnisse von Python- oder R sind nicht erforderlich“ beschrieben habe. Daher empfehle ich Ihnen, sich vor der Lektüre des vorliegenden Artikels mit ihm vertraut zu machen.

In diesem Artikel wird nicht auf die Möglichkeit eingegangen, die Quantisierung auf trainierte neuronale Netze anzuwenden, um deren Größe zu verringern, da ich derzeit keine persönlichen Erfahrungen auf diesem Gebiet habe.

Das können Sie erwarten: 

  • Der erste Teil des Artikels enthält einführendes theoretisches Material über die Quantisierung, das für das Verständnis der Ziele und des Wesens des Prozesses nützlich sein wird.
  • Im zweiten Teil des Artikels wird die einheitliche Quantisierungsmethode am Beispiel des MQL5-Codes erläutert.
  • Im dritten Teil des Artikels werde ich die Implementierung des Quantisierungsprozesses am Beispiel von CatBoost betrachten.

 

1. Standardanwendungen

Was also ist Quantisierung und warum wird sie verwendet? Lassen Sie es uns herausfinden!

Lassen Sie uns zunächst ein wenig über die Daten sprechen. Um also Modelle zu erstellen (zu trainieren), benötigen wir Daten, die gewissenhaft in der Tabelle gesammelt werden. Die Quelle solcher Daten kann jede Information sein, die das (vom Modell ermittelte) Ziel erklären kann, z. B. ein Handelssignal. Die Datenquellen werden unterschiedlich bezeichnet - Prädiktoren, Merkmale, Attribute oder Faktoren. Die Häufigkeit des Auftretens einer Datenzeile wird durch das Auftreten einer vergleichbaren Prozessbeobachtung des Phänomens bestimmt, über das Informationen gesammelt werden und das mit Hilfe des maschinellen Lernens untersucht werden soll. Die Gesamtheit der gewonnenen Daten wird als Stichprobe bezeichnet.

Eine Stichprobe kann repräsentativ sein - das heißt, die in ihr aufgezeichneten Beobachtungen beschreiben den gesamten Prozess des untersuchten Phänomens - oder sie kann nicht repräsentativ sein, wenn sie so viele Daten enthält, wie gesammelt werden konnten, was nur eine teilweise Beschreibung des Prozesses des untersuchten Phänomens ermöglicht. Wenn wir uns mit Finanzmärkten beschäftigen, haben wir es in der Regel mit nicht repräsentativen Stichproben zu tun, da alles, was passieren könnte, noch nicht geschehen ist. Aus diesem Grund wissen wir nicht, wie sich das Finanzinstrument bei neuen (bisher nicht eingetretenen) Ereignissen verhalten wird. Doch jeder kennt die Weisheit „Geschichte wiederholt sich“. Auf diese Beobachtung stützt sich der algorithmische Händler bei seinen Recherchen, in der Hoffnung, dass unter den neuen Ereignissen auch solche sind, die den vorherigen ähnlich sind und deren Ergebnis mit der ermittelten Wahrscheinlichkeit übereinstimmt.

Die numerischen Indikatoren der Prädiktoren können je nach ihrem logischen Inhalt (gemäß der Messskala) sein:

  • Binär - bestätigen oder widerlegen das Vorhandensein eines bestimmten Attributs des beobachteten Phänomens.
  • Quantitativ (metrische Skala) - beschreibt ein Phänomen mit einer Art Messindikator, z. B. Geschwindigkeit, Koordinaten von etwas, eine Größe, die verstrichene Zeit seit Beginn eines Ereignisses und viele andere Eigenschaften, die gemessen werden können, einschließlich deren Ableitungen.
  • Kategorisch (Nominalskala) - Signale über verschiedene beobachtbare Objekte oder Phänomene, die in einer logischen Gruppe enthalten sind, in der Regel als ganze Zahl ausgedrückt. Zum Beispiel die Wochentage, die Richtung des Preistrends, die Seriennummer des Unterstützungs- oder Widerstandsniveaus.
  • Rang (Ordinalskala) - charakterisiert den Grad der Überlegenheit oder Ordnung einer Sache. Sie werden nur selten einer eigenen Gruppe zugeordnet, da sie je nach Kontext und Logik auch anderen Arten von Indikatoren zugeordnet werden können. Dazu gehören zum Beispiel die Reihenfolge der Aktionen, das Ergebnis eines Experiments in Form einer Bewertung des Ergebnisses im Vergleich zu anderen ähnlichen Experimenten.

Die Stichprobe enthält also verschiedene Prädiktoren mit ihren eigenen numerischen Indikatoren, und diese Daten beschreiben in ihrer Gesamtheit das beobachtete Phänomen, dessen Merkmale oder Art in der Zielfunktion (im Folgenden als Zielfunktion bezeichnet) beschrieben werden. Die Zielfunktion in der Stichprobe kann entweder ein numerischer Indikator oder ein kategorischer Indikator sein. Im weiteren Verlauf des Textes werde ich eine kategoriale und in größerem Maße eine binäre Zielfunktion betrachten.

Wikipedia bietet folgende Definition:

Die Quantisierung ist in der digitalen Signalverarbeitung eine Abbildung, die bei der Digitalisierung von Analogsignalen und zur Komprimierung von Bildern und Videos verwendet wird. Die dabei entstehende Abweichung wird Quantisierungsabweichung genannt. Eine elektronische Komponente oder eine Funktion, die diese Abbildung eines Wertes oder eines Signals ausführt, heißt Quantisierer. Der Signalwert kann je nach Kodierungsmethode entweder auf den nächstliegenden Pegel oder auf den niedrigeren bzw. höheren der nächstliegenden Pegel gerundet werden. Diese Quantisierung wird als skalar bezeichnet. Es gibt auch die Vektorquantisierung — die Aufteilung des Raums der möglichen Werte einer Vektorgröße in eine endliche Anzahl von Regionen und die Ersetzung dieser Werte durch die Kennung einer dieser Regionen. 

 Mir gefällt die kürzere Definition:

Die Datenquantisierung ist eine Methode zur Komprimierung (Kodierung) von Beobachtungsinformationen mit einem akzeptablen Verlust an Genauigkeit in der Messskala. Die Komprimierung (Kodierung) impliziert die Diskretion von Objekten, was deren Gleichartigkeit und Homogenität oder einfach Ähnlichkeit voraussetzt. Das Ähnlichkeitskriterium kann je nach dem gewählten Algorithmus und der darin enthaltenen Logik unterschiedlich sein.

Die Datenquantisierung wird überall eingesetzt, insbesondere bei der Umwandlung eines analogen in ein digitales Signal sowie bei der anschließenden Komprimierung des digitalen Signals. Beispielsweise können die von der Kameramatrix empfangenen Daten als Rohdatei aufgezeichnet und dann sofort (oder später auf einem Computer) in ein jpg-Format oder ein anderes geeignetes Datenspeicherformat komprimiert werden.

Betrachtet man die grafische Darstellung der Daten in Form von Kerzen oder Balken im MetaTrader 5-Terminal, so sieht man bereits das Ergebnis der Arbeit der Quantisierung der Ticks auf der von uns gewählten Zeitskala. Die Quantisierung eines kontinuierlichen Datenstroms über die Zeit wird gewöhnlich als Abtastung (oder Diskretisierung) bezeichnet.

Unter Stichprobenbildung versteht man in der Regel die Erfassung von Beobachtungsmerkmalen mit einer bestimmten Häufigkeit über einen bestimmten Zeitraum. Wenn wir jedoch davon ausgehen, dass dies die Häufigkeit ist, mit der Daten in einer Stichprobe erhoben werden, dann sollte die Definition wie folgt angepasst werden: „Sampling ist der Prozess der Aufzeichnung von Beobachtungsmerkmalen, deren Häufigkeit durch eine bestimmte Funktion während ihrer Schwellenwertaktivierung bestimmt wird“. Unter einer Funktion ist hier jeder Algorithmus zu verstehen, der gemäß seiner eigenen Logik ein Signal zum Empfang von Daten gibt. Im MetaTrader 5 sehen wir zum Beispiel genau diesen Ansatz, denn an handelsfreien Tagen wird der Schlusskurs nicht als ein über die Zeit andauernder Prozess wiederholt, sondern es gibt einfach keine Informationen auf dem Chart, d.h. die Abtastrate sinkt auf Null.

Ein einfaches Beispiel für einen Quantisierungsalgorithmus ist die Erstellung eines Histogramms. Der Algorithmus für diese Methode ist recht einfach:

  • Ermittle Maximum und Minimum des Indikators (in unserem Fall des Prädiktors).
  • Berechne die Differenz zwischen dem Maximum und Minimum des Indikators.
  • Teile das sich ergebende Delta aus Punkt 2 durch eine ganze Zahl, z. B. zehn, oder, je nach Anzahl der Beobachtungen (wie von Karl Pearson empfohlen). Ermittle den Teilungsschritt in den ursprünglichen Maßeinheiten, der die Ablesung der neuen Messskala sein wird.
  • Jetzt müssen wir unsere eigene Skala mit unseren eigenen Abteilungen aufbauen. Dies geschieht einfach durch Multiplikation des Schrittes mit der laufenden Nummer der Ablesung.
  • Anschließend wird jeder Beobachtungswert dem Bereich einer neuen Messskala zugeordnet, und die Anzahl der Beobachtungen in jedem Bereich wird separat summiert.

Das Ergebnis des Algorithmus ist das in Abbildung 1 dargestellte Histogramm.

 

Abbildung 1

Das Histogramm zeigt, wie die Daten nach der neuen Messskala verteilt sind. Anhand des Erscheinungsbildes der Verteilung kann man mit Hilfe der deskriptiven Statistik auf die Art der Verteilungsdichte schließen, was für die Wahl einer endlichen Quantisierungsmethode nützlich sein kann. Über die Verteilungsdichte können Sie in den folgenden Artikeln lesen:

Was wir also durch die Erstellung eines Histogramms erhalten haben:

  • Ebenen (Cutoffs) oder Grenzen, die die Daten in Gruppen unterteilen. Ein Satz von Ebenen wird als Quantengitter oder Wörterbuch bezeichnet - auf diesen Ebenen erfolgt die Kodierung der Daten, was ihre Gruppierung und Komprimierung gewährleistet. Die Grenzen können nach verschiedenen, in den Quantisierungsalgorithmus eingebetteten Regeln festgelegt werden. Die Ebenen (Cutoffs) bilden eine neue Skala zur Messung von Beobachtungsindikatoren. Ich bin es gewohnt, den Bereich zwischen zwei Niveaus als „Quantensegment“ zu bezeichnen, obwohl sich in den Werken anderer Autoren andere Bezeichnungen finden — „Intervall“, „Bereich“ oder „Quantisierungsschritt“;
  • Die Zugehörigkeit der einzelnen Beobachtungswerte (Indikatoren) zu einer bestimmten Gruppe (Histogrammspalte). Bei der Quantisierung handelt es sich um die Arbeit eines Kompressionsalgorithmus, dessen Wesen darin besteht, die ursprünglichen Daten in dem Moment in komprimierte Daten umzuwandeln, in dem der Beobachtungswert einem bestimmten Bereich des Quantengitters zugewiesen wird. Das Ergebnis der Komprimierung können verschiedene numerische Transformationen des Variablenwerts sein. Zwei Optionen kommen am häufigsten vor: die erste ist die Transformation, bei der einer Variablen ein Rang (Index) entsprechend der Zahl des Bereichs zwischen den Werten der Cutoffs (Grenzen) zugewiesen wird, in den die Zahl fällt, und die zweite Option ist die Zuweisung eines Niveauskalenwerts zu der Variablen, z. B. wenn der numerische Wert einer Beobachtung in den Bereich zwischen 1,2 und 1,4 fällt, dann wird der richtige Wert zugewiesen - 1,4. Um die zweite Option zu nutzen, müssen wir jedoch Grenzen festlegen, über die die Daten nicht hinausgehen, während die erste Option es Ihnen erlaubt, mit beliebigen Werten außerhalb der Grenzen der Quantentabelle zu arbeiten. Bei der zweiten Option könnte eine gute Lösung darin bestehen, die Hinzufügung von Ebenen (Rändern/Grenzen) in einem beträchtlichen Abstand zu erzwingen, sodass Fehler in Form von Spitzen oder fehlenden Daten dort platziert werden können.
  • Die Fähigkeit, jeden Zahlenwert mit Verlust an Genauigkeit wiederherzustellen (Dequantisierung), was auf folgende Weise geschehen kann:
  • - Entlang der Mitte des Intervalls, das dem Index der Zahl entspricht.
  • - Durch den linken oder rechten Pegelwert (Begrenzung/Abschneidung/Rand) des Intervalls, meistens den rechten. Da die Grenzen in der Quantisierungstabelle in der Regel für das erste und das letzte Intervall nicht definiert sind, können wir den durchschnittlichen Bereich der Intervalle oder den ersten und den letzten Wert der Intervallbreite verwenden, um sie zu bestimmen.

Je nach Aufgabe und Anwendungsgebiet der Quantisierung hat man es mit unterschiedlichen Bezeichnungen der Variablen und der Schreibweise der Gleichungen zu tun, was das Verständnis des Wesens des Algorithmus erschwert, da der Autor, der sie beschreibt, Kenntnisse aus dem spezifischen Anwendungsgebiet des Algorithmus voraussetzt. Das Wesen der verschiedenen Algorithmen besteht darin, dass sie unterschiedliche Niveaus (Cutoffs) konstruieren. Ich schlage daher vor, sie nach einer Reihe von Kriterien zu klassifizieren.

Quantisierung mit konstantem Intervall:

  • Einteilung in feste Intervalle nach einer dem Pearson-Histogramm ähnlichen Methode;
  • Umrechnung zur Verringerung der Ziffern einer Zahl.

Variable Intervallquantisierung:

  • Kumulierung eines festen Prozentsatzes von Beobachtungen für jedes Intervall.
  • Verwendung eines festen Wertes für die Fläche unter der Kurve einer theoretischen oder approximativen Verteilung.
  • Verwendung einer bestimmten Funktion, die den Quantisierungsschritt in Abhängigkeit vom Koeffizienten ändert. Dabei handelt es sich oft um Funktionen, die den Abstand zum Rand oder zur Mitte hin vergrößern.
  • Verwendung von Gewichtungskoeffizienten, die das Intervall in Abhängigkeit von der Dichte der Werte beeinflussen.
  • Iterative Methoden (einschließlich adaptiver Methoden). Die Informationen über die Datenstruktur werden verwendet, um die Grenzen zu konfigurieren, und es werden Maßnahmen ergriffen, um den Fehler zu verringern.
  • Andere Methoden.

Quantisierung mit einem empirisch ermittelten Intervall:

  • Zahlenfolgen;
  • Kenntnisse über die Art der Beobachtung, die es ermöglichen, Indikatoren mit ähnlicher Bedeutung zu gruppieren;
  • Manuelle Markierung.

Die Verringerung des Quantisierungsfehlers in der gewählten Metrik kann ein iterativer Prozess sein, oder sie kann einmalig anhand einer vorgegebenen Gleichung berechnet werden. Zur Bewertung des Ergebnisses ist es zweckmäßig, den durchschnittlichen Prozentsatz der Fehlerspanne in Bezug auf den gesamten Bereich der Zahlen zu verwenden, die den Wert des Prädiktors in der Stichprobe annehmen.

 

2. Implementierung eines Quantisierungsalgorithmus in MQL5

Zuvor haben wir uns ein einfaches Beispiel für die Funktionsweise der Quantisierung angesehen, bei dem jedoch einer der Schritte fehlt, die häufig bei der Quantisierung verwendet werden, nämlich die Neuaufteilung der nach einigen Berechnungen erhaltenen Skala, um den Durchschnittswert des Intervalls zu finden, der oft als Schwerpunkt bezeichnet wird. Das Intervall für die Quantisierung wird schließlich durch die Hälfte des Abstands zwischen den Grenzen zweier nahe beieinander liegender Zentroide bestimmt.

Betrachten wir eine schrittweise Quantisierung von reellen Zahlen wie double, die 8 Bytes im Speicher belegen, in den gesamten Datentyp uchar, der nur 8 Bits belegt:

  • 1. Suche nach dem Maximum und Minimum in den Eingabedaten:
  • 1.1. Ermittele der Höchst- und Mindestwerte - Max- und Min-Variable im Array arr_In_Data.
  • 2. Berechne die Fenstergröße zwischen den Intervallen:
  • 2.1. Ermittele die Differenz zwischen dem Maximum und dem Minimum und speichere sie in der Variablen Delta.
  • 2.2. Ermittele die Größe eines Fensters Delta/nQ, wobei nQ die Anzahl der Separatoren (Ränder) ist, und speichere das Ergebnis in der Variablen Interval_Size.
  • 3. Durchführen von Quantisierung und Fehlerberechnung:
  • 3.1. Verschiebe den Mindestwerts der Eingangsdaten auf Null arr_In_Data-Min.
  • 3.2. Teile das Ergebnis von Punkt 3.1 durch die Anzahl der Intervalle von Interval_Size, die um eins größer ist als die Anzahl der Separatoren.
  • 3.3. Nun sollten wir die Funktion „round“, die die Zahl auf die nächste ganze Zahl rundet, auf das in 3.2 erhaltene Ergebnis anwenden. Das Ergebnis wird in dem Array arr_Output_Q_Interval gespeichert.
  • 3.4. Multipliziere den Wert aus dem Array arr_Output_Q_Interval mit Interval_Size und addiere das Minimum. Jetzt haben wir den umgewandelten (quantisierten) Wert der Zahl, den wir in dem Array arr_Output_Q_Data speichern werden.
  • 3.5. Berechne den Fehler als kumulierte Summe. Dazu wird die absolute Differenz zwischen dem Originalwert und dem durch die Quantisierung erhaltenen Wert durch den Bereich geteilt. Teile die resultierende Summe durch die Anzahl der Elemente im Array arr_In_Data.
  • 4. Speichere die Separatoren (Ränder) in das Array arr_Output_Q_Book:
  • 4.1. Für das erste Intervall nehmen wir eine Änderung vor - wir fügen die Hälfte der Größe des Intervalls (Interval_Size) zum Mindestwert (Min) hinzu.
  • 4.2. Nachfolgende Intervalle werden berechnet, indem der Intervallwert zu dem Wert des Arrays arr_Output_Q_Book des vorherigen Schritts addiert wird.

Nachfolgend finden Sie ein Beispiel für einen Funktionscode mit der Beschreibung von Variablen und Arrays.

/+---------------------------------------------------------------------------------+
//|Quantization of transformation (encoding) type to a given integer bitness
//+---------------------------------------------------------------------------------+
double Q_Bit(
   double &arr_Input_Data[],//Quantization data array
   int &arr_Output_Q_Interval[],//Outgoing array with intervals containing data 
   double &arr_Output_Q_Data[],//Outgoing array with restored values of the original data 
   float &arr_Output_Q_Book[],//Outgoing array - "Book with boundaries" or "Quantization table"
   int N_Intervals=2,//Number of intervals the original data should be divided (quantized) into
   bool Use_Max_Min=false,//Use/do not use incoming maximum and minimum values
   double Min_arr=0.0,//Maximum value
   double Max_arr=100.0//Minimum value
)
{
   if(N_Intervals<2)return -1;//There may be at least two intervals, in this case, there is one separator
//---0. Initialize the variables and copy the arr_Input_Data array
   double arr_In_Data[];
   double Max=0.0;//Maximum
   double Min=0.0;//Minimum
   int Index_Max=0;//Maximum index in the array
   int Index_Min=0;//Minimum index in the array
   double Delta=0.0;//Difference between maximum and minimum
   int   nQ=0;//Number of separators (borders)
   double Interval_Size=0.0;//Interval size
   int Size_arr_In_Data=0;//arr_In_Data array size
   double Summ_Error=0.0;//To calculate error/data loss
   nQ=N_Intervals-1;//Number of separators
   Size_arr_In_Data=ArrayCopy(arr_In_Data,arr_Input_Data,0,0,WHOLE_ARRAY);
   ArrayResize(arr_Output_Q_Interval,Size_arr_In_Data);
   ArrayResize(arr_Output_Q_Data,Size_arr_In_Data);
   ArrayResize(arr_Output_Q_Book,nQ);

//---1. Finding the maximum and minimum in the input data
   if(Use_Max_Min==false)//If enforced array limits are not used
   {
      Index_Max=ArrayMaximum(arr_In_Data,0,WHOLE_ARRAY);
      Index_Min=ArrayMinimum(arr_In_Data,0,WHOLE_ARRAY);
      Max=arr_In_Data[Index_Max];
      Min=arr_In_Data[Index_Min];
   }

   else//Otherwise enforce the maximum and minimum 
   {
      Max=Max_arr;
      Min=Min_arr;
   }

//---2. Calculate the window size between intervals
   Delta=Max-Min;//Difference between maximum and minimum 
   Interval_Size=Delta/nQ;//Size of one window

//---3. Perform quantization and error calculation
   for(int i=0; i<Size_arr_In_Data; i++)
   {
      arr_Output_Q_Interval[i]=(int)round((arr_In_Data[i]-Min)/Interval_Size);
      arr_Output_Q_Data[i]=arr_Output_Q_Interval[i]*Interval_Size+Min;
      Summ_Error=Summ_Error+(MathAbs(arr_Output_Q_Data[i]-arr_In_Data[i]))/Delta;
   }
//---4. Save separators (borders) into the array
   for(int i=0; i<nQ; i++)
   {
      switch(i)
      {
      case 0:
         arr_Output_Q_Book[i]=float(Min+Interval_Size*0.5);
         break;
      default:
         arr_Output_Q_Book[i]=float(arr_Output_Q_Book[i-1]+Interval_Size);
         break;
      }
   }
   return Summ_Error=Summ_Error/(double)Size_arr_In_Data*100.0;
} 

Praktische Anwendung der Datenquantisierung:

  • Verringerung des Speicherbedarfs für die Speicherung und Verarbeitung von Daten. Dieser Effekt wird dadurch erreicht, dass es ausreicht, nur den Index des Quantensegments zu speichern, in das der numerische Wert der Indikatornummer fällt. In diesem Fall ist es sinnvoll, den Datentyp von real double oder float auf ganzzahlige Typen wie int oder sogar uchar zu ändern.
  • Beschleunigung der Berechnungen. Erreicht wird dies durch die Arbeit mit ganzen Zahlen und die Verringerung der Menge der verwendeten Zahlen, wodurch sich die Anzahl der Zyklen in den Algorithmen verringert.
  • Rauschunterdrückung. Die Qualität der Quelldaten kann Rauschen in Form von Messfehlern enthalten, sowohl in Form von primären Datenverlusten des Brokers als auch in Form von Verzögerungen, Rundungen und Messfehlern. Durch die Quantisierung wird der Indikator im Bereich des Quantensegments gemittelt, wodurch dieses Rauschen geglättet wird und das Modell sich nicht darauf konzentrieren kann.
  • Ausgleich für das Fehlen von Nahbeobachtungswerten. Manchmal ist ein Prädiktorwert aufgrund eines Mangels an Beobachtungen sehr selten und kann nicht als Spike betrachtet werden. Die Quantisierung kann solchen Beobachtungen einen ausreichenden Wertebereich verleihen, um das Modell für neue Daten, die nicht in der Stichprobe enthalten waren, nutzbar zu machen.
  • Kampf gegen den Fluch der Dimensionalität. Durch die Verringerung der Anzahl möglicher Kombinationen wird das Raster der möglichen Koordinaten der Messräume verkleinert, was die Ausbildung beschleunigt und verbessert.

Anhand von zwei Beispielen wurden zwei wichtige Quantisierungsstrategien vorgestellt:

  • Strategie der Datenannäherung.
  • Strategie der Datenaggregation.

Die erste Art von Strategie eignet sich am besten für metrische Skalen, die Indikatoren messen, deren Verteilung der Merkmalswerte einer kontinuierlichen Verteilung nahe kommt. Theoretisch gilt: Je mehr Intervalle den Wertebereich trennen, desto besser, da der Fehler in der Streuung des rekonstruierten Wertes über den gesamten Bereich der Zahlenreihe kleiner ist. Dieser Typ eignet sich gut für die Wiederherstellung mathematischer Funktionen.

Die zweite Art von Strategie zielt auf die Gruppierung von Daten ab. Man kann sich vorstellen, dass verallgemeinerte kategoriale Werte von Merkmalen erstellt werden, und hier ist die Aufgabe, die Grenzen richtig zu schätzen, viel schwieriger. Meiner Erfahrung nach müssen wir sicherstellen, dass mindestens 5 % der Beobachtungen aus der Stichprobe in das Intervall fallen.

Es ist anzumerken, dass die Merkmale, die bereits eine kategorische Bedeutung haben, ohne jegliche Konventionen, sehr sorgfältig quantifiziert werden sollten, indem nur die wirklich ähnlichen Merkmale kombiniert werden. Außerdem bedeutet Ähnlichkeit hier die Ähnlichkeit der Stichprobe, wenn sie in Teilstichproben unterteilt wird.

Dem Artikel ist das Skript „Q_Trans“ beigefügt, das als Beispiel für den Quantisierungsprozess dient. Die Daten für die Quantisierung werden nach dem Zufallsprinzip erzeugt. Das Skript enthält die folgenden Hauptfunktionen:

  • „Q_Bit“ - zur Quantisierung der Umwandlungsart (Kodierung) auf eine bestimmte ganzzahlige Bittiefe.
  • „Book_to_cifra“ - der Decoder stellt den ungefähren Wert einer Zahl aus der Quantisierungstabelle wieder her, ein Array mit Indizes ist erforderlich.
  • „Book_to_cifra_v2“ - der Decoder stellt den ungefähren Wert einer Zahl aus der Quantisierungstabelle wieder her, ein Array mit Indizes ist nicht erforderlich.
  • „Q_Random“ - zur Quantisierung mit zufälligen Grenzen.

Das Skript enthält die folgenden Einstellungen:

  • Die Anzahl der Intervalle, in die die Originaldaten unterteilt (quantisiert) werden sollen;
  • Initialisierungsnummer für den Zufallszahlengenerator;
  • Charts speichern;
  • Verzeichnis zum Speichern von Diagrammen;
  • Breite des Charts;
  • Höhe des Charts;
  • Schriftgröße.

 

Beschreibung der Arbeitsschritte des Skripts:

  1. Es wird eine Stichprobe nach dem Zufallsprinzip gezogen.
  2. Das Chart des Handelsinstruments zeigt ein Histogramm, das wie in diesem Artikel beschrieben erstellt wurde (Abbildung 1), sowie das Chart mit den Werten des generierten Prädiktors in chronologischer Reihenfolge und geteilt durch die nach der Quantisierung erhaltenen Grenzen (Abbildung 2). Wenn „Save charts“ (Charts speichern) „true“ ist, werden die Diagramme im Verzeichnis mit den nutzerdefinierten Terminaldateien „Files\Q_Trans\Grafics“ gespeichert.

    Abbildung 2.

  3. Mit der Funktion Q_Bit wird die Quantisierung durchgeführt und der Fehler in Form eines Offsets des rekonstruierten Wertes relativ zum gesamten Bereich der Abtastwerte berechnet.
  4. Mit der Funktion Book_to_cifra wird eine Dequantisierung entlang des Schwerpunkts durchgeführt und der Fehler in Form eines Offsets des rekonstruierten Wertes berechnet.
  5. Die Funktion Book_to_cifra wird verwendet, um die Dequantisierung entlang des rechten Randes durchzuführen und den Fehler in Form eines Offsets des rekonstruierten Wertes zu berechnen.
  6. Die Funktion Book_to_cifra_v2 wird verwendet, um eine Dequantisierung entlang des Schwerpunkts durchzuführen und den Fehler in Form eines Offsets des rekonstruierten Werts zu berechnen.
  7. Mit der Funktion Q_Random werden 1000 Versuche unternommen, um die besten Intervalle für die Aufteilung des Prädiktors zu finden.
  8. Mit der Funktion Book_to_cifra wird eine Dequantisierung entlang des Schwerpunkts unter Verwendung eines zufällig ermittelten besten Gitters durchgeführt und der Fehler in Form eines Offsets des rekonstruierten Werts berechnet.

Wenn wir das Skript mit den Standardeinstellungen ausführen, sehen wir im Experts-Terminalprotokoll in der Spalte „Message“ die folgenden Informationen

Average data recovery error size = 3.52% of full range when using 8 intervals
Average error size via quantum table for centroid conversion (Book_to_cifra) = 1145.62263
Average error size via quantum table for right boundary conversion (Book_to_cifra) = 2513.41952
Average error size via quantum table for centroid transformation (Book_to_cifra_v2) = 1145.62263
Average error size via quantum table for centroid transformation (Q_Random) = 1030.79216

Interessant ist, dass die Zufallsmethode für die Auswahl der Grenzen sogar bessere Ergebnisse als die zuvor betrachtete Methode (basierend auf einer gleichmäßigen Quantisierung) zeigt.

 

3. Quantisierungen mit CatBoost

CatBoost, über das ich bereits in meinem Artikel „Der Algorithmus CatBoost von Yandex für das maschinelle Lernen, Kenntnisse von Python- oder R sind nicht erforderlich“ geschrieben habe, verwendet Quantisierung für die Datenvorverarbeitung, was den Betrieb des Gradient-Boosting-Algorithmus erheblich beschleunigen kann. Wie bisher werde ich die Konsolenversion von CatBoost verwenden, da sie keine Installation zusätzlicher Software erfordert, wenn sie auf dem Hauptprozessor des Computers arbeitet.

Wir benötigen die folgenden Einstellungen:

1. Quantisierungsmethode (Division) – Schlüssel "--feature-border-type":

  • Median
  • Uniform
  • UniformAndQuantiles
  • MaxLogSum
  • MinEntropie
  • GreedyLogSum

2. Anzahl der Separatoren von 1 bis 65535 - Schlüssel "--border-count"

3. Speichern von Quantisierungstabellen in der angegebenen Datei - Schlüssel "--output-borders-file"

4. Laden von Quantisierungstabellen aus der angegebenen Datei - Schlüssel "--input-borders-file"

 

Wenn wir die oben beschriebenen Schlüssel nicht angeben, werden die folgenden Einstellungen für die Erstellung der in diesem Artikel verwendeten Modelle verwendet:

  • Für die Berechnung auf der CPU ist die Quantisierungsmethode „GreedyLogSum“, die Anzahl der Separatoren ist „254“;
  • Für GPU-Berechnungen ist die Quantisierungsmethode „GreedyLogSum“, die Anzahl der Separatoren ist „128“.

   

Schauen wir uns an, wie man diese Schlüssel registriert:

Richten wir die Quantisierung ein, indem wir die Methode „Uniform“ und die Anzahl der Separatoren auf 30 einstellen, und speichern die Quantisierungstabelle in der Datei Quant_CB.csv:

catboost-1.0.6.exe fit --learn-set train.csv          --test-set test.csv --column-description Test_CB_Setup_0_000000000 --has-header --delimiter ; --train-dir ..\Rezultat --feature-border-type Uniform --border-count 30 --output-borders-file Quant_CB.csv 

Wir laden die Quantisierungstabelle aus der Datei Quant_CB.csv und trainieren das Modell:

catboost-1.0.6.exe fit --learn-set train.csv          --test-set test.csv --column-description Test_CB_Setup_0_000000000 --has-header --delimiter ; --train-dir ..\Rezultat --input-borders-file Quant_CB.csv

 Sie finden den Abschnitt über die Quantisierungseinstellungen in der Anleitung des Entwicklers hier.

 

Sehen wir uns an, wie sich die Quantisierungsmethoden bei der Anwendung auf bestimmte Daten unterscheiden. Nachfolgend finden Sie die Diagramme in Form von gif-Dateien. Jedes neue Bild ist die nächste Methode. Die Anzahl der Separatoren beträgt 16.

 

Abbildung 2 „Datendiagramm für den kategorialen Prädiktor“

 

Abbildung 3 „Datendiagramm für den Prädiktor mit in den linken Bereich verschobenen Werten“

 

Abbildung 4 „Datendiagramm für den Prädiktor mit in den rechten Bereich verschobenen Werten“

 

Abbildung 5 „Datendiagramm für den Prädiktor mit Werten im zentralen Bereich“

 

Abbildung 6 „Datendiagramm für den Prädiktor mit gleichmäßiger Verteilung der Werte“

 

Wenn wir uns die Struktur der Datei mit der Quantisierungstabelle ansehen (in unserem Fall Quant_CB.csv), sehen wir zwei Spalten und viele Zeilen. Die erste Spalte enthält die Seriennummer des Prädiktors, der beim Training des Modells verwendet werden soll, während die zweite Spalte das Trennzeichen (Grenze/Ebene) enthält. Die Anzahl der Zeilen entspricht der kumulativen Summe der Begrenzungszeichen, und die Zahl in der ersten Spalte ändert sich, nachdem alle Begrenzungszeichen aufgelistet worden sind.

 

  

Tabelle 1 „Inhalt der gespeicherten CatBoost-Datei mit Separatoren“

 

Schlussfolgerung

In diesem Artikel haben wir uns mit dem Konzept der Quantisierung vertraut gemacht, die Gewinnung quantisierter Prädiktorenwerte anhand des MQL5-Codes als Beispiel analysiert und die Implementierung der Quantisierung in CatBoost untersucht.

Wenn Sie terminologische oder sachliche Fehler in diesem Artikel entdeckt haben, können Sie mich gerne kontaktieren.

Im nächsten Artikel werden wir herausfinden, wie man Quantentabellen für einen bestimmten Prädiktor auswählt und ein Experiment durchführen, um die Durchführbarkeit dieser Auswahl zu bewerten.

# Anwendung Beschreibung
1 Q_Trans.mq5 Skript mit einem Beispiel für eine gleichmäßige Quantisierung einer Zufallsstichprobe.


Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/13219

Beigefügte Dateien |
Q_Trans.mq5 (49.68 KB)
Entwicklung eines Replay Systems — Marktsimulation (Teil 25): Vorbereitungen für die nächste Phase Entwicklung eines Replay Systems — Marktsimulation (Teil 25): Vorbereitungen für die nächste Phase
In diesem Artikel schließen wir die erste Phase der Entwicklung unseres Replay- und Simulationssystems ab. Liebe Leserin, lieber Leser, damit bestätige ich, dass das System ein fortgeschrittenes Niveau erreicht hat und den Weg für die Einführung neuer Funktionen ebnet. Ziel ist es, das System noch weiter zu bereichern und es zu einem leistungsfähigen Instrument für die Forschung und Entwicklung von Marktanalysen zu machen.
Datenkennzeichnung für die Zeitreihenanalyse (Teil 4):Deutung der Datenkennzeichnungen durch Aufgliederung Datenkennzeichnung für die Zeitreihenanalyse (Teil 4):Deutung der Datenkennzeichnungen durch Aufgliederung
In dieser Artikelserie werden verschiedene Methoden zur Kennzeichnung (labeling) von Zeitreihen vorgestellt, mit denen Daten erstellt werden können, die den meisten Modellen der künstlichen Intelligenz entsprechen. Eine gezielte und bedarfsgerechte Kennzeichnung von Daten kann dazu führen, dass das trainierte Modell der künstlichen Intelligenz besser mit dem erwarteten Design übereinstimmt, die Genauigkeit unseres Modells verbessert wird und das Modell sogar einen qualitativen Sprung machen kann!
Entwicklung eines Replay System (Teil 26): Expert Advisor Projekt — die Klasse C_Terminal Entwicklung eines Replay System (Teil 26): Expert Advisor Projekt — die Klasse C_Terminal
Wir können nun mit der Erstellung eines Expert Advisors für die Verwendung im Wiedergabe-/Simulationssystem beginnen. Wir brauchen jedoch eine Verbesserung und keine zufällige Lösung. Trotzdem sollten wir uns von der anfänglichen Komplexität nicht einschüchtern lassen. Es ist wichtig, irgendwo anzufangen, sonst enden wir damit, dass wir über die Schwierigkeit einer Aufgabe grübeln, ohne überhaupt zu versuchen, sie zu bewältigen. Genau darum geht es beim Programmieren: Hindernisse durch Lernen, Testen und umfassende Forschung zu überwinden.
Entwicklung eines Replay Systems — Marktsimulation (Teil 24): FOREX (V) Entwicklung eines Replay Systems — Marktsimulation (Teil 24): FOREX (V)
Heute werden wir eine Einschränkung aufheben, die bisher Simulationen auf der Grundlage des letzten Kurses verhindert hat, und einen neuen Einstiegspunkt speziell für diese Art von Simulationen einführen. Der gesamte Funktionsmechanismus wird auf den Prinzipien des Devisenmarktes beruhen. Der Hauptunterschied in diesem Verfahren ist die Trennung von Bid- und Last-Simulationen. Es ist jedoch wichtig zu beachten, dass die Methode zur Randomisierung der Zeit und zur Anpassung an die Klasse C_Replay in beiden Simulationen identisch bleibt. Das ist gut, denn Änderungen in einem Modus führen automatisch zu Verbesserungen im anderen, vor allem wenn es um die Handhabung der Zeit zwischen den Ticks geht.