Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 3331

 
Andrey Dik #:

Ваша веточка? Сегодня Вы много филосовских и других измышлений не по теме ветки (флуд) высказали, а как называется "несоблюдение своих же принципов"?
К тому же, как бы Кант и Диоген, а возможно и Аристотель с Пифагором, назвали бы человека, кайфующего от унижения, оскорбления и принижения достоинств и достижений другого человека?

Не знаю какого Диогена имеете в виду, но в смысле троллинга мы все дети малые в сравнении хоть с Диогеном Синопским, хоть с Диогеном Лаэртским.

Если посмотрите на даты той моей ветки, моей регистрации на ресурсе и сегодняшнюю, то станет понятнее. Через два года после регистрации надежда на возможность конструктивного и полезного общения на форуме ещё была, а через шесть с половиной - её почти не осталось. Just for fun.

 
Aleksey Vyazmikin #:

Вот спасибо, приятно, что рады за мой доход - редкое это явление!

Статья вводная - Вы правы, всё что там написал - думаю, и так понятно.

Вторая часть на модерации, там чуть интересней. Впрочем, на данный момент я отказался от описания именно своего метода, и придумал упрощённый вариант, который дал на тестах небольшой эффект. Он будет описан во второй части.

Впрочем - это тот случай, когда новые идеи занимают не более 5% текста.

Заходите по желанию читать и комментировать.

Спасибо за приглашение. Естественно, прочитал первую часть и вторую тоже прочитаю. Если возникнут какие-либо мысли по поводу текста, то обязательно поделюсь ими.
 
Forester #:

Зачем рандомно?
Цикл по всем точкам 1 класса, и измеряете расстояние до всех точек др. класса, берете минимальное расстояние.
Когда все получено, сортируете, удаляете до нужного вам расстояния, по одной паре. Если удаленная точка использовалась в другой паре, то находите освободившейся точке, новую с новым минимальным расстоянием, снова сортируете и продолжаете.
Может как то пооптимальнее можно придумать. Может и без сортировки - просто удалять до нужного расстояния.

Ех, туго до меня доходит, я так понимаю:

  1. Строим матрицу по сути расстояний - длина и ширина размером с число примеров в выборке.
  2. Строим уже новую матрицу, допустим бинарную, где единицы те точки, которые отвечают критерию "минимальное расстояние". 
  3. Как я понимаю, тут уже надо посчитать число точек в условном островке (просуммировать единицы в строках), и если их больше, чем в соседнем, а точки делятся между ними, то присвоить эти точки в кучку (кластер), где таких точек больше. Зафиксировать, что такая то точка относится к набору №n точек, и обнулить эти точки в матрицу из пункта два.
  4. Продолжать обнулять, пока точек не останется.

Правильно я понял прототип алгоритма?

Возвращаюсь к теме с такой задержкой, так как немного увлекла мысль о том, что листья в моделях CatBoost да и в других ансамблях деревьев, могут сильно коррелировать по активации, что искажает при обучении их уверенность, приводя к завышению значения в листе для модели в целом.

 
Aleksey Vyazmikin #:

Ех, туго до меня доходит, я так понимаю:

  1. Строим матрицу по сути расстояний - длина и ширина размером с число примеров в выборке.
  2. Строим уже новую матрицу, допустим бинарную, где единицы те точки, которые отвечают критерию "минимальное расстояние". 
  3. Как я понимаю, тут уже надо посчитать число точек в условном островке (просуммировать единицы в строках), и если их больше, чем в соседнем, а точки делятся между ними, то присвоить эти точки в кучку (кластер), где таких точек больше. Зафиксировать, что такая то точка относится к набору №n точек, и обнулить эти точки в матрицу из пункта два.
  4. Продолжать обнулять, пока точек не останется.

Правильно я понял прототип алгоритма?

Возвращаюсь к теме с такой задержкой, так как немного увлекла мысль о том, что листья в моделях CatBoost да и в других ансамблях деревьев, могут сильно коррелировать по активации, что искажает при обучении их уверенность, приводя к завышению значения в листе для модели в целом.

Кластеры тут не при чем. Это просто удаление ближайших точек с разными классами, противоречащих друг другу, т.е. шумовые. А потом хоть кластеризацией, хоть деревом - чем угодно обучаете.

