Discussion de l'article "Python, ONNX et MetaTrader 5 : Création d'un modèle RandomForest avec RobustScaler et PolynomialFeatures pour le pré-traitement des données"

 

Un nouvel article Python, ONNX et MetaTrader 5 : Création d'un modèle RandomForest avec RobustScaler et PolynomialFeatures pour le pré-traitement des données a été publié :

Dans cet article, nous allons créer un modèle de forêt aléatoire (random forest) en Python, entraîner le modèle et le sauvegarder en tant que pipeline ONNX avec un pré-traitement des données. Ensuite, nous utiliserons le modèle dans le terminal MetaTrader 5.

Random Forest est un outil puissant dans la boîte à outils de l'apprentissage automatique. Pour mieux comprendre son fonctionnement, imaginons un immense groupe de personnes se réunissant et prenant des décisions collectives. Mais au lieu de personnes réelles, chaque membre de ce groupe est un classificateur indépendant ou un prédicteur de la situation actuelle. Au sein de ce groupe, une personne est un arbre de décision capable de prendre des décisions sur la base de certains attributs. Lorsque la forêt aléatoire prend une décision, elle utilise la démocratie et le vote : chaque arbre exprime son opinion et la décision est prise sur la base de votes multiples.

Random Forest est largement utilisé dans une variété de domaines, et sa flexibilité le rend adapté à la fois aux problèmes de classification et de régression. Dans une tâche de classification, le modèle décide à quelle classe prédéfinie appartient l'état actuel. Par exemple, sur le marché financier, il peut s'agir d'une décision d'achat (classe 1) ou de vente (classe 0) d'un actif sur la base d'une série d'indicateurs.

Toutefois, dans cet article, nous nous concentrerons sur les problèmes de régression. La régression dans l'apprentissage automatique est une tentative de prédire les valeurs numériques futures d'une série temporelle sur la base de ses valeurs passées. Au lieu de la classification, qui consiste à classer les objets dans certaines catégories, la régression vise à prédire des nombres spécifiques. Il peut s'agir, par exemple, de prévoir le cours des actions, la température ou toute autre variable numérique.


Auteur : Yevgeniy Koshtenko

 
J'ai trouvé une erreur dans le code :

future_pr = dataset['<CLOSE>'].iloc[i + rand]
devrait être :

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

Sinon, vous obtiendrez une erreur :

File "C:\NPython39\Nliblibite-packages\Npandas\Ncore\Ndexes\Nbase.py", ligne 3812, in get_loc
raise KeyError(key) from err
KeyError : '<close> '

Une référence de colonne incorrecte dans votre fonction labelling_relabeling_regression. J'ai continué à obtenir des erreurs parce que vous essayez d'accéder à la colonne '<CLOSE>' dans votre jeu de données, mais pandas est incapable de la trouver parce que le nom correct de la colonne est 'close', et non '<CLOSE>'. La sensibilité à la casse et les crochets d'angle supplémentaires font que pandas lance une KeyError .

Il s'agit d'une erreur très simple, mais quelqu'un d'autre pourrait s'y perdre et abandonner.

Puisque le reste de votre code utilise <CLOSE> ... il est probablement préférable d'ajouter une ligne comme :

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


def labelling_relabeling_regression(dataset, min_value=1, max_value=1):
dataset = dataset.rename(columns={'close': '<CLOSE>'}) //ajoute cette ligne pour que le reste du code fonctionne sans problème
future_prices = [ ]

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

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

return dataset


 
Shashank Rai #:
J'ai trouvé un bug dans le code :

devrait être :

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

Sinon, vous obtiendrez une erreur :

File "C:\NPython39\NLibrary\Nsite-packages\Npandas\Ncore\Ndexes\Nbase.py", ligne 3812, in get_loc
raise KeyError(key) from err
KeyError : '<close> '

Mauvaise référence de colonne dans votre fonction labelling_relabelling_regression. J'ai continué à obtenir des erreurs parce que vous essayez d'accéder à la colonne '<CLOSE>' dans votre jeu de données, mais pandas ne peut pas la trouver parce que le nom correct de la colonne est 'close', et non '<CLOSE>'. En raison de la sensibilité à la casse et des crochets d'angle supplémentaires, pandas lance une KeyError.

Il s'agit d'une erreur très simple, mais quelqu'un d'autre pourrait s'y perdre et abandonner.

Puisque le reste de votre code utilise <CLOSE> ... il est probablement préférable d'ajouter une ligne telle que :

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


def labelling_relabeling_regression(dataset, min_value=1, max_value=1):
dataset = dataset.rename(columns={'close': '<CLOSE>'}) //ajoute cette ligne pour que le reste du code fonctionne correctement
future_prices = [ ]

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

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

return dataset


