Discussão do artigo "Python, ONNX e MetaTrader 5: Montando um modelo RandomForest com pré-processamento de dados via RobustScaler e PolynomialFeatures"

 

Novo artigo Python, ONNX e MetaTrader 5: Montando um modelo RandomForest com pré-processamento de dados via RobustScaler e PolynomialFeatures foi publicado:

Neste artigo, vamos desenvolver um modelo de floresta aleatória usando Python. Vamos treinar esse modelo e salvá-lo como um pipeline ONNX, já incluindo etapas de pré-processamento de dados. Depois, esse modelo será aplicado diretamente no terminal do MetaTrader 5.

A floresta aleatória, também conhecida como RandomForest, constitui uma ferramenta essencial no campo do aprendizado de máquina. Para compreender seu funcionamento, podemos imaginar um grande grupo de indivíduos tomando decisões coletivas — no entanto, ao invés de pessoas, cada membro deste grupo é um classificador independente ou um avaliador da situação vigente. Nesse coletivo, os indivíduos são árvores de decisão, cada uma analisando características específicas para tomar suas decisões. A tomada de decisão na floresta aleatória segue um processo democrático de votação, onde cada árvore contribui com seu voto para formar a decisão final baseada na maioria.

Devido à sua versatilidade, a floresta aleatória é extensivamente aplicada em diversas áreas, sendo particularmente útil tanto para classificação quanto para regressão. Em tarefas de classificação, por exemplo, o modelo pode determinar a que categoria pertence uma situação específica, como no mercado financeiro, onde decide se uma ação deve ser comprada (classe 1) ou vendida (classe 0), com base em um conjunto de características.

Neste artigo, vamos explorar mais a fundo a tarefa de regressão. A regressão em aprendizado de máquina visa prever valores numéricos futuros, como preços de ações ou temperaturas, baseando-se em dados históricos. Diferente da classificação, que distribui objetos em categorias fixas, a regressão busca estimar valores numéricos específicos. Isso pode ser, por exemplo, prever os preços das ações no mercado financeiro, prever a temperatura ou qualquer outra variável numérica.

Autor: Yevgeniy Koshtenko

 
Encontrei um erro no código:

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

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

Caso contrário, você receberá um erro:

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

Uma referência de coluna incorreta em sua função labelling_relabeling_regression. Continuei recebendo erros porque você tenta acessar a coluna '<CLOSE>' em seu conjunto de dados, mas o pandas não consegue encontrá-la porque o nome correto da coluna é 'close', e não '<CLOSE>'. Sua sensibilidade a maiúsculas e minúsculas e os colchetes angulares adicionais fazem com que o pandas lance um KeyError .

É um erro muito simples, mas outra pessoa que esteja acompanhando o processo pode ficar confusa e desistir.

Como o restante do seu código está usando <CLOSE> ... provavelmente é melhor adicionar apenas uma linha como:

conjunto de dados = conjunto de dados.rename(colunas={'close': '<CLOSE>'})


def labelling_relabeling_regression(dataset, min_value=1, max_value=1):
dataset = dataset.rename(columns={'close': '<CLOSE>'}) //adicione essa linha para que o restante do código funcione sem problemas
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 )

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

return dataset


 
Shashank Rai #:
Encontrei um erro no código:

deveria ser:

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

Caso contrário, você receberá um erro:

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

Referência de coluna incorreta em sua função labelling_relabelling_regression. Continuei recebendo erros porque você está tentando acessar a coluna '<CLOSE>' em seu conjunto de dados, mas o pandas não consegue encontrá-la porque o nome correto da coluna é 'close', não '<CLOSE>'. Devido à sensibilidade a maiúsculas e minúsculas e aos colchetes angulares extras, o pandas gera um KeyError.

Um erro muito simples, mas alguém que esteja passando por ele pode ficar confuso e desistir.

Como o restante do seu código usa <CLOSE> ... provavelmente é melhor adicionar apenas uma linha como:

conjunto de dados = conjunto de dados.rename(colunas={'close': '<CLOSE>'})


def labelling_relabeling_regression(dataset, min_value=1, max_value=1):
dataset = dataset.rename(columns={'close': '<CLOSE>'}) //adicione essa linha para que o restante do código funcione sem problemas
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 )

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

return dataset


Muito obrigado, vou dar uma olhada, talvez eu tenha perdido isso ao editar o código!
 
Yevgeniy Koshtenko #:
Muito obrigado, vou dar uma olhada, talvez eu tenha perdido isso ao editar o código!

Sem problemas, senhor. Mais uma recomendação: para as pessoas que não usam o Google Colab e trabalham em sua própria máquina ou no AWS ou algo assim, não é necessário importar o gdown