1) Можно и матрицу, но не обязательно, а сразу находим каждой точке 0 класса самую ближайшую 1 класса, т.е. получаем сразу п.2.
3) ничего не считаем и не относим к кластерам, просто удаляем пары ближайших точек. С расстоянием меньше порога, порог в том примере хорошо подошел бы 0,6. В др. задачах видимо подбирать придется.
Если удаленная точка 1 класса участвовала в паре с другой точкой 0 класса, то она осталась без пары, ей надо найти новую ближайшую точку 1 класса (снова произвести расчет или воспользоваться матрицей, как вы предложили в п.1, если хватит памяти, думаю матрица 1млн на 1млн уже ни в какую память не влезет, до 100 тыс может быть).
4) не пока не останется, а до поргового расстояния. Если он оч. большой, то останутся только точки 1 из классов, которых изначально было больше.

Но, как я уже писал ранее, не думаю, что это удаление шума хорошая идея (см. https://www.mql5.com/ru/forum/86386/page3324#comment_50171043). Вы же не сможете этот шум удалять при прогнозировании. Дерево само пометит шумные листья тем, что даст им вероятность около 50%, а не шумные листья берите например с вероятностью одного из классов >80% (или сколько сочтете нужным).

Машинное обучение в трейдинге: теория, модели, практика и алготорговля - На рыночных данных сигналы пропадают, потому что на новых данных сигналы выходят за узкий допустимый диапазон.
Машинное обучение в трейдинге: теория, модели, практика и алготорговля - На рыночных данных сигналы пропадают, потому что на новых данных сигналы выходят за узкий допустимый диапазон.
  • 2023.10.26
  • www.mql5.com
если в работу использовать листья с высокой чистотой классов и не делить листья до 1 примера в листе. остальные как то достигли чистоты листьев например 70 - вроде неплохо. Препочитаю дерево и лист с честными 53 чистоты одного из классов
 
Forester #:
Кластеры тут не при чем. Это просто удаление ближайших точек с разными классами, противоречащих друг другу, т.е. шумовые. А потом хоть кластеризацией, хоть деревом - чем угодно обучаете.

1) Можно и матрицу, но не обязательно, а сразу находим каждой точке 0 класса самую ближайшую 1 класса, т.е. получаем сразу п.2.
3) ничего не считаем и не относим к кластерам, просто удаляем пары ближайших точек. С расстоянием меньше порога, порог в том примере хорошо подошел бы 0,6. В др. задачах видимо подбирать придется.
Если удаленная точка 1 класса участвовала в паре с другой точкой 0 класса, то она осталась без пары, ей надо найти новую ближайшую точку 1 класса (снова произвести расчет или воспользоваться матрицей, как вы предложили в п.1, если хватит памяти, думаю матрица 1млн на 1млн уже ни в какую память не влезет, до 100 тыс может быть).
4) не пока не останется, а до поргового расстояния. Если он оч. большой, то останутся только точки 1 из классов, которых изначально было больше.

Но, как я уже писал ранее, не думаю, что это удаление шума хорошая идея (см. https://www.mql5.com/ru/forum/86386/page3324#comment_50171043). Вы же не сможете этот шум удалять при прогнозировании. Дерево само пометит шумные листья тем, что даст им вероятность около 50%, а не шумные листья берите например с вероятностью одного из классов >80% (или сколько сочтете нужным).

Пока не укладывается в голову. Хорошо это всё в одном пространстве же происходит - в метрике одного предиктора, а как учитывать остальные?

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

[Удален]  
Aleksey Vyazmikin #:

Пока не укладывается в голову. Хорошо это всё в одном пространстве же происходит - в метрике одного предиктора, а как учитывать остальные?

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

https://www.mql5.com/ru/articles/9138

уже год как никому нет дела

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

поэтому пока нечего обсуждать, потому что пока нет ничего лучше


Метамодели в машинном обучении и трейдинге: Оригинальный тайминг торговых приказов
Метамодели в машинном обучении и трейдинге: Оригинальный тайминг торговых приказов
  • www.mql5.com
Метамодели в машинном обучении: Автоматическое создание торговых систем практически без участия человека — Модель сама принимает решение как торговать и когда торговать.
 
Я новичок в ML. Работаю над несколькими моделями. И в последнюю неделю появилась проблема. Ни одна модель не сохраняется в ONNX(((. Кто сталкивался? 
WARNING:tf2onnx.tf_loader:Could not search for non-variable resources. Concrete function internal representation may have changed.
ERROR:tf2onnx.tf_utils:pass1 convert failed for name: "model_3/lstm_4/PartitionedCall/while"
op: "StatelessWhile"
input: "model_3/lstm_4/PartitionedCall/while/loop_counter"
input: "model_3/lstm_4/PartitionedCall/while/maximum_iterations"
input: "model_3/lstm_4/PartitionedCall/time"
input: "model_3/lstm_4/PartitionedCall/TensorArrayV2_1"
input: "model_3/lstm_4/zeros"
input: "model_3/lstm_4/zeros_1"
input: "model_3/lstm_4/PartitionedCall/strided_slice"
input: "model_3/lstm_4/PartitionedCall/TensorArrayUnstack/TensorListFromTensor"
input: "Func/model_3/lstm_4/PartitionedCall/input/_3"
input: "Func/model_3/lstm_4/PartitionedCall/input/_4"
input: "Func/model_3/lstm_4/PartitionedCall/input/_5"
attr {
  key: "T"
  value {
    list {
      type: DT_INT32
      type: DT_INT32
      type: DT_INT32
      type: DT_VARIANT
      type: DT_FLOAT
      type: DT_FLOAT
      type: DT_INT32
      type: DT_VARIANT
      type: DT_FLOAT
      type: DT_FLOAT
      type: DT_FLOAT
    }
  }
}
attr {
  key: "_lower_using_switch_merge"
  value {
    b: false
  }
}
attr {
  key: "_num_original_outputs"
  value {
    i: 11
  }
}
attr {
  key: "_read_only_resource_inputs"
  value {
    list {
    }
  }
}
attr {
  key: "body"
  value {
    func {
      name: "while_body_149241"
    }
  }
}
attr {
  key: "cond"
  value {
    func {
      name: "while_cond_149240"
    }
  }
}
attr {
  key: "output_shapes"
  value {
    list {
      shape {
      }
      shape {
      }
      shape {
      }
      shape {
      }
      shape {
        dim {
          size: -1
        }
        dim {
          size: 128
        }
      }
      shape {
        dim {
          size: -1
        }
        dim {
          size: 128
        }
      }
      shape {
      }
      shape {
      }
      shape {
        dim {
          size: 1
        }
        dim {
          size: 512
        }
      }
      shape {
        dim {
          size: 128
        }
        dim {
          size: 512
        }
      }
      shape {
        dim {
          size: 512
        }
      }
    }
  }
}
attr {
  key: "parallel_iterations"
  value {
    i: 32
  }
}
, ex=Could not infer attribute `_read_only_resource_inputs` type from empty iterator
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-50ef5b7ad3f4> in <cell line: 87>()
     85 
     86 # Преобразовать Keras-модель в ONNX формат
---> 87 onnx_model = tf2onnx.convert.from_keras(model)
     88 
     89 # Сохранить модель в формате ONNX

8 frames
/usr/local/lib/python3.10/dist-packages/onnx/helper.py in make_attribute(key, value, doc_string, attr_type)
    874         value = list(value)
    875         if len(value) == 0 and attr_type is None:
--> 876             raise ValueError(
    877                 f"Could not infer attribute `{key}` type from empty iterator"
    878             )

ValueError: Could not infer attribute `_read_only_resource_inputs` type from empty iterator
 
Aleksey Vyazmikin #:

Пока не укладывается в голову. Хорошо это всё в одном пространстве же происходит - в метрике одного предиктора, а как учитывать остальные?

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

В примере 2 предиктора, т.е. изменяем расстояние в 2-х мерном пространстве (рассчитываем гипотенузу). Если будет 5000 признаков, значит будете измерять расстояние в 5000-мерном пространстве (как измерять - см код k-means в алглибе, там как раз это основная задача - измерять расстояния, возьмите его себе за основу).
Похоже, что корень из суммы квадратов катетов во всех пространствах https://wiki.loginom.ru/articles/euclid-distance.html

Если будете реально делать - не забудьте отнормировать предикторы, чтобы например объемы 1...100000, не проглотили в расчетах дельты цен 0,00001...0,01000.

Как это детектировать? Вот в чем вопрос. Особенно на рыночных данных, где не будет такого четкого разделения зашумленной области, как в примере. Зашумлено будет всё, процентов на 90-99.

Возможно проще воспользоваться готовыми пакетами по удалению шумных строк, может там и детектор есть...

 
Maxim Dmitrievsky #:

https://www.mql5.com/ru/articles/9138

уже год как никому нет дела

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

поэтому пока нечего обсуждать, потому что пока нет ничего лучше


Ну, почему нет дела - думаю, что просто не распространён ещё питон среди трейдеров, что бы люди переходили в активное обсуждение.
Попробую попозже на своей выборке Ваш подход.

Пробовали метод из коробки от CatBoost?

 

sibirqk #:
Они синхронизированы. Я же написал в начале поста - 'выровнял их по датам', что как раз и означает синхронизацию пар по времени.

"Но к сожалению, имхо, опять полный рандом. На картинке кусок графиков для иллюстрации."

Вы правы, не все так просто