"Python, ONNX ve MetaTrader 5: RobustScaler ve PolynomialFeatures veri ön işleme ile bir RandomForest modeli oluşturma" makalesi için tartışma

 

Yeni makaleye göz atın: Python, ONNX ve MetaTrader 5: RobustScaler ve PolynomialFeatures veri ön işleme ile bir RandomForest modeli oluşturma.

Bu makalede, Python'da bir Rastgele Orman modeli oluşturacağız, modeli eğiteceğiz ve veri ön işleme ile bir ONNX veri hattı (pipeline) olarak kaydedeceğiz. Ardından modeli MetaTrader 5 terminalinde kullanacağız.

Rastgele Orman, makine öğrenimi araç setinde güçlü bir araçtır. Nasıl çalıştığını daha iyi anlamak için, onu bir araya gelen ve ortak kararlar alan büyük bir insan grubu olarak görselleştirelim. Ancak, gerçek insanlar yerine, bu gruptaki her üye mevcut durumun bağımsız bir sınıflandırıcısı veya tahmin edicisidir. Bu grup içinde bir kişi, belirli özelliklere dayalı kararlar verebilen bir karar ağacıdır. Rastgele Orman bir karar verirken demokrasi ve oylama kullanır: her ağaç kendi görüşünü ifade eder ve çoklu oylamaya dayalı bir karar verilir.

Rastgele Orman çeşitli alanlarda yaygın olarak kullanılmaktadır ve esnekliği onu hem sınıflandırma hem de regresyon problemleri için uygun hale getirmektedir. Bir sınıflandırma görevinde model, mevcut durumun önceden tanımlanmış sınıflardan hangisine ait olduğuna karar verir. Örneğin, finans piyasasında bu, çeşitli göstergelere dayalı olarak bir varlığı alma (sınıf 1) veya satma (sınıf 0) kararı anlamına gelebilir.

Ancak bu makalede regresyon problemlerine odaklanacağız. Makine öğreniminde regresyon, bir zaman serisinin geçmiş değerlerine dayanarak gelecekteki sayısal değerlerini tahmin etme girişimidir. Nesneleri belirli sınıflara atadığımız sınıflandırma yerine, regresyonda belirli sayıları tahmin etmeyi amaçlıyoruz. Bu, örneğin, hisse senedi fiyatlarını tahmin etmek, sıcaklığı tahmin etmek veya başka herhangi bir sayısal değişken olabilir.


Yazar: Yevgeniy Koshtenko

 
Kodda bulduğum bir hata:

future_pr = dataset['<CLOSE>'].iloc[i + rand]
olmalı:

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

Aksi takdirde bir hata alırsınız:

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

labelling_relabeling_regression fonksiyonunuzda yanlış bir sütun referansı. Veri kümenizdeki '<CLOSE>' sütununa erişmeye çalıştığınız için hata almaya devam ettim, ancak pandas bunu bulamıyor çünkü doğru sütun adı '<CLOSE>' değil 'close' . Büyük/küçük harf duyarlılığı ve ek açılı parantezler pandas'ın bir KeyError atmasına neden olur.

Çok basit bir hata ancak takip eden başka birinin kafası karışabilir ve pes edebilir.

Kodunuzun geri kalanı <CLOSE> kullandığından ... muhtemelen aşağıdaki gibi bir satır eklemek daha iyidir:

veri kümesi = dataset.rename(columns={'close': '<CLOSE>'})


def labelling_relabeling_regression(dataset, min_value=1, max_value=1):
veri kümesi = veri kümesi.rename(columns={'close': '<CLOSE>'}) //kodun geri kalanının sorunsuz çalışması için bu satırı ekleyin
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 )

veri kümesi = veri kümesi.iloc[:len(future_prices)].copy( )
dataset['future_price'] = future_prices

return veri kümesi


 
Shashank Rai #:
Kodda bulduğum bir hata:

şöyle olmalıydı:

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

Aksi takdirde bir hata alırsınız:

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

labelling_relabelling_regression fonksiyonunuzda yanlış sütun referansı. Veri kümenizdeki '<CLOSE>' sütununa erişmeye çalıştığınız için hata almaya devam ettim, ancak pandas bunu bulamıyor çünkü doğru sütun adı '<CLOSE>' değil 'close'. Büyük/küçük harf duyarlılığı ve fazladan köşeli parantezler nedeniyle pandas bir KeyError atar.

Çok basit bir hata, ancak yoldan geçen başka birinin kafası karışabilir ve vazgeçebilir.

Kodunuzun geri kalanı <CLOSE> ... kullandığından gibi bir satır eklemek muhtemelen en iyisidir:

veri kümesi = dataset.rename(columns={'close': '<CLOSE>'})


def labelling_relabeling_regression(dataset, min_value=1, max_value=1):
veri kümesi = veri kümesi.rename(columns={'close': '<CLOSE>'}) //kodun geri kalanının sorunsuz çalışması için bu satırı ekleyin
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 )

veri kümesi = veri kümesi.iloc[:len(future_prices)].copy( )
dataset['future_price'] = future_prices

return veri kümesi


