文章 "Python、ONNX 和 MetaTrader 5:利用 RobustScaler 和 PolynomialFeatures 数据预处理创建 RandomForest 模型"

 

新文章 Python、ONNX 和 MetaTrader 5:利用 RobustScaler 和 PolynomialFeatures 数据预处理创建 RandomForest 模型已发布:

在本文中,我们将用 Python 创建一个随机森林(random forest)模型,训练该模型,并将其保存为带有数据预处理功能的 ONNX 管道。之后,我们将在 MetaTrader 5 终端中使用该模型。

随机森林是机器学习工具包中的一个强大工具。为了更好地理解它的工作原理,让我们把它想象成一大群人聚在一起集体决策。不过,这个小组中的每个成员都是当前情况的独立分类器或预测器,而不是真实的人。在这个群体中,人是一棵决策树,能够根据某些属性做出决策。当随机森林做出决策时,它会采用民主和投票的方式:每棵树都发表自己的意见,然后根据多张选票做出决策。

随机森林广泛应用于各个领域,其灵活性使其既适用于分类问题,也适用于回归问题。在分类任务中,模型会决定当前状态属于哪个预定义的类别。例如,在金融市场,这可能意味着根据各种指标决定买入(类别1)或卖出(类别0)某项资产。

不过,在本文中,我们将重点讨论回归问题。机器学习中的回归是根据时间序列过去的数值来预测其未来数值的一种尝试。在回归中,我们的目标是预测特定的数字,而不是将对象归入特定的类别。例如,这可以是预测股票价格、预测温度或任何其他数字变量。

作者:Yevgeniy Koshtenko

 
我发现代码中有一处错误:

future_pr = dataset['<CLOSE>'].iloc[i + rand]
应该是

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

否则会出错:

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

你的 labelling_relabeling_regression 函数中的列引用不正确。我不断出错是因为你试图访问数据集中的列"<CLOSE>",但 pandas 无法找到它,因为正确的列名是 "close",而不是"<CLOSE>"。它的大小写敏感性和附加的角括弧导致 pandas 抛出 KeyError。

这是个非常简单的错误,但其他人可能会感到困惑并放弃。

既然你代码的其余部分都在使用 <CLOSE> ......那最好就添加一行如下的内容:

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


def labelling_relabeling_regression(dataset, min_value=1, max_value=1)
dataset = dataset.rename(columns={'close': '<CLOSE>'})//添加此行可使代码的其余部分顺利运行
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.iloc[:len(future_prices)].copy()
dataset['future_price'] = future_prices

返回 数据集


 
Shashank Rai #:
我发现代码中有一个错误: 应该是:



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

否则会出错:

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

你的 labelling_relabelling_regression 函数中的列引用错误。我之所以不断收到错误信息,是因为您试图访问数据集中的"<CLOSE>"列,但 pandas 找不到它,因为正确的列名是 "close",而不是"<CLOSE>"。由于大小写敏感性和额外的角括弧,pandas 引发了 KeyError。

这是一个非常简单的错误,但其他人可能会感到困惑并放弃。

既然你代码的其余部分都使用了 <CLOSE> ...最好添加一行,例如

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


def labelling_relabeling_regression(dataset, min_value=1, max_value=1)
dataset = dataset.rename(columns={'close': '<CLOSE>'})// 添加此行可使代码的其余部分顺利运行
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.iloc[:len(future_prices)].copy()
dataset['future_price'] = future_prices

返回 数据集


