Обсуждение статьи "Использование ONNX-моделей в MQL5" - страница 2

 
Quantum #:

В 1-м комментарии к видео обратите внимание что нужно явно указать версию tensorflow 2.10.0

Спасибо, имею ввиду

Maxim Dmitrievsky #:
Там ведь нет смысла экспериментировать, поскольку такой прогноз не отличается от наивного (в качестве прогноза берется значение предыдущей цены закрытия). В этом случае действительно получается почти самая маленькая ошибка обучения (среднеквадратичная), ничего не говорящая о предсказательной способности модели. Скорее, обучающий пример по ONNX, что даже сложную архитектуру можно легко перенести а терминал. Не знаю что курили авторы той статьи, по исследованию нейросетевых архитектур для прогнозирования временных рядов :) здесь либо оценка нужна корректная, либо классификация вместо регрессии.

Объясните, пожалуйста, пример с картинки, где задействованы остальные 20% тестовых свечей. Это форвард? Почему прогноз почти полностью совпадает с фактическими ценами (судя по картинке, как две машки, только одна сдвинута на бар), а в тестере какая-то печаль? 

 
Ivan Butko #:

Объясните, пожалуйста, пример с картинки, где задействованы остальные 20% тестовых свечей. Это форвард? Почему прогноз почти полностью совпадает с фактическими ценами (судя по картинке, как две машки, только одна сдвинута на бар), а в тестере какая-то печаль? 

Вы сами ответили на свой вопрос, что получается запаздывающая МАшка в качестве прогноза (обычно с единичным сдвигом назад). Это известный прикол при обучении через стандартные метрики, они минимизируются именно с таким результатом.

Выше добавил ссылку где почитать про другие метрики.
 

https://stackoverflow.com/questions/65316205/implementation-os-nmae-as-metric-with-keras

from keras import backend as K
def NMSE_metric(y_true, y_pred):
    nmse = K.square(y_true - y_pred)/K.square(y_true+1e-8)
    return nmse
#define the model
model = Sequential()
model.add(Conv1D(filters=256, kernel_size=2,activation='relu',padding = 'same',input_shape=(120,1)))
model.add(MaxPooling1D(pool_size=2))
model.add(LSTM(100, return_sequences = True))
model.add(Dropout(0.3))
model.add(LSTM(100, return_sequences = False))
model.add(Dropout(0.3))
model.add(Dense(units=1, activation = 'sigmoid'))
model.compile(optimizer='adam', loss= 'mse' , metrics = [NMSE_metric])


Implementation os NMAE as metric with Keras
Implementation os NMAE as metric with Keras
  • 2020.12.16
  • Patrick Luiz Patrick Luiz 1
  • stackoverflow.com
To do so, I'm trying with this code: The NNet I'm building is this: The problem is that NMSE_metric just gave inf. Any hint?
 
Maxim Dmitrievsky #:

Вы сами ответили на свой вопрос, что получается запаздывающая МАшка в качестве прогноза (обычно с единичным сдвигом назад). Это известный прикол при обучении через стандартные метрики, они минимизируются именно с таким результатом.

Выше добавил ссылку где почитать про другие метрики.

Статья нужна на эту тему.

 
Quantum #:

Статья нужна на эту тему.

Видимо, метрики из энергетики тоже не подходят :) я не знаю хорошего решения, поэтому перешел на классификацию.
 
Maxim Dmitrievsky #:
Видимо, метрики из энергетики тоже не подходят :) я не знаю хорошего решения, поэтому перешел на классификацию.

В Google по запросу best forecast metric выводится MAPE ( Mean absolute percentage error)

People also ask
What is the most common metric used for forecast accuracy?
MAPE: Mean Absolute Percentage Error is the most widely used measure for checking forecast accuracy.  It comes under percentage errors which are scale independent and can be used for comparing series on different scales.

Для явного использования метрик в оптимизации моделей keras их нужно указывать явно в виде loss функции, а не как в #13.

Реализацию более 100 регрессионных метрик на Python можно найти здесь (Akaike Information Criterion, Aitchison distance, Amemiya's Adjusted R-squared, Amemiya's Prediction Criterion, Bias as and given by Gupta, Bayesian Information Criterion, Brier score, Pearson correlation coefficient, Centered root-mean-square (RMS) difference, Decomposed MSE developed by Kobayashi and Salam...)

Пример с оптимизацией по метрике MAPE (вместо мат.функций numpy нужно использовать keras, т.к. тензоры)

# example from https://github.com/AtrCheema/SeqMetrics/blob/master/SeqMetrics/_rgr.py
# Mean Absolute Percentage Error (MAPE)
# The MAPE is often used when the quantity to predict is known to remain way above zero_.
# It is useful when the size or size of a prediction variable is significant in evaluating the accuracy of a prediction_.
# It has advantages f scale-independency and interpretability.
# However, it has the significant disadvantage that it produces infinite or undefined values for zero or close-to-zero actual values_.
# .. _zero:
# https://doi.org/10.1016/j.neucom.2015.12.114 // Mean Absolute Percentage Error for regression models
# .. _prediction:
# https://doi.org/10.1088/1742-6596/930/1/012002 // Forecasting Error Calculation with Mean Absolute Deviation and Mean Absolute Percentage Error
# .. _values:
# https://doi.org/10.1016/j.ijforecast.2015.12.003 // A new metric of absolute percentage error for intermittent demand forecasts