Merci beaucoup, je vais jeter un coup d'oeil, je l'ai peut-être manqué en éditant le code !(
 
Yevgeniy Koshtenko #:
Merci beaucoup, je vais jeter un coup d'oeil, je l'ai peut-être manqué en éditant le code !(

Pas de problème, monsieur. Une autre recommandation - pour les personnes qui n'utilisent pas google colab et qui travaillent sur leur propre machine ou sur AWS ou autre, ils n'ont pas besoin d'importer gdown

à la place, utilisez ce qui suit :

Premièrement :

import os #ajoutez cette ligne à votre zone d'importation au lieu d'importer gdown


Deuxièmement :

remplacer la section suivante


# 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)

par :

# Sauvegarder le pipeline au format Joblib
joblib_model_path = 'rf_pipeline.joblib '
joblib.dump(pipeline, joblib_model_path)

# Convertir le pipeline au format ONNX
initial_type = [('float_input', FloatTensorType([None, n_features]))]]
onnx_model = convert_sklearn(pipeline, initial_types=initial_type )

# Sauvegarder le modèle ONNX
model_onnx_path = "rf_pipeline.onnx "
onnx.save_model(onnx_model, model_onnx_path)

# Spécifie le dossier local dans le répertoire courant pour sauvegarder le modèle
local_folder_path = './models/'# Ajustez ce chemin si nécessaire

# Créer le répertoire s'il n'existe pas
if not os.path.exists(local_folder_path):
os.makedirs(chemin_du_dossier_local )

# Spécifier les chemins complets pour les modèles dans le dossier local
chemin_joblib_local = os.path.join(chemin_dossier_local, 'rf_pipeline.joblib' )
local_onnx_path = os.path.join(local_folder_path, 'rf_pipeline.onnx' )

# Déplacer les modèles dans le dossier local spécifié
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(chemin_model_onnx, chemin_onnx_local)

print(f'Le modèle rf_pipeline au format Joblib est sauvegardé localement à : {chemin_local_joblib}')

print(f'Le modèle rf_pipeline au format ONNX est sauvegardé localement à l'adresse suivante : {local_onnx_path} ') {local_onnx_path}')


le modèle sera stocké dans un sous-dossier appelé /model sub-directory. Cela permettra également de stocker votre modèle en tant que fichier jplotlib, au cas où vous en auriez besoin lors de l'exécution. En outre, les deux modèles peuvent être exécutés directement à partir de python pour obtenir des prédictions.

 
Merci pour cet article. Après avoir fait de l'apprentissage par renforcement pour mon projet universitaire, je me suis demandé si c'était possible.
 
Shashank Rai #:

Pas de problème. Une autre recommandation est pour ceux qui n'utilisent pas google colab et qui se contentent d'exécuter sur leur machine ou sur AWS, ils n'ont pas besoin d'importer gdown.

Au lieu de cela, utilisez ce qui suit :

Premièrement :

import os #ajoute cette ligne à la portée de l'import au lieu de import gdown
.


Deuxièmement :

remplacer la section suivante


par :

# Sauvegarder le pipeline au format Joblib
joblib_model_path = 'rf_pipeline.joblib '
joblib.dump(pipeline, joblib_model_path)

# Convertir le pipeline au format ONNX
initial_type = [('float_input', FloatTensorType([None, n_features])))]]
onnx_model = convert_sklearn(pipeline, initial_types=initial_type )

# Sauvegarder le modèle ONNX
model_onnx_path = "rf_pipeline.onnx "
onnx.save_model(onnx_model, model_onnx_path)

# Spécifie un dossier local dans le répertoire courant pour y sauvegarder le modèle
local_folder_path = './models/'# Personnalisez ce chemin si nécessaire.

# Créer un répertoire s'il n'existe pas
if not os.path.exists(local_folder_path):
os.makedirs(chemin_du_dossier_local )

# Spécifier les chemins complets vers les modèles dans le dossier local
chemin_joblib_local = os.path.join(chemin_dossier_local, 'rf_pipeline.joblib' )
local_onnx_path = os.path.join(local_folder_path, 'rf_pipeline.onnx' )

# Déplacer les modèles dans le dossier local spécifié
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(chemin_model_onnx, chemin_onnx_local)

print(f'Le modèle rf_pipeline au format Joblib est sauvegardé localement à l'adresse : {chemin_local_joblib}')

print(f'Le modèle rf_pipeline au format ONNX est enregistré localement à l'adresse : {local_onnx_path}')


Le modèle sera stocké dans le sous-répertoire /model. C'est également là que le modèle sera stocké en tant que fichier jplotlib, au cas où vous en auriez besoin au moment de l'exécution. De plus, les deux modèles peuvent être exécutés directement à partir de python pour obtenir des prédictions.

Corrigé, envoyer la version du fichier du tutoriel au modérateur pour approbation.

 
Adrian Page apprentissage par renforcement pour mon projet à l'université, je me suis demandé si c'était possible.

Oui, je n'ai pas encore abordé l'apprentissage par renforcement))))))

 
22.04.2024 - j'ai changé les données de l'ensemble de données du format Excel au format de la bibliothèque Python MetaTrader5. De plus, j'ai sauvegardé le modèle localement (auparavant, il était sauvegardé sur Google Drive).
 
Yevgeniy Koshtenko #:

Pourquoi le gradient bousting n'a-t-il pas été utilisé comme algorithme plus récent (puisque vous vous plaignez que la forêt aléatoire est déjà ancienne) ? Est-ce que cela s'est produit par hasard ou y avait-il une raison ? Je pense qu'il y a du gradient bousting dans Sklearn.

 
Aleksey Nikolayev #:

Pourquoi le gradient bousting n'a-t-il pas été utilisé comme algorithme plus récent (puisque vous vous plaignez que la forêt aléatoire est déjà ancienne) ? Est-ce que cela s'est produit par hasard ou y avait-il une raison ? Je pense qu'il y a du gradient bousting dans Sklearn.

C'est juste que la forêt a été choisie comme un exemple simple (Boosting dans le prochain article, maintenant je le fais un peu).

 
Yevgeniy Koshtenko #:

La forêt a été choisie comme exemple simple)Busting dans le prochain article, je suis en train de le peaufiner un peu)

Bon)