Discusión sobre el artículo "Python, ONNX y MetaTrader 5: Creamos un modelo RandomForest con preprocesamiento de datos RobustScaler y PolynomialFeatures"

 

Artículo publicado Python, ONNX y MetaTrader 5: Creamos un modelo RandomForest con preprocesamiento de datos RobustScaler y PolynomialFeatures:

En este artículo, crearemos un modelo de bosque aleatorio en Python, entrenaremos el modelo y lo guardaremos como un pipeline ONNX con preprocesamiento de datos. Además, usaremos el modelo en el terminal MetaTrader 5.

El bosque aleatorio, o RandomForest, es una potente herramienta en el arsenal del aprendizaje automático. Para entender mejor cómo funciona, lo visualizaremos como un enorme grupo de personas que se reúnen y toman decisiones colectivas. No obstante, en lugar de personas reales, cada persona de este grupo supone un clasificador o predictor independiente de la situación actual. Dentro de este grupo, las personas son árboles de decisión, cada uno capaz de tomar decisiones basadas en determinadas características. Cuando un bosque aleatorio toma una decisión, usa el principio democrático y la votación: cada árbol expresa su opinión y se toma una decisión basada en múltiples votos.

El bosque aleatorio se ha usado ampliamente en multitud de campos, y su flexibilidad lo hace adecuado tanto para tareas de clasificación como de regresión. En una tarea de clasificación, el modelo decide a cuál de las clases predefinidas asignar el estado actual. Por ejemplo, en el mercado financiero, esto podría significar la decisión de comprar (clase 1) o vender (clase 0) un activo en función de múltiples características.

Sin embargo, en este artículo profundizaremos en el problema de la regresión. La regresión en el aprendizaje automático supone un intento de predecir los valores numéricos futuros de una serie temporal usando como base sus valores pasados. En lugar de la clasificación, en la que asignamos objetos a clases específicas, en la regresión intentamos predecir números concretos. Puede tratarse, por ejemplo, de predecir los precios de las acciones en el mercado financiero, predecir la temperatura o cualquier otra variable numérica.

Autor: Yevgeniy Koshtenko

 
Encontré un error en el código:

future_pr = dataset['<CLOSE>'].iloc[i + rand]
debería ser:

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

De lo contrario, obtendrá un error:

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

Una referencia de columna incorrecta en tu función labelling_relabeling_regression. Seguía obteniendo errores porque intenta acceder a la columna '<CIERRE>' en su conjunto de datos, pero pandas es incapaz de encontrarla porque el nombre correcto de la columna es 'close' , no '<CIERRE>' . La distinción entre mayúsculas y minúsculas y los corchetes angulares adicionales hacen que pandas lance un KeyError .

Es un error muy simple pero alguien que lo siga podría confundirse y abandonar.

Dado que el resto de su código está utilizando <CLOSE> ... su probablemente mejor sólo tiene que añadir una línea como:

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


def labelling_relabeling_regression(dataset, min_value=1, max_value=1):
dataset = dataset.rename(columns={'close': '<CLOSE>'}) //añade esta línea para que el resto del código funcione sin problemas
precios_futuros = [ ]

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

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

return dataset


 
Shashank Rai #:
He encontrado un error en el código:

debería ser:

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

De lo contrario obtendrás un error:

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

Referencia de columna incorrecta en tu función labelling_relabelling_regression. Seguía obteniendo errores porque está intentando acceder a la columna '<CLOSE>' de su conjunto de datos, pero pandas no puede encontrarla porque el nombre correcto de la columna es 'close', no '<CLOSE>'. Debido a la distinción entre mayúsculas y minúsculas y los paréntesis angulares adicionales, pandas lanza un KeyError.

Un error muy simple, pero alguien que pase por allí podría confundirse y darse por vencido.

Dado que el resto de su código utiliza <CLOSE> ... probablemente sea mejor añadir una línea como:

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


def labelling_relabeling_regression(dataset, min_value=1, max_value=1):
dataset = dataset.rename(columns={'close': '<CLOSE>'}) //añade esta línea para que el resto del código funcione sin problemas
precios_futuros = [ ]

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

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

return dataset


¡¡¡Muchas gracias, le echaré un vistazo, igual se me ha pasado al editar el código!!!
 