from keras import backend as K
def MAPE_metric(y_true, y_pred):
    return (K.mean(K.abs((y_true - y_pred) / (y_true+1e-8)) * 100))

#define the model
model = Sequential()
model.add(Conv1D(filters=256, kernel_size=2,activation='relu',padding = 'same',input_shape=(120,1)))
model.add(MaxPooling1D(pool_size=2))
model.add(LSTM(100, return_sequences = True))
model.add(Dropout(0.3))
model.add(LSTM(100, return_sequences = False))
model.add(Dropout(0.3))
model.add(Dense(units=1, activation = 'sigmoid'))
model.compile(optimizer='adam', loss=MAPE_metric , metrics = [MAPE_metric])

как выглядит ее оптимизация

прогнозный график:


Однако при использовании MAPE при оптимизации здесь также получился сдвиг.

Возможно, нужно рассматривать более сложные направления оптимизаций в виде произведений метрик.

Тема требует детального исследования.

Обсуждение статьи "Использование ONNX-моделей в MQL5"
Обсуждение статьи "Использование ONNX-моделей в MQL5"
  • 2023.03.29
  • www.mql5.com
Опубликована статья Использование ONNX-моделей в MQL5 : Автор: MetaQuotes...
 
Quantum #:

В Google по запросу best forecast metric выводится MAPE ( Mean absolute percentage error)

Для явного использования метрик в оптимизации моделей keras их нужно указывать явно в виде loss функции, а не как в #13.

Реализацию более 100 регрессионных метрик на Python можно найти здесь (Akaike Information Criterion, Aitchison distance, Amemiya's Adjusted R-squared, Amemiya's Prediction Criterion, Bias as and given by Gupta, Bayesian Information Criterion, Brier score, Pearson correlation coefficient, Centered root-mean-square (RMS) difference, Decomposed MSE developed by Kobayashi and Salam...)

Однако при использовании MAPE при оптимизации здесь также получился сдвиг.

Возможно, нужно рассматривать более сложные направления оптимизаций в виде произведений метрик.

Тема требует детального исследования.

ИМХО, проблема всегда не в метрике, а в структуре выбранных для прогнозирования данных - в данном случае просто для примера был взят самый "прямолинейный" набор отсчетов. Попробуйте, например, сэмплировать вектора через пространство вложения (брать отсчеты с шагом где автокорреляция ряда пропадает) - получите более похожий на реальный прогноз - это означает не только отсутствие МА-подобной задержки, но и то, что он будет иногда сильно ошибаться ;-).

Если выкусить и склеить части ряда без новостного фона, результат должен быть приемлемым.

 
Stanislav Korotky #:

ИМХО, проблема всегда не в метрике, а в структуре выбранных для прогнозирования данных - в данном случае просто для примера был взят самый "прямолинейный" набор отсчетов. Попробуйте, например, сэмплировать вектора через пространство вложения (брать отсчеты с шагом где автокорреляция ряда пропадает) - получите более похожий на реальный прогноз - это означает не только отсутствие МА-подобной задержки, но и то, что он будет иногда сильно ошибаться ;-).

Для этого нужны более сложные процессы предобработки данных и отдельное рассмотрение темы. Похоже что очень многое здесь зависит от характера взаимосвязей между данными (у рынков они сложны).

Насколько я понимаю, если нет новой информации (или ее роль незначительна в смысле линейных преобразований Optimum Signal Processing, 1.4 Correlation Cancelling 1.5 Gram-Schmidt Orthogonalization), то наилучшим прогнозом будет прошлое значение (однако если она правильно учтена, то сильно ошибаться он не должен, хотя тут нужны опыты).

По метрикам ("направлениям" оптимизации весов сети) я думаю нужно разбираться (для финансовых временных рядов), вопрос требует отдельной статьи.

Приглашаем всех поделиться своим опытом.

 
Нужно взять приращения/лог приращения. Избавиться от автокорреляции/циклов/кластеризации волатильности. Тогда стандартные метрики должны работать правильно, но и ошибка увеличится соответственно.
 

Любой проект машинного обучения состоит из трех этапов:

  • препроцессинг (очень много чего)
  • выбор модели, обучение, оптимизация и т.п. 
  • внедрение

Использование ONNX моделей в мкл решает вопрос с внедрением. Правда не всех моделей и не совсем просто.

Обучение и оптимизация моделей решается отдельным процессом в Питоне.

Но из всех вышеперечисленных, первый этап - самый трудоемкий, сильно творческий и самый важный. И как раз его на мкл реализовать пока  невозможно. Не считаем же примитивное шкалирование за препроцессинг. А народная мудрость гласит: "Мусор на входе - мусор на выходе". Слишком много нужно дополнительно разработать и внедрить в МКЛ для полноценного использования МО только на МКЛ. Нельзя объять необъятное, тем более, что оно постоянно расширяется.

Поэтому для выполнения препроцесса либо делать его в другом ЯП (кто какой освоил R/Python/Julia и т.д.) либо пробовать конвертировать и его в ONNX. 

Польза от внедрения ONNX пока только в том, что научимся конвертировать, создавать, упрощать и оптимизировать модели ONNX. Может в будущем пригодится.

Причина обращения: