Discussione sull’articolo "Python, ONNX e MetaTrader 5: Creazione di un modello RandomForest con RobustScaler e preelaborazione dei dati PolynomialFeatures"

 

Il nuovo articolo Python, ONNX e MetaTrader 5: Creazione di un modello RandomForest con RobustScaler e preelaborazione dei dati PolynomialFeatures è stato pubblicato:

In questo articolo, creeremo un modello foresta casuale in Python, lo addestreremo e lo salveremo come pipeline ONNX con la pre-elaborazione dei dati. Dopodiché, utilizzeremo il modello nel terminale MetaTrader 5.

Random Forest è un potente strumento dell'apprendimento automatico. Per capire meglio come funziona, visualizziamolo come un enorme gruppo di persone che si riunisce e prende decisioni collettive. Tuttavia, invece di persone reali, ogni membro di questo gruppo è un classificatore o predittore indipendente della situazione attuale. All'interno di questo gruppo, una persona è un albero decisionale in grado di prendere decisioni in base a determinati attributi. Quando la foresta casuale prende una decisione, utilizza la democrazia e il voto: ogni albero esprime la propria opinione e la decisione viene presa sulla base di più voti.

La foresta casuale è ampiamente utilizzata in diversi campi e la sua flessibilità la rende adatta sia ai problemi di classificazione che di regressione. In un compito di classificazione, il modello decide a quale classe predefinita appartiene lo stato corrente. Ad esempio, nel mercato finanziario, ciò potrebbe significare la decisione di acquistare (classe 1) o vendere (classe 0) un asset sulla base di una serie di indicatori.

Tuttavia, in questo articolo ci concentreremo sui problemi di regressione. La regressione nell'apprendimento automatico è un tentativo di prevedere i valori numerici futuri di una serie temporale sulla base dei suoi valori passati. Invece della classificazione, che assegna gli oggetti a determinate classi, la regressione mira a prevedere numeri specifici. Potrebbe essere, ad esempio, la previsione dei prezzi delle azioni, della previsione della temperatura o di qualsiasi altra variabile numerica.


Autore: Yevgeniy Koshtenko

 
Ho trovato un errore nel codice:

future_pr = dataset['<CLOSE>'].iloc[i + rand]
dovrebbe essere:

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

Altrimenti si otterrà un errore:

File "C:\Python39\libsite\pandas\core\indexes\base.py", linea 3812, in get_loc
sollevare KeyError(chiave) da err
Errore chiave: '<chiudere> '

Un riferimento di colonna errato nella funzione labelling_relabeling_regression. Ho continuato a ricevere errori perché si cerca di accedere alla colonna '<CLOSE>' nel dataset, ma pandas non è in grado di trovarla perché il nome corretto della colonna è 'close', non '<CLOSE>'. La sensibilità alle maiuscole e le parentesi angolari aggiuntive fanno sì che pandas lanci un KeyError.

L'errore è molto semplice, ma chi segue potrebbe confondersi e rinunciare.

Poiché il resto del codice utilizza <CLOSE> ... probabilmente è meglio aggiungere una riga come:

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


def labelling_relabeling_regression(dataset, min_value=1, max_value=1):
dataset = dataset.rename(columns={'close': '<CLOSE>'}) //aggiungiamo questa riga per far funzionare senza problemi il resto del codice
prezzi_futuri = [ ]

per 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(prezzi_futuri)].copy( )
dataset['future_price'] = future_prices

restituire dataset


 
Shashank Rai #:
Ho trovato un errore nel codice:

dovrebbe essere:

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

Altrimenti si otterrà un errore:

File "C:\Python39\libsite\pandas\core\indexes\base.py", riga 3812, in get_loc
sollevare KeyError(chiave) da err
KeyError: '<close> '

Riferimento di colonna errato nella funzione labelling_relabelling_regression. Ho continuato a ricevere errori perché si sta cercando di accedere alla colonna '<CLOSE>' nel dataset, ma pandas non riesce a trovarla perché il nome corretto della colonna è 'close', non '<CLOSE>'. A causa della sensibilità alle maiuscole e alle parentesi angolari aggiuntive, pandas lancia un KeyError.

È un errore molto semplice, ma qualcuno potrebbe confondersi e rinunciare.

Poiché il resto del codice utilizza <CLOSE> ... probabilmente è meglio aggiungere una riga come:

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


def labelling_relabeling_regression(dataset, min_value=1, max_value=1):
dataset = dataset.rename(columns={'close': '<CLOSE>'}) //aggiungiamo questa riga per far funzionare senza problemi il resto del codice
prezzi_futuri = [ ]

per 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

restituire dataset


Grazie mille, darò un'occhiata, forse mi è sfuggito durante la modifica del codice!(
 
Yevgeniy Koshtenko #:
Grazie mille, darò un'occhiata, forse mi è sfuggito durante la modifica del codice!(

Nessun problema, signore. Un'altra raccomandazione: per coloro che non usano google colab e lavorano solo sulla propria macchina o su AWS o altro, non hanno bisogno di importare gdown

invece utilizzare quanto segue:

Primo:

import os #aggiungere questa riga alla propria area di importazione invece di import gdown


Secondo:

sostituire la seguente sezione


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

con:

#Salvare la pipeline in formato Joblib
joblib_model_path = 'rf_pipeline.joblib '
joblib.dump(pipeline, joblib_model_path)

# Convertire la pipeline in formato ONNX
initial_type = [('float_input', FloatTensorType([None, n_features]))]
onnx_model = convert_sklearn(pipeline, initial_types=initial_type )

# Salvare il modello ONNX
model_onnx_path = "rf_pipeline.onnx "
onnx.save_model(onnx_model, model_onnx_path)

# Specificare la cartella locale all'interno della directory corrente per salvare il modello
local_folder_path = './models/'# Regolare questo percorso come necessario

# Creare la cartella se non esiste
se non os.path.exists(local_folder_path):
os.makedirs(local_folder_path )

# Specificare i percorsi completi dei modelli all'interno della cartella locale
local_joblib_path = os.path.join(local_folder_path, 'rf_pipeline.joblib' )
local_onnx_path = os.path.join(local_folder_path, 'rf_pipeline.onnx' )

# Spostare i modelli nella cartella locale specificata
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(model_onnx_path, local_onnx_path)

print(f'Il modello rf_pipeline in formato Joblib è salvato localmente in: {local_joblib_path}')

print(f'Il modello rf_pipeline in formato ONNX è salvato localmente a: {local_onnx_path}')


il modello sarà memorizzato in una sottocartella chiamata /model. Questo memorizzerà anche il modello come file jplotlib, nel caso in cui sia necessario per l'esecuzione. Inoltre, entrambi i modelli possono essere eseguiti direttamente da python per ottenere le previsioni.

 
Grazie per l'articolo. Dopo aver realizzato l'apprendimento per rinforzo per il mio progetto universitario, mi sono chiesto se questo fosse possibile.
 
Shashank Rai #:

Nessun problema, signore. Un'altra raccomandazione è per coloro che non usano google colab e si limitano a eseguire sulla propria macchina o su AWS, non hanno bisogno di importare gdown.

Utilizzare invece quanto segue:

Primo:

import os #aggiungere questa riga all'ambito di importazione invece di import gdown
.


Secondo:

sostituire la seguente sezione


da:

# Salvare la pipeline in formato Joblib
joblib_model_path = 'rf_pipeline.joblib '
joblib.dump(pipeline, joblib_model_path)

# Convertire la pipeline in formato ONNX
initial_type = [('float_input', FloatTensorType([None, n_features]))]]
onnx_model = convert_sklearn(pipeline, initial_types=initial_type )

# Salvare il modello ONNX
model_onnx_path = "rf_pipeline.onnx "
onnx.save_model(onnx_model, model_onnx_path)

# Specificare una cartella locale nella directory corrente in cui salvare il modello
local_folder_path = './models/'# Personalizzare questo percorso come necessario.

# Creare una cartella se non esiste
if not os.path.exists(local_folder_path):
os.makedirs(local_folder_path )

# Specificare i percorsi completi dei modelli nella cartella locale
local_joblib_path = os.path.join(local_folder_path, 'rf_pipeline.joblib' )
local_onnx_path = os.path.join(local_folder_path, 'rf_pipeline.onnx' )

# Spostare i modelli nella cartella locale specificata
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(model_onnx_path, local_onnx_path)

print(f'Il modello rf_pipeline in formato Joblib è salvato localmente all'indirizzo: {local_joblib_path}')

print(f'Il modello rf_pipeline in formato ONNX è salvato localmente all'indirizzo: {local_onnx_path}')


Il modello sarà memorizzato nella sottodirectory /model. Questa è anche la posizione in cui il modello sarà memorizzato come file jplotlib, se dovesse servire in fase di esecuzione. Inoltre, entrambi i modelli possono essere eseguiti direttamente da python per ottenere le previsioni.

Corretto, ho inviato la versione del file tutorial al moderatore per l'approvazione.

 
Adrian Page apprendimento per rinforzo per il mio progetto all'università, mi sono chiesto se fosse possibile.

Sì, non sono ancora arrivato all'apprendimento per rinforzo))))))

 
22.04.2024 - ho cambiato i dati del dataset dal formato Excel al formato della libreria Python MetaTrader5. Inoltre, ho salvato il modello in locale (prima era salvato su Google Drive).
 
Yevgeniy Koshtenko #:

Perché non è stato utilizzato il gradient bousting come algoritmo più recente (visto che ci si lamenta che la foresta casuale è già vecchia)? È successo per caso o c'era qualche ragione? Credo che il bousting sia presente in Sklearn.

 
Aleksey Nikolayev #:

Perché non è stato utilizzato il gradient bousting come algoritmo più recente (visto che ci si lamenta che la foresta casuale è già vecchia)? È successo per caso o c'era qualche ragione? Credo che il bousting sia presente in Sklearn.

È solo che la foresta è stata scelta come semplice esempio)Boosting nel prossimo articolo, ora lo sto facendo un po')

 
Yevgeniy Koshtenko #:

Solo la foresta è stata scelta come semplice esempio)Busting nel prossimo articolo, lo sto modificando un po' ora)

Bene)