Diskussion zum Artikel "Python, ONNX und MetaTrader 5: Erstellen eines RandomForest-Modells mit RobustScaler und PolynomialFeatures zur Datenvorverarbeitung"

 

Neuer Artikel Python, ONNX und MetaTrader 5: Erstellen eines RandomForest-Modells mit RobustScaler und PolynomialFeatures zur Datenvorverarbeitung :

In diesem Artikel werden wir ein Random-Forest-Modell in Python erstellen, das Modell trainieren und es als ONNX-Pipeline mit Datenvorverarbeitung speichern. Danach werden wir das Modell im MetaTrader 5 Terminal verwenden.

Random Forest ist ein leistungsfähiges Werkzeug im Werkzeugkasten des maschinellen Lernens. Um besser zu verstehen, wie das funktioniert, stellen wir uns vor, dass eine große Gruppe von Menschen zusammenkommt und gemeinsam Entscheidungen trifft. Anstelle von realen Personen ist jedoch jedes Mitglied dieser Gruppe ein unabhängiger Klassifikator oder Prädiktor der aktuellen Situation. Innerhalb dieser Gruppe ist eine Person ein Entscheidungsbaum, der in der Lage ist, Entscheidungen auf der Grundlage bestimmter Eigenschaften zu treffen. Wenn der Random Forest eine Entscheidung trifft, nutzt er Demokratie und Abstimmung: Jeder Baum äußert seine Meinung, und die Entscheidung wird auf der Grundlage mehrerer Stimmen getroffen.

Random Forest wird in einer Vielzahl von Bereichen eingesetzt und eignet sich aufgrund seiner Flexibilität sowohl für Klassifizierungs- als auch für Regressionsprobleme. Bei einer Klassifizierungsaufgabe entscheidet das Modell, zu welcher der vordefinierten Klassen der aktuelle Zustand gehört. Auf dem Finanzmarkt könnte dies beispielsweise eine Entscheidung zum Kauf (Klasse 1) oder Verkauf (Klasse 0) eines Vermögenswerts auf der Grundlage einer Vielzahl von Indikatoren bedeuten.

In diesem Artikel werden wir uns jedoch auf Regressionsprobleme konzentrieren. Die Regression beim maschinellen Lernen ist ein Versuch, die zukünftigen numerischen Werte einer Zeitreihe auf der Grundlage ihrer vergangenen Werte vorherzusagen. Im Gegensatz zur Klassifizierung, bei der wir Objekte bestimmten Klassen zuordnen, versuchen wir bei der Regression, bestimmte Zahlen vorherzusagen. Dies könnte zum Beispiel die Vorhersage von Aktienkursen, die Vorhersage der Temperatur oder jede andere numerische Variable sein.

Autor: Yevgeniy Koshtenko

 
Ich habe einen Fehler im Code gefunden:

future_pr = dataset['<CLOSE>'].iloc[i + rand]
sollte sein:

future_pr = dataset['close'].iloc[i + rand ]

Andernfalls erhalten Sie einen Fehler:

Datei "C:\Python39\lib\site-packages\pandas\core\indexes\base.py", Zeile 3812, in get_loc
raise KeyError(key) from err
KeyError: '<close> '

Eine falsche Spaltenreferenz in Ihrer Funktion labelling_relabeling_regression. Ich habe immer wieder Fehler erhalten, weil Sie versuchen, auf die Spalte '<CLOSE>' in Ihrem Datensatz zuzugreifen, aber Pandas ist nicht in der Lage, sie zu finden, weil der korrekte Spaltenname 'close' ist, nicht '<CLOSE>'. Die Groß- und Kleinschreibung und die zusätzlichen spitzen Klammern führen dazu, dass Pandas einen KeyError ausgibt.

Ein sehr einfacher Fehler, aber jemand, der mitliest, könnte verwirrt werden und aufgeben.

Da der Rest Ihres Codes <CLOSE> verwendet ... ist es wahrscheinlich besser, einfach eine Zeile wie hinzufügen:

dataset = dataset.rename(columns={'close': '<CLOSE>'})


def labelling_relabeling_regression(dataset, min_value=1, max_value=1):
Datensatz = dataset.rename(columns={'close': '<CLOSE>'}) //Fügen Sie diese Zeile ein, damit der Rest des Codes reibungslos funktioniert
future_prices = [ ]

for i in range(dataset.shape[0] - max_value):
rand = random.randint(min_wert, max_wert )
future_pr = dataset['<CLOSE>'].iloc[i + rand ]
future_prices.append(future_pr )

datensatz = datensatz.iloc[:len(future_prices)].copy( )
datensatz['future_price'] = future_prices

return dataset


 
Shashank Rai #:
Einen Fehler im Code habe ich gefunden:

sollte sein:

future_pr = dataset['close'].iloc[i + rand ]

Andernfalls erhalten Sie einen Fehler:

Datei "C:\Python39\lib\site-packages\pandas\core\indexes\base.py", Zeile 3812, in get_loc
raise KeyError(key) from err
KeyError: '<close> '

Falsche Spaltenreferenz in Ihrer Funktion labelling_relabelling_regression. Ich habe immer wieder Fehler erhalten, weil Sie versuchen, auf die Spalte '<CLOSE>' in Ihrem Datensatz zuzugreifen, aber Pandas kann sie nicht finden, weil der richtige Spaltenname 'close' und nicht '<CLOSE>' ist. Aufgrund der Groß- und Kleinschreibung und der zusätzlichen spitzen Klammern löst Pandas einen KeyError aus.

Ein sehr einfacher Fehler, aber jemand anderes, der vorbeikommt, könnte verwirrt werden und aufgeben.

Da der Rest Ihres Codes <CLOSE> verwendet ... ist es wahrscheinlich am besten, einfach eine Zeile wie die folgende hinzuzufügen:

dataset = dataset.rename(columns={'close': '<CLOSE>'})


def labelling_relabeling_regression(dataset, min_value=1, max_value=1):
Datensatz = dataset.rename(columns={'close': '<CLOSE>'}) //Fügen Sie diese Zeile ein, damit der Rest des Codes reibungslos funktioniert
future_prices = [ ]

for i in range(dataset.shape[0] - max_value):
rand = random.randint(min_wert, max_wert )
future_pr = dataset['<CLOSE>'].iloc[i + rand ]
future_prices.append(future_pr )

datensatz = datensatz.iloc[:len(future_prices)].copy( )
datensatz['future_price'] = future_prices

return dataset