非常感谢,我会看看的,我可能在编辑代码时漏掉了!(
 
Yevgeniy Koshtenko #:
非常感谢,我会看看的,我可能在编辑代码时漏掉了!(

没问题,先生。还有一个建议--对于那些不使用谷歌 colab,只是在自己的机器上或 AWS 上工作的人,他们不需要导入 gdown

而是使用下面的方法:

首先

import os #将此行添加到你的导入区域,而不是 import gdown


第二步

将以下部分替换为


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

替换为

# 以 joblib 格式保存管道
joblib_model_path = 'rf_pipeline.joblib'
joblib.dump(pipeline, joblib_model_path)

# 将管道转换为 ONNX 格式
initial_type = [('float_input', FloatTensorType([None, n_features]))]。
onnx_model = convert_sklearn(pipeline, initial_types=initial_type)

# 保存 ONNX 模型
model_onnx_path = "rf_pipeline.onnx"
onnx.save_model(onnx_model, model_onnx_path)

# 指定当前目录下要保存模型的本地文件夹
local_folder_path = './models/'# 根据需要调整此路径

# 如果目录不存在,则创建该目录
if not os.path.exists(local_folder_path)
os.makedirs(local_folder_path)

# 指定本地文件夹中模型的完整路径
local_joblib_path = os.path.join(local_folder_path, 'rf_pipeline.joblib')
local_onnx_path = os.path.join(local_folder_path, 'rf_pipeline.onnx')

# 将模型移至指定的本地文件夹
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(model_onnx_path, local_onnx_path)

print(f'The rf_pipeline model in Joblib format is saved locally at: {local_joblib_path}')

print(f'The rf_pipeline model in ONNX format is saved locally at: {local_onnx_path}')


模型将保存在名为 /model 子目录的子文件夹中。这也会将模型存储为 jplotlib 文件,以备运行时使用。此外,这两个模型都可以直接从 python 运行,以获得预测结果。

 
感谢您的文章。在为我的大学项目做了强化学习 之后,我确实想知道这是否可行。
 
Shashank Rai #:

没问题,先生。另一个建议是,对于那些不使用谷歌 colab,只在自己的机器上或 AWS 上运行的人来说,他们不需要导入 gdown

而是使用下面的方法:

首先

import os #将此行添加到导入范围,而不是 import gdown
.


其次

替换以下部分


# 以 joblib 格式保存管道
joblib_model_path = 'rf_pipeline.joblib'
joblib.dump(pipeline, joblib_model_path)

# 将管道转换为 ONNX 格式
initial_type = [('float_input', FloatTensorType([None, n_features])))]]]
onnx_model = convert_sklearn(pipeline, initial_types=initial_type)

# 保存 ONNX 模型
model_onnx_path = "rf_pipeline.onnx"
onnx.save_model(onnx_model, model_onnx_path)

# 指定当前目录下的本地文件夹,以便将模型保存到该文件夹中
local_folder_path = './models/'# 根据需要自定义此路径

# 如果不存在,则创建一个目录
if not os.path.exists(local_folder_path)
os.makedirs(local_folder_path)

# 指定本地文件夹中模型的完整路径
local_joblib_path = os.path.join(local_folder_path, 'rf_pipeline.joblib')
local_onnx_path = os.path.join(local_folder_path, 'rf_pipeline.onnx')

# 将模型移至指定的本地文件夹
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(model_onnx_path, local_onnx_path)

print(f'The rf_pipeline model in Joblib format is saved locally at address: {local_joblib_path}')

print(f'The rf_pipeline model in ONNX format is saved locally at address: {local_onnx_path}')


模型将保存在 /model 子目录下。如果在运行时需要,模型也将以 jplotlib 文件的形式保存在该目录中。此外,这两个模型都可以直接从 python 运行,以获得预测结果。

已更正,将教程文件版本提交版主审批。

 
Adrian Page 强化学习,我想知道这是否可行。

是的,我还没有接触过强化学习))))))。

 
22.04.2024 - 将数据集数据从 Excel 格式改为 Python MetaTrader5 库格式。此外,我将模型保存在本地(之前保存在 Google Drive 上)
 
Yevgeniy Koshtenko #:

既然你抱怨随机森林算法已经过时,为什么不使用梯度比特算法?是偶然还是另有原因?我认为 sklearn 中就有梯度漂移算法。

 
Aleksey Nikolayev #:

既然你抱怨随机森林算法已经过时,为什么不使用梯度比特算法?是偶然还是另有原因?我认为 sklearn 中就有梯度漂移算法。

只是森林被选为一个简单的例子而已。)

 
Yevgeniy Koshtenko #:

只是选择了森林作为一个简单的例子)在下一篇文章中,我将对其进行一些调整。)

好)