記事「Python、ONNX、MetaTrader 5:RobustScalerとPolynomialFeaturesデータ前処理を使用したRandomForestモデルの作成」についてのディスカッション

 

新しい記事「Python、ONNX、MetaTrader 5:RobustScalerとPolynomialFeaturesデータ前処理を使用したRandomForestモデルの作成」はパブリッシュされました:

この記事では、Pythonでランダムフォレストモデルを作成し、モデルを訓練して、データ前処理をおこなったONNXパイプラインとして保存します。その後、MetaTrader 5ターミナルでモデルを使用します。

ランダムフォレストは、機械学習ツールキットの強力なツールです。ランダムフォレストがどのように機能するかをよりよく理解するために、大勢の人が集まり、集団で意思決定をおこなう様子をイメージしてみましょう。ただし、このグループの各メンバーは実際の人間ではなく、現在の状況を独立して分類または予測する者です。このグループ内では、人は特定の属性に基づいて意思決定をおこなうことができる意思決定木です。ランダムフォレストが決定を下すときは、民主主義と投票が使用されます。つまり、それぞれの木が意見を表明し、複数の投票に基づいて決定が下されます。

ランダムフォレストはさまざまな分野で広く使用されており、その柔軟性により分類問題と回帰問題の両方に適しています。分類タスクでは、モデルは現在の状態がどの定義済みクラスに属するかを決定します。たとえば、金融市場では、さまざまな指標に基づいて資産を買う(クラス1)か売る(クラス0)かを決定することを意味します。

ただし、この記事では回帰問題に焦点を当てます。機械学習における回帰は、時系列の過去の値に基づいて将来の数値を予測する試みです。オブジェクトを特定のクラスに割り当てる分類の代わりに、回帰では特定の数値を予測することを目的とします。たとえば、株価の予測、気温の予測、その他の数値変数の予測などがこれに該当します。

作者: Yevgeniy Koshtenko

 
コードに1つ誤りがあった。

future_pr = dataset['<CLOSE>'].iloc[i + rand]
であるべきです:

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

でないとエラーになる:

File "C:↪Python39↩lib〙site-packages〙pandascore〙indexes〙base.py", line 3812, in get_loc
raise KeyError(key) from err
キーエラー: '<close>'

labelling_relabeling_regression関数のカラム参照が正しくありません。データセット内のカラム '<CLOSE>' にアクセスしようとしても、正しいカラム名は '<CLOSE>' ではなく 'close' であるため、pandas がそのカラムを見つけることができず、エラーが発生し続けています。大文字小文字が区別され、角括弧が追加されているため、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 = dataset.iloc[:len(future_prices)].copy()
dataset['future_price'] = future_prices

return dataset


 
Shashank Rai #:
私が見つけたコードのバグがひとつある。 は次のようになるはずだ:



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

そうしないとエラーになる:

File "C:↪Python39↩lib〙site-packages〙pandascore〙indexes〙base.py", line 3812, in get_loc
raise KeyError(key) from err
キーエラー: '<close>'

labelling_relabelling_regression関数のカラム参照が正しくありません。データセット内の'<CLOSE>'カラムにアクセスしようとしているのに、正しいカラム名は'<CLOSE>'ではなく'close'であるため、pandasがそれを見つけられないため、エラーが出続けています。大文字小文字の区別と余分な角括弧のために、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 = dataset.iloc[:len(future_prices)].copy()
dataset['future_price'] = future_prices

return dataset


コードを編集するときに見落としていたかもしれません!ありがとうございます。
 
Yevgeniy Koshtenko #:
コードを編集するときに見落としていたかもしれません。

問題ありません。google colabを使わず、自分のマシンかAWSか何かで作業している人には、gdownをインポートする必要はありません。

をインポートする必要はありません:

まず

import os #この行をimport gdown
の代わりにimportエリアに追加してください。


2つ目:

以下のセクションを


# 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フォーマットに 変換する
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: {local_joblib_path}')

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


モデルは/modelサブディレクトリというサブフォルダに保存されます。これは、実行時に必要な場合に備えて、モデルをjplotlibファイルとしても保存します。また、どちらのモデルもpythonから直接実行して予測を得ることができます。

 
記事をありがとう。大学のプロジェクトで強化学習を やった後、こんなことが可能なのかと思ったんだ。
 
Shashank Rai #:

問題ありません。もう一つのお勧めは、googleのcolabを使わず、自分のマシンやAWS上で実行する場合、gdownをインポートする必要はないということです。

代わりに以下のものを使ってください:

まず

import os #この行をimport gdownの代わりにimportスコープに追加
.


2つ目:

次のセクションを置き換える


# パイプラインをJoblib形式で保存します。
joblib_model_path = 'rf_pipeline.joblib'
joblib.dump(pipeline, joblib_model_path)

# パイプラインをONNXフォーマットに変換する
initial_type = [('float_input', FloatTensorType([なし, n_features]))]# ONNX形式に変換する。]
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}': {local_onnx_path}')


モデルは/modelサブディレクトリに保存されます。これは、実行時に必要なjplotlibファイルとしても保存されます。さらに、どちらのモデルもpythonから直接実行して予測を得ることができます。

修正しました。チュートリアルファイルのバージョンを承認のためにモデレーターに投げました。

 
Adrian Page 強化学習をしてから、そんなことができるのかと思いました。

そうですね、まだ強化学習には至っていませんが))))))

 
22.04.2024 - データセットのデータをExcel形式からPython MetaTrader5ライブラリ形式に変更。さらに、モデルをローカルに保存しました(以前はGoogle Driveに保存していました)。
 
Yevgeniy Koshtenko #:

ランダムフォレストがすでに古いと文句を言うのだから)なぜ、より新しいアルゴリズムとして勾配ブッシングが使われなかったのか?たまたまそうなったのか、それとも何か理由があったのか?sklearnにはboustingがあると思います。

 
Aleksey Nikolayev #:

ランダムフォレストがすでに古いと文句を言うのだから)なぜ、より新しいアルゴリズムとしてグラディエントブスティングが使われなかったのか?たまたまそうなったのか、それとも何か理由があったのか?sklearnにはboustingがあると思います。

ただ、簡単な例としてフォレストが選ばれただけです。)

 
Yevgeniy Koshtenko #:

単純な例として森を選んだだけだ。)

グッド)