Vielen Dank, ich werde es mir ansehen, vielleicht habe ich es bei der Bearbeitung des Codes übersehen!(
 
Yevgeniy Koshtenko #:
Vielen Dank, ich werde es mir ansehen, vielleicht habe ich es bei der Bearbeitung des Codes übersehen!(

Kein Problem, Sir. Eine weitere Empfehlung - für die Leute, die google colab nicht benutzen und nur auf ihrem eigenen Rechner oder auf AWS oder so arbeiten, brauchen sie gdown nicht zu importieren

Verwenden Sie stattdessen das Folgende:

First:

import os #add this line to your import area instead of import gdown


Zweitens:

Ersetzen sie den folgenden Abschnitt


# Save the pipeline
joblib.dump(pipeline, 'rf_pipeline.joblib')

# Convert pipeline to ONNX
onnx_model = convert_sklearn(pipeline, initial_types=initial_type)

# Save the model in ONNX format
model_onnx_path = "rf_pipeline.onnx"
onnx.save_model(onnx_model, model_onnx_path)

# Save the model in ONNX format
model_onnx_path = "rf_pipeline.onnx"
onnx.save_model(onnx_model, model_onnx_path)

# Connect Google Drive (if you work in Colab and this is necessary)
from google.colab import drive
drive.mount('/content/drive')

# Specify the path to Google Drive where you want to move the model
drive_path = '/content/drive/My Drive/'  # Make sure the path is correct
rf_pipeline_onnx_drive_path = os.path.join(drive_path, 'rf_pipeline.onnx')

# Move ONNX model to Google Drive
shutil.move(model_onnx_path, rf_pipeline_onnx_drive_path)

print('The rf_pipeline model is saved in the ONNX format on Google Drive:', rf_pipeline_onnx_drive_path)

mit:

# Speichern Sie die Pipeline im Joblib-Format
joblib_model_path = 'rf_pipeline.joblib '
joblib.dump(pipeline, joblib_model_path)

# Konvertieren der Pipeline in das ONNX-Format
initial_type = [('float_input', FloatTensorType([None, n_features]))]
onnx_model = convert_sklearn(pipeline, initial_types=initial_type )

# Speichern des ONNX-Modells
model_onnx_path = "rf_pipeline.onnx "
onnx.save_model(onnx_model, model_onnx_path)

# Geben Sie den lokalen Ordner innerhalb des aktuellen Verzeichnisses an, um das Modell zu speichern.
local_folder_path = './models/'# Passen Sie diesen Pfad nach Bedarf an

# Erstellen Sie das Verzeichnis, wenn es nicht existiert.
if not os.path.exists(local_folder_path):
os.makedirs(lokaler_ordner_pfad )

# Geben Sie die vollständigen Pfade für die Modelle innerhalb des lokalen Ordners an
local_joblib_path = os.path.join(local_folder_path, 'rf_pipeline.joblib' )
local_onnx_path = os.path.join(local_folder_path, 'rf_pipeline.onnx' )

# Verschieben Sie die Modelle in den angegebenen lokalen Ordner.
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(model_onnx_path, local_onnx_path)

print(f'Das rf_pipeline-Modell im Joblib-Format ist lokal gespeichert unter: {lokaler_joblib_pfad}')

print(f'Das rf_pipeline-Modell im ONNX-Format ist lokal gespeichert unter: {lokaler_onnx_pfad}')


Das Modell wird in einem Unterverzeichnis mit dem Namen /model sub-directory gespeichert. Dadurch wird Ihr Modell auch als jplotlib-Datei gespeichert, falls Sie es zur Laufzeit benötigen. Außerdem können beide Modelle direkt von Python aus ausgeführt werden, um Vorhersagen zu erhalten.

 
Vielen Dank für diesen Artikel. Nachdem ich Reinforcement Learning für mein Uni-Projekt gemacht habe, habe ich mich gefragt, ob das möglich ist.
 
Shashank Rai #:

Kein Problem, Sir. Eine weitere Empfehlung ist für diejenigen, die nicht Google Colab verwenden und nur auf ihrem Rechner oder auf AWS laufen, sie brauchen nicht zu importieren gdown

Verwenden Sie stattdessen das Folgende:

Erstens:

import os #add this line to the import scope instead of import gdown
.


Zweitens:

Ersetzen Sie den folgenden Abschnitt


durch:

# Speichern Sie die Pipeline im Joblib-Format
joblib_model_path = 'rf_pipeline.joblib '
joblib.dump(pipeline, joblib_model_path)

# Konvertieren der Pipeline in das ONNX-Format
initial_type = [('float_input', FloatTensorType([None, n_features]))]]
onnx_model = convert_sklearn(pipeline, initial_types=initial_type )

# Speichern Sie das ONNX-Modell.
model_onnx_path = "rf_pipeline.onnx "
onnx.save_model(onnx_model, model_onnx_path)

# Geben Sie einen lokalen Ordner im aktuellen Verzeichnis an, in dem das Modell gespeichert werden soll
local_folder_path = './models/'# Passen Sie diesen Pfad nach Bedarf an.

# Erstellen Sie ein Verzeichnis, wenn es nicht existiert
if not os.path.exists(local_folder_path):
os.makedirs(lokaler_ordner_pfad )

# Geben Sie die vollständigen Pfade zu den Modellen im lokalen Ordner an
local_joblib_path = os.path.join(local_folder_path, 'rf_pipeline.joblib' )
local_onnx_path = os.path.join(local_folder_path, 'rf_pipeline.onnx' )

# Verschieben Sie die Modelle in den angegebenen lokalen Ordner.
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(model_onnx_path, local_onnx_path)

print(f'Das rf_pipeline-Modell im Joblib-Format ist lokal gespeichert unter der Adresse: {lokaler_joblib_pfad}')

print(f'Das rf_pipeline-Modell im ONNX-Format ist lokal unter folgender Adresse gespeichert: {local_onnx_path}')


Das Modell wird in dem Unterverzeichnis /model gespeichert. Dort wird das Modell auch als jplotlib-Datei gespeichert, falls Sie es zur Laufzeit benötigen. Darüber hinaus können beide Modelle direkt von Python aus ausgeführt werden, um Vorhersagen zu erhalten.

Korrigiert, die Version der Tutorial-Datei an den Moderator zur Genehmigung weitergeleitet.

 
Adrian Page Verstärkungslernen für mein Projekt an der Universität gemacht habe, habe ich mich gefragt, ob das möglich ist.

Ja, ich bin noch nicht zum Reinforcement Learning gekommen))))))

 
22.04.2024 - Ich habe die Daten des Datensatzes vom Excel-Format in das Format der Python MetaTrader5-Bibliothek geändert. Außerdem habe ich das Modell lokal gespeichert (vorher war es auf Google Drive gespeichert).
 
Yevgeniy Koshtenko #:

Warum wurde Gradient Bousting nicht als neuerer Algorithmus verwendet (da Sie sich beschweren, dass Random Forest schon alt ist)? Ist das einfach so passiert oder gab es dafür einen Grund? Ich denke, dass es Bousting in Sklearn gibt.

 
Aleksey Nikolayev #:

Warum wurde Gradient Bousting nicht als neuerer Algorithmus verwendet (da Sie sich beschweren, dass Random Forest schon alt ist)? Ist das einfach so passiert oder gab es dafür einen Grund? Ich denke, dass es Bousting in Sklearn gibt.

Es ist nur so, dass der Forest als einfaches Beispiel gewählt wurde)Boosting im nächsten Artikel, jetzt mache ich es ein bisschen)

 
Yevgeniy Koshtenko #:

Nur der Wald wurde als einfaches Beispiel gewählt)Busting im nächsten Artikel, ich bin gerade dabei, es ein wenig zu optimieren)

Gut)