기고글 토론 "파이썬, ONNX 및 MetaTrader 5: RobustScaler 및 PolynomialFeatures 데이터 전처리를 사용하여 RandomForest 모델 만들기"

 

새로운 기고글 파이썬, ONNX 및 MetaTrader 5: RobustScaler 및 PolynomialFeatures 데이터 전처리를 사용하여 RandomForest 모델 만들기 가 게재되었습니다:

이 글에서는 Python으로 랜덤 포레스트 모델을 만들고 모델을 학습시킨 다음 데이터 전처리를 통해 ONNX 파이프라인으로 저장하는 방법을 살펴봅니다. 그 후 우리는 MetaTrader 5 터미널에서 이 모델을 사용할 것입니다.

랜덤 포레스트는 머신러닝 툴킷의 강력한 도구입니다. 어떻게 작동하는지 더 잘 이해하기 위해 거대한 그룹이 함께 모여 집단적인 의사 결정을 내리는 것으로 시각화해 보겠습니다. 그러나 이 그룹의 각 구성원은 실제 사람이 아니라 현재 상황을 독립적으로 분류하거나 예측하는 역할을 합니다. 이 그룹 내에서 사람은 특정 속성을 기반으로 의사 결정을 내릴 수 있는 의사 결정 트리입니다. 랜덤 포레스트는 의사 결정을 내릴 때 민주주의와 투표를 사용합니다. 각 나무가 의견을 표현하고 결정은 다수의 투표를 바탕으로 내려집니다.

랜덤 포레스트는 다양한 분야에서 널리 사용되고 있으며 그 유연성으로 인해 분류 및 회귀 문제 모두에 적합합니다. 분류 작업에서 모델은 현재 상태가 미리 정의된 클래스 중 어느 클래스에 속하는지 결정합니다. 예를 들어 금융 시장에서는 다양한 지표를 바탕으로 자산을 매수(1등급)하거나 매도(0등급)하는 결정을 내리는 것을 의미할 수 있습니다.

하지만 이 글에서 우리는 회귀 문제에 초점을 맞추겠습니다. 머신 러닝의 회귀는 과거의 값을 기반으로 시계열의 미래의 수치를 예측하려는 시도입니다. 객체를 특정 클래스에 할당하는 분류 대신 회귀에서는 특정 숫자를 예측하는 것을 목표로 합니다. 예를 들어 주가 예측, 기온 예측 또는 기타 수치 변수를 예측할 수 있습니다.


작성자: Yevgeniy Koshtenko

 
코드에서 한 가지 오류를 발견했습니다:

future_pr = dataset['<CLOSE>'].iloc[i + rand]
가 있어야 합니다:

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

그렇지 않으면 오류가 발생합니다:

파일 "C:\Python39\lib\사이트-패키지\팬더\코어\인덱스\베이스.py", 3812줄, get_loc에서
err에서 키 에러(키)를 발생시킵니다.
키 에러: '<닫기> '

라벨링_재라벨링_회귀 함수에 잘못된 열 참조가 있습니다. 데이터 세트에서 '<CLOSE>' 열에 액세스하려고 하는데 올바른 열 이름이 '<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 = dataset.iloc[:len(future_prices)].copy( )
dataset['future_price'] = future_prices

반환 데이터셋


 
Shashank Rai #:
코드에서 발견한 버그 하나:



이 되어야 합니다.
future_pr = dataset['close'].iloc[i + rand ]입니다.

그렇지 않으면 오류가 발생합니다:

파일 "C:\Python39\lib\사이트-패키지\팬더\코어\인덱스\베이스.py", 3812줄, get_loc에서 다음과 같은 오류가 발생합니다.
err에서 KeyError(키)를 발생시킵니다.
키 에러: '<닫기> '

라벨링_재라벨링_회귀 함수에 잘못된 열 참조가 있습니다. 데이터 세트의 '<CLOSE>' 열에 액세스하려고 하는데 올바른 열 이름이 '<CLOSE>'가 아니라 'close'이기 때문에 판다가 열을 찾을 수 없어 오류가 계속 발생하고 있습니다. 대소문자 구분과 추가 꺾쇠 괄호로 인해 팬더는 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

반환 데이터셋


감사합니다, 제가 코드를 편집할 때 놓쳤을지도 모르겠네요!(
 
Yevgeniy Koshtenko #:
감사합니다, 코드 편집할 때 놓친 것 같습니다!(

문제 없습니다. 한 가지 더 권장 사항 - 구글 콜랩을 사용하지 않고 자체 머신이나 AWS 등에서 작업하는 경우 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'Joblib 형식의 rf_pipeline 모델이 로컬에 저장됩니다: {local_joblib_path}')

print(f'ONNX 형식의 rf_pipeline 모델이 로컬에 저장됩니다: {local_onnx_path}')


모델은 /model 하위 디렉터리라는 하위 폴더에 저장됩니다. 또한 런타임에 필요한 경우를 대비하여 모델을 jplotlib 파일로 저장합니다. 또한 두 모델 모두 파이썬에서 직접 실행하여 예측을 얻을 수 있습니다.

 
기사 감사합니다. 유니 프로젝트를 위해 강화 학습을 한 후 이것이 가능한지 궁금했습니다.
 
Shashank Rai #:

문제 없습니다. 또 다른 권장 사항은 Google colab을 사용하지 않고 자체 머신이나 AWS에서 실행하는 경우 gdown을 가져올 필요가 없다는 것입니다.

대신 다음을 사용하세요:

첫째:

import os #임포트 범위 대신 이 줄을 가져오기 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'Joblib 형식의 rf_pipeline 모델이 주소에 로컬로 저장됩니다: {local_joblib_path}')

print(f'ONNX 형식의 rf_pipeline 모델이 주소에 로컬로 저장됩니다: {local_onnx_path}')


모델은 /model 하위 디렉터리에 저장됩니다. 이 디렉터리는 런타임에 필요한 경우 모델이 jplotlib 파일로 저장되는 곳이기도 합니다. 또한 두 모델 모두 파이썬에서 직접 실행하여 예측을 얻을 수 있습니다.

수정하고 튜토리얼 파일 버전을 운영자에게 제출하여 승인을 받았습니다.

 
Adrian Page 강화 학습을 한 후 이것이 가능한지 궁금했습니다.

네, 아직 강화 학습을 해본 적이 없습니다))))))

 
22.04.2024 - 데이터 세트 데이터를 Excel 형식에서 Python MetaTrader5 라이브러리 형식으로 변경했습니다. 또한 모델을 로컬에 저장했습니다(이전에는 Google 드라이브에 저장).
 
Yevgeniy Koshtenko #:

왜 그라데이션 부스팅이 최신 알고리즘으로 사용되지 않았나요(랜덤 포레스트가 이미 오래되었다고 불평하시니까요)? 그냥 그렇게 된 건가요 아니면 다른 이유가 있나요? 스클린에 바우스팅이 있는 것 같아요.

 
Aleksey Nikolayev #:

왜 그라데이션 부스팅이 최신 알고리즘으로 사용되지 않았나요(랜덤 포레스트가 이미 오래되었다고 불평하시니까요)? 그냥 그렇게 된 건가요 아니면 다른 이유가 있나요? 스클린에 바우스팅이 있는 것 같아요.

단순한 예로 숲이 선택된 것뿐입니다)다음 기사에서 부스팅, 이제 조금하고 있습니다)

 
Yevgeniy Koshtenko #:

간단한 예로 숲만 선택했습니다)다음 글에서 설명하겠습니다, 지금은 약간 수정 중입니다)

Good)