em vez disso, use o seguinte:

Primeiro:

import os #adicione esta linha à sua área de importação em vez de import gdown


Segundo:

substitua a seguinte seção


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

# Salve o pipeline no formato Joblib
joblib_model_path = 'rf_pipeline.joblib '
joblib.dump(pipeline, joblib_model_path)

# Converter o pipeline para o formato ONNX
initial_type = [('float_input', FloatTensorType([None, n_features]))]
onnx_model = convert_sklearn(pipeline, initial_types=initial_type )

# Salvar o modelo ONNX
model_onnx_path = "rf_pipeline.onnx "
onnx.save_model(onnx_model, model_onnx_path)

# Especifique a pasta local no diretório atual para salvar o modelo
local_folder_path = './models/'# Ajuste esse caminho conforme necessário

# Crie o diretório se ele não existir
if not os.path.exists(local_folder_path):
os.makedirs(local_folder_path )

# Especifique os caminhos completos para os modelos dentro da pasta 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 os modelos para a pasta local especificada
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(model_onnx_path, local_onnx_path)

print(f'O modelo rf_pipeline no formato Joblib é salvo localmente em: {local_joblib_path}')

print(f'O modelo rf_pipeline no formato ONNX é salvo localmente em: {local_onnx_path}')


o modelo será armazenado em uma subpasta chamada subdiretório /model. Isso também armazenará seu modelo como arquivo jplotlib, caso precise dele para o tempo de execução. Além disso, ambos os modelos podem ser executados diretamente do python para obter previsões.

 
Obrigado pelo artigo. Depois de fazer a aprendizagem por reforço em meu projeto universitário, eu me perguntei se isso era possível.
 
Shashank Rai #:

Sem problemas, senhor. Outra recomendação é para aqueles que não usam o google colab e apenas executam em sua máquina ou no AWS, eles não precisam importar o gdown

Em vez disso, use o seguinte:

Em primeiro lugar:

import os #adicione essa linha ao escopo de importação em vez de import gdown
.


Segundo:

substitua a seguinte seção


por:

# Salvar o pipeline no formato Joblib
joblib_model_path = 'rf_pipeline.joblib '
joblib.dump(pipeline, joblib_model_path)

# Converter o pipeline para o formato ONNX
initial_type = [('float_input', FloatTensorType([None, n_features]))]]
onnx_model = convert_sklearn(pipeline, initial_types=initial_type )

# Salvar o modelo ONNX
model_onnx_path = "rf_pipeline.onnx "
onnx.save_model(onnx_model, model_onnx_path)

# Especifique uma pasta local no diretório atual para salvar o modelo
local_folder_path = './models/'# Personalize esse caminho conforme necessário.

# Crie um diretório se ele não existir
if not os.path.exists(local_folder_path):
os.makedirs(local_folder_path )

# Especifique os caminhos completos para os modelos na pasta 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 os modelos para a pasta local especificada
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(model_onnx_path, local_onnx_path)

print(f'O modelo rf_pipeline no formato Joblib é salvo localmente no endereço: {local_joblib_path}')

print(f'O modelo rf_pipeline no formato ONNX é salvo localmente no endereço: {local_onnx_path}')


O modelo será armazenado no subdiretório /model. É também nesse local que o modelo será armazenado como um arquivo jplotlib, caso você precise dele em tempo de execução. Além disso, ambos os modelos podem ser executados diretamente do python para obter previsões.

Corrigido, enviei a versão do arquivo do tutorial ao moderador para aprovação.

 
Adrian Page a aprendizagem por reforço para meu projeto na universidade, fiquei imaginando se isso seria possível.

Sim, ainda não cheguei ao aprendizado por reforço))))))

 
22.04.2024 - alterei os dados do conjunto de dados do formato Excel para o formato da biblioteca Python MetaTrader5. Além disso, salvei o modelo localmente (antes ele era salvo no Google Drive)
 
Yevgeniy Koshtenko #:

Por que o gradient bousting não foi usado como um algoritmo mais recente (já que você reclama que a floresta aleatória já é antiga)? Isso simplesmente aconteceu ou houve algum motivo? Acho que existe o bousting no sklearn.

 
Aleksey Nikolayev #:

Por que o gradient bousting não foi usado como um algoritmo mais recente (já que você reclama que a floresta aleatória já é antiga)? Isso simplesmente aconteceu ou houve algum motivo? Acho que existe o bousting no sklearn.

É só que a floresta foi escolhida como um exemplo simples (Boosting no próximo artigo, agora estou fazendo isso um pouco).

 
Yevgeniy Koshtenko #:

Apenas a floresta foi escolhida como um exemplo simples.) Busting no próximo artigo, estou ajustando-o um pouco agora.)

Bom)