Yevgeniy Koshtenko #:
Muchas gracias, le echaré un vistazo, ¡puede que se me pasara al editar el código!(

No hay problema señor. Una recomendación más - para aquellas personas que no utilizan google colab y sólo trabajan en su propia máquina o en AWS o algo así, no necesitan importar gdown

en su lugar utilizar lo siguiente:

Primero

import os #añade esta linea a tu area de import en lugar de import gdown


Segundo

reemplaza la siguiente sección


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

por:

#guardar el pipeline en formato Joblib
joblib_model_path = 'rf_pipeline.joblib '
joblib.dump(pipeline, joblib_model_path)

# Convertir la tubería a formato ONNX
initial_type = [('float_input', FloatTensorType([None, n_features]))]
onnx_model = convert_sklearn(pipeline, initial_types=tipo_inicial )

# Guardar el modelo ONNX
model_onnx_path = "rf_pipeline.onnx "
onnx.save_model(onnx_model, model_onnx_path)

# Especifique la carpeta local dentro del directorio actual para guardar el modelo
local_folder_path = './models/'# Ajuste esta ruta según sea necesario.

# Crear el directorio si no existe
if not os.path.exists(local_folder_path):
os.makedirs(ruta_carpeta_local )

# Especificar las rutas completas para los modelos dentro de la carpeta local
local_joblib_path = os.path.join(local_folder_path, 'rf_pipeline.joblib' )
local_onnx_path = os.path.join(local_folder_path, 'rf_pipeline.onnx' )

# Mover los modelos a la carpeta local especificada
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(model_onnx_path, local_onnx_path)

print(f'El modelo rf_pipeline en formato Joblib se guarda localmente en: {ruta_joblib_local}')

print(f'El modelo rf_pipeline en formato ONNX se guarda localmente en: {local_onnx_path}')


el modelo se guardará en una subcarpeta llamada subdirectorio /model. Esto también almacenará su modelo como archivo jplotlib, en caso de que lo necesite para el tiempo de ejecución. Además, ambos modelos se pueden ejecutar directamente desde python para obtener predicciones.

 
Gracias por el artículo. Después de hacer el aprendizaje por refuerzo para mi proyecto de la uni me preguntaba si esto era posible.
 
Shashank Rai #:

No hay problema señor. Otra recomendación es para aquellos que no utilizan google colab y sólo se ejecutan en su máquina o en AWS, no necesitan importar gdown

En su lugar utilicen lo siguiente:

Primero:

import os #añade esta línea al ámbito de importación en lugar de import gdown
.


Segundo:

reemplazar la siguiente sección


por:

# Guardar el pipeline en formato Joblib
joblib_model_path = 'rf_pipeline.joblib '
joblib.dump(pipeline, joblib_model_path)

# Convierte la tubería a formato ONNX
initial_type = [('float_input', FloatTensorType([None, n_features]))]]
onnx_model = convert_sklearn(pipeline, initial_types=tipo_inicial )

# Guardar el modelo ONNX
model_onnx_path = "rf_pipeline.onnx "
onnx.save_model(onnx_model, model_onnx_path)

# Especificar una carpeta local en el directorio actual para guardar el modelo en
local_folder_path = './models/'# Personalice esta ruta según sea necesario.

# Crear un directorio si no existe
if not os.path.exists(local_folder_path):
os.makedirs(ruta_carpeta_local )

# Especificar las rutas completas a los modelos en la carpeta local
local_joblib_path = os.path.join(local_folder_path, 'rf_pipeline.joblib' )
local_onnx_path = os.path.join(local_folder_path, 'rf_pipeline.onnx' )

# Mover los modelos a la carpeta local especificada
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(model_onnx_path, local_onnx_path)

print(f'El modelo rf_pipeline en formato Joblib se guarda localmente en la dirección: {ruta_joblib_local}')

print(f'El modelo rf_pipeline en formato ONNX se guarda localmente en la dirección: {local_onnx_path}')


El modelo se guardará en el subdirectorio /model. Aquí es también donde el modelo se almacenará como un archivo jplotlib, en caso de que lo necesite en tiempo de ejecución. Además, ambos modelos pueden ejecutarse directamente desde python para obtener predicciones.

Corregido, lanzada la versión del archivo tutorial al moderador para su aprobación.

 
Adrian Page aprendizaje por refuerzo para mi proyecto en la universidad, me preguntaba si era posible.

Sí, todavía no he llegado al aprendizaje por refuerzo))))))

 
22.04.2024 - cambié los datos del conjunto de datos del formato Excel al formato de la biblioteca Python MetaTrader5. Además, he guardado el modelo localmente (antes se guardaba en Google Drive).
 
Yevgeniy Koshtenko #:

¿Por qué no se utilizó el gradient bousting como algoritmo más reciente (ya que te quejas de que random forest ya es antiguo)? ¿Simplemente ocurrió o hubo alguna razón? Creo que hay bousting en sklearn.

 
Aleksey Nikolayev #:

¿Por qué no se utilizó el gradient bousting como algoritmo más reciente (ya que te quejas de que random forest ya es antiguo)? ¿Simplemente ocurrió o hubo alguna razón? Creo que hay bousting en sklearn.

Es sólo que el bosque fue elegido como un ejemplo sencillo)Boosting en el próximo artículo, ahora lo estoy haciendo un poco)

 
Yevgeniy Koshtenko #:

Sólo el bosque fue elegido como un ejemplo sencillo)Busting en el próximo artículo, estoy retocando un poco ahora)

Bueno)