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

 
elibrarius:

Преобразовывать лень)
Объясню суть:

1) сортируем столбец
2) считаем среднее количество элементов в кванте, например 10000 элеметов / 255 квантов = 39,21
3) в цикле перемещаемся на 39,21 элементов на каждом шаге и добавляем значение из отсортированного массива в массив значений квантов. Т.е. 0 значение массива = значению 0 кванта, 39-е значение = 1 кванту, 78-е = 2 кванту и т.д.

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

На каждом шаге добавляем именно  39,21 а потом сумму округляем для выбора элемента в массиве, чтобы было равномерно. Т.е. вместо 195 (39*5 = 195) элемента взять 196 ( 39,21 * 5 = (int)196,05 )

С равномерным распределением понятно - я бы в начале массив уникальных значений создал и по нему резал.

А есть же другие методы разбить сетку:

    THolder<IBinarizer> MakeBinarizer(const EBorderSelectionType type) {
        switch (type) {
            case EBorderSelectionType::UniformAndQuantiles:
                return MakeHolder<TMedianPlusUniformBinarizer>();
            case EBorderSelectionType::GreedyLogSum:
                return MakeHolder<TGreedyBinarizer<EPenaltyType::MaxSumLog>>();
            case EBorderSelectionType::GreedyMinEntropy:
                return MakeHolder<TGreedyBinarizer<EPenaltyType::MinEntropy>>();
            case EBorderSelectionType::MaxLogSum:
                return MakeHolder<TExactBinarizer<EPenaltyType::MaxSumLog>>();
            case EBorderSelectionType::MinEntropy:
                return MakeHolder<TExactBinarizer<EPenaltyType::MinEntropy>>();
            case EBorderSelectionType::Median:
                return MakeHolder<TMedianBinarizer>();
            case EBorderSelectionType::Uniform:
                return MakeHolder<TUniformBinarizer>();
        }
 
Aleksey Vyazmikin:

С равномерным распределением понятно - я бы в начале массив уникальных значений создал и по нему резал.

А есть же другие методы разбить сетку:

сэмплов должно быть много, иначе модель ничему не обучится

 
Maxim Dmitrievsky:

сэмплов должно быть много, иначе модель ничему не обучится

Это способы квантования выборки для CatBoost - именно по этим границам потом идет перебор/обучение.

Мои эксперименты показывают, что сетку нужно подбирать для каждого предиктора отдельно, тогда прирост качества наблюдается, но этого не умеет делать CatBoost, а я не умею строить сетку и мне приходится строить сетки и выгружать в csv, а потом их перебирать с целью оценки поведения в них целевых. Я думаю, что это очень перспективная фишка, но нужно перевести код на MQL.

 
Aleksey Vyazmikin:

Это способы квантования выборки для CatBoost - именно по этим границам потом идет перебор/обучение.

Мои эксперименты показывают, что сетку нужно подбирать для каждого предиктора отдельно, тогда прирост качества наблюдается, но этого не умеет делать CatBoost, а я не умею строить сетку и мне приходится строить сетки и выгружать в csv, а потом их перебирать с целью оценки поведения в них целевых. Я думаю, что это очень перспективная фишка, но нужно перевести код на MQL.

в настройках самой модели (параметрах) это есть? я хз что это

если нет в настройках, то фигня

 
Maxim Dmitrievsky:

в настройках самой модели (параметрах) это есть? я хз что это

если нет в настройках, то фигня

Есть в настройках, во всяком случае для коммандной строки

--feature-border-type

The quantization mode for numerical features.

Possible values:
  • Median
  • Uniform
  • UniformAndQuantiles
  • MaxLogSum
  • MinEntropy
  • GreedyLogSum
Quantization - CatBoost. Documentation
  • catboost.ai
Mode How splits are chosen Combine the splits obtained in the following modes, after first halving the quantization size provided by the starting parameters for each of them: Maximize the value of the following expression inside each bucket: Minimize the value of the following expression inside each bucket: Maximize the greedy approximation of...
 
Aleksey Vyazmikin:

Есть в настройках, во всяком случае для коммандной строки

--feature-border-type

The quantization mode for numerical features.

Possible values:
  • Median
  • Uniform
  • UniformAndQuantiles
  • MaxLogSum
  • MinEntropy
  • GreedyLogSum

и что, прямо сильно улучшает? должна быть разница в пределах процента

 
Aleksey Vyazmikin:

С равномерным распределением понятно - я бы в начале массив уникальных значений создал и по нему резал.

А есть же другие методы разбить сетку:

Если уникальных - то получится криво. Например, всего 100 строк из них  10 уникальных, из них 2 по 45 строк и 8 по 1. Делим на 5 квантов - вполне возможно что будут выбраны только 5 по 1, а 2 самых представительных (по 45) будут пропущены.
 
Maxim Dmitrievsky:

и что, прямо сильно улучшает? должна быть разница в пределах процента

Выбор правильного разбиения существенно влияет на результат.

Вот пример по Recall - до 50% разброс - для меня это существенно.

Увеличение границ с 16 до 512 с шагом 16 - правда на гистограмме не по порядку - у меня названия немного этому препятствуют.


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

 
elibrarius:
Если уникальных - то получится криво. Например, всего 100 строк из них  10 уникальных, из них 2 по 45 строк и 8 по 1. Делим на 5 квантов - вполне возможно что будут выбраны только 5 по 1, а 2 самых представительных (по 45) будут пропущены.

Разные подходы работают по разному эффективно на разных предикторах, поэтому я и хочу иметь разные алгоритмы, что б понять, как их лучше подбирать. Поделюсь исследованиями, если сможете код перевести в MT5.

 
Aleksey Vyazmikin:

С равномерным распределением понятно - я бы в начале массив уникальных значений создал и по нему резал.

А есть же другие методы разбить сетку:

Uniform - просто диапазон значений делим, например значения в столбце от 0 до 100, шаг кванта = 100/255 = 0,39 только не в строках, а в значениях. Т.е. 0,0.39,0,78 .... 99.61

Потом можно найти по этим значения реально присутствующие в столбце и удалить дубликаты.


UniformAndQuantiles - просто ищем половину 255/2 = 127 квантов по 1 методу и 128 по второму, и объединяем в один массив.

Остальные 3 метода сложные - я не стал смотреть.

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