Çok teşekkürler, bir bakacağım, kodu düzenlerken gözden kaçırmış olabilirim!(
 
Yevgeniy Koshtenko #:
Çok teşekkürler, bir bakacağım, kodu düzenlerken gözden kaçırmış olabilirim!(

Sorun değil efendim. Bir öneri daha - google colab kullanmayan ve sadece kendi makinelerinde veya AWS'de veya başka bir şeyde çalışan kişiler için gdown'u içe aktarmalarına gerek yoktur

bunun yerine aşağıdakileri kullanın:

İlk olarak:

import os #bu satırı import gdown
yerine import alanınıza ekleyin


İkincisi:

aşağıdaki bölümü değiştirin


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

ile:

# Boru hattını Joblib biçiminde kaydedin
joblib_model_path = 'rf_pipeline.joblib '
joblib.dump(pipeline, joblib_model_path)

# Boru hattını ONNX formatına dönüştür
initial_type = [('float_input', FloatTensorType([None, n_features]))]
onnx_model = convert_sklearn(pipeline, initial_types=initial_type )

# ONNX modelini kaydedin
model_onnx_path = "rf_pipeline.onnx "
onnx.save_model(onnx_model, model_onnx_path)

# Modelin kaydedileceği geçerli dizin içindeki yerel klasörü belirtin
local_folder_path = './models/'# Bu yolu gerektiği gibi ayarlayın

# Dizin mevcut değilse oluşturun
if not os.path.exists(local_folder_path):
os.makedirs(local_folder_path )

# Yerel klasör içindeki modeller için tam yolları belirtin
local_joblib_path = os.path.join(local_folder_path, 'rf_pipeline.joblib' )
local_onnx_path = os.path.join(local_folder_path, 'rf_pipeline.onnx' )

# Modelleri belirtilen yerel klasöre taşı
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(model_onnx_path, local_onnx_path)

print(f'Joblib formatındaki rf_pipeline modeli yerel olarak şu adrese kaydedilmiştir: {local_joblib_path}')

print(f'ONNX formatındaki rf_pipeline modeli yerel olarak şu adrese kaydedilmiştir: {local_onnx_path}')


model /model alt dizini adı verilen bir alt klasörde saklanacaktır. Bu, çalışma zamanı için ihtiyaç duymanız durumunda modelinizi jplotlib dosyası olarak da saklayacaktır. Ayrıca, her iki model de tahminleri almak için doğrudan python'dan çalıştırılabilir.

 
Makale için teşekkürler. Üniversite projem için pekiştirmeli öğrenme yaptıktan sonra bunun mümkün olup olmadığını merak ettim.
 
Shashank Rai #:

Sorun değil efendim. Bir başka öneri de, google colab kullanmayan ve sadece kendi makinelerinde veya AWS'de çalışan kişiler için gdown'u içe aktarmalarına gerek olmamasıdır

Bunun yerine aşağıdakileri kullanın:

İlk olarak:

import os #bu satırı import gdown yerine import kapsamına ekleyin
.


İkincisi:

aşağıdaki bölümü değiştirin


tarafından:

# Boru hattını Joblib biçiminde kaydedin
joblib_model_path = 'rf_pipeline.joblib '
joblib.dump(pipeline, joblib_model_path)

# Boru hattını ONNX formatına dönüştürün
initial_type = [('float_input', FloatTensorType([None, n_features]))]
onnx_model = convert_sklearn(pipeline, initial_types=initial_type )

# ONNX modelini kaydedin
model_onnx_path = "rf_pipeline.onnx "
onnx.save_model(onnx_model, model_onnx_path)

# Modeli kaydetmek için geçerli dizinde yerel bir klasör belirtin
local_folder_path = './models/'# Bu yolu gerektiği gibi özelleştirin.

# Eğer mevcut değilse bir dizin oluşturun
if not os.path.exists(local_folder_path):
os.makedirs(local_folder_path )

# Yerel klasördeki modellerin tam yollarını belirtin
local_joblib_path = os.path.join(local_folder_path, 'rf_pipeline.joblib' )
local_onnx_path = os.path.join(local_folder_path, 'rf_pipeline.onnx' )

# Modelleri belirtilen yerel klasöre taşı
shutil.move(joblib_model_path, local_joblib_path)
shutil.move(model_onnx_path, local_onnx_path)

print(f'Joblib formatındaki rf_pipeline modeli yerel olarak şu adrese kaydedilmiştir: {local_joblib_path}')

print(f'ONNX formatındaki rf_pipeline modeli yerel olarak şu adrese kaydedilmiştir: {local_onnx_path}')


Model /model alt dizininde saklanacaktır. Çalışma zamanında ihtiyaç duymanız halinde modelin jplotlib dosyası olarak saklanacağı yer de burasıdır. Ayrıca, her iki model de tahminleri almak için doğrudan python'dan çalıştırılabilir.

Düzeltildi, eğitim dosyası sürümünü onay için moderatöre attı.

 
Adrian Page öğrenme yaptıktan sonra bunun mümkün olup olmadığını merak ettim.

Evet, henüz pekiştirmeli öğrenmeye geçmedim))))))

 
22.04.2024 - veri kümesi verilerini Excel formatından Python MetaTrader5 kütüphane formatına değiştirdim. Ayrıca, modeli yerel olarak kaydettim (daha önce Google Drive'a kaydedilmişti)
 
Yevgeniy Koshtenko #:

Neden daha yeni bir algoritma olarak gradyan bousting kullanılmadı (rastgele ormanın zaten eski olduğundan şikayet ettiğinize göre)? Bir anda mı oldu yoksa bir sebebi var mıydı? Sanırım sklearn'de bousting var.

 
Aleksey Nikolayev #:

Neden daha yeni bir algoritma olarak gradyan bousting kullanılmadı (rastgele ormanın zaten eski olduğundan şikayet ettiğinize göre)? Bir anda mı oldu yoksa bir sebebi var mıydı? Sanırım sklearn'de bousting var.

Sadece orman basit bir örnek olarak seçildi) Bir sonraki makalede Boosting, şimdi biraz yapıyorum)

 
Yevgeniy Koshtenko #:

Sadece orman basit bir örnek olarak seçildi) Bir sonraki makalede Busting, şimdi biraz değiştiriyorum)

İyi)