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

 

Алексей, у меня ещё вопрос по вашей функции для отсева предикторов - какой у неё должен быть интервал возвращаемых значений? Я позапускал ту фитнесс функцию на своих данных со случайными входами (fitness_f(runif(predictor_number, min = 0, max = 1))), видел результаты от 0 до 0,03. Ещё вижу в коде что в случае ошибки (ноль входов) функция вернёт тоже 0. Тут что-то не так, GenSA пытается минимизировать результат, тоесть в конце GenSA просто дойдёт до нулевого количества входов и остановится. Может тогда нужно менять знак результата фитнесс функции, чтобы генса действовало в обратном направлении?
Если фитнесс фунция в какой-то момент оптимизации начнёт возвращать отрицательные числа, и чем они ниже тем лучше - тогда сейчас всё ок.

 
Dr.Trader:

Алексей, у меня ещё вопрос по вашей функции для отсева предикторов - какой у неё должен быть интервал возвращаемых значений? Я позапускал ту фитнесс функцию на своих данных со случайными входами (fitness_f(runif(predictor_number, min = 0, max = 1))), видел результаты от 0 до 0,03. Ещё вижу в коде что в случае ошибки (ноль входов) функция вернёт тоже 0. Тут что-то не так, GenSA пытается минимизировать результат, тоесть в конце GenSA просто дойдёт до нулевого количества входов и остановится. Может тогда нужно менять знак результата фитнесс функции, чтобы генса действовало в обратном направлении?
Если фитнесс фунция в какой-то момент оптимизации начнёт возвращать отрицательные числа, и чем они ниже тем лучше - тогда сейчас всё ок.

Вопрос хороший. Разбираетесь.

Я пишу статью про этот метод и вот выдержка:


Блок-схема работы алгоритма на основе скорректированной взаимной информации и стохастического поиска поднабора предикторов.


  • а) Привести набор данных к категориальному виду одним из известных способов.
  • б) Оценить такие параметры набора данных, как количество строк, предикторов, среднее количество уровней предикторов (если они имеют разное количество уровней) и на основе этих данных посчитать «оптимальное количество» предикторов в финальном поднаборе.
  • в) Инициализировать вектор типа numeric длиной в количество входных переменных набора с помощью случайных чисел, равномерно распределенных в диапазоне [0, 1] и зададим нижнюю (0) и верхнуюю (1) границу для значений вектора — это аргумент функции SA.
  • г) Инициализировать функции оценки квантиля мультиинформации, квантиля взаимной информации, фитнесс-функцию, объединяющую все расчеты.
  • д) Задать количество симуляций Монте-Карло для оценки квантилей МИ и ВИ; задать квантили (например, 0.9) для шумовых значений МИ и ВИ.
  • е) Задать время или количество итераций работы алгоритма. Чем больше, тем лучше.
  • ж) Запустить алгоритм, дождаться результатов.


Пункт «б» требует пояснения. Оптимальное количество переменных — это условная величина, которая определятся по формуле:

optim_var_num < — log(x = sample_size / 100, base = round(mean_levels, 0))


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

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

При этом, устанавливая порог, выше которого значения вектора длиной в количество входных переменных будут преобразовываться в 1 (флаг включения индекса переменной), мы делаем вероятностный расчет:

threshold < — 1 — optim_var_num / predictor_number


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

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

У нас 17 973 строки, 12 предикторов, в каждом по 5 уровней. В результате применения вышеопианных формул мы получаем, что оптимальное количество предикторов равно 3,226. 

Применяя формулу порога для включения предиктора в набор, получаем 0,731. 

Какое наиболее вероятное количество отобранных переменных будет получено на биномиальном распределении?


Максимум приходится на 3 наблюдения. Если быть точным, то 5 ^ 3,226 даст нам 178 уровней, на которых как раз в среднем разместится по 100 наблюдений.
 
Продолжаю. Значение 0 на выходе функции это самое плохое максимальное значение. Если ни один элемент вектора par не пробьет threshold, автоматически значение 0. Лучшее возможное значение -1. Означает полную детерминированность выхода от поднабора входов.
 

Да, нашёлся поднабор предикторов с отрицательным фитнесс значением. Предикторов было очень много, несколько тысяч, я ограничил gensa всего 2 итерациями, на всё ушло 8 часов :). Результат фитнесс функции - 6%. На фронттесте на этих предикторах с nnet получил ошибку 45%. Это мало, не думаю что советник был бы в прибыли. Поставил ограничение снова в 10 итераций, чтобы найти результат лучше, запустил, уже сутки жду, надеюсь gensa когда-нибудь завершится. Надо попробовать генетику (библиотека GA), его работа с несколькими потоками будет быстрее (GA минимизирует а не максимизирует результат, тоесть результату фитнесс функции для GA надо менять знак). Буду экспериментировать дальше.

Почитал разные статьи про модель главных компонент, попробовал теперь не только обучать модель для измерения R^2 и его максимизации путём выбора предикторов, но и реально тестировать модель на фронттест данных. Выходит как-то неоднозначно. С одной стороны я добился увеличения R^2 модели путём удаления коррелирующих пар предикторов (функция findCorrelation из бибилотеки caret), но как оказалось R^2 при тесте модели на фронттест данных от этого падает. Чудо не произошло, PCA модель тоже переобучается. Хочу попробовать более сложную оценку предикторов - разбить обучающую выборку на две - для собственно тренировки и для валидации, Обучать PCA модель, затем сразу тестировать на валидационной выборке, возвращать минимальный R^2 как итоговый результат. Если использовать такую функцию для оценки набора предикторов и максимизации этого значения, то по идее будут находиться именно те наборы предикторов, которые дают хорошие результаты и на обучаемых, и на новых данных. Надо проверять.

Ещё я видимо не так понял текст из той самой первой статьи про PCA в этой теме. Там говорилось про то что количество компонент нужно выбирать так чтобы описать 95% вариации, я думал что говорят о точности предсказания целевой переменной. Но всё не так, главные компоненты вообще строятся без учёта целевых переменных, а точность 95% - это насколько точно описываются именно исходные данные, используя эти самые компоненты. А точность предсказания с этим вообще не связана.

 
Dr.Trader:

Да, нашёлся поднабор предикторов с отрицательным фитнесс значением. Предикторов было очень много, несколько тысяч, я ограничил gensa всего 2 итерациями, на всё ушло 8 часов :). Результат фитнесс функции - 6%. На фронттесте на этих предикторах с nnet получил ошибку 45%. Это мало, не думаю что советник был бы в прибыли. Поставил ограничение снова в 10 итераций, чтобы найти результат лучше, запустил, уже сутки жду, надеюсь gensa когда-нибудь завершится. Надо попробовать генетику (библиотека GA), его работа с несколькими потоками будет быстрее (GA минимизирует а не максимизирует результат, тоесть результату фитнесс функции для GA надо менять знак). Буду экспериментировать дальше.

Почитал разные статьи про модель главных компонент, попробовал теперь не только обучать модель для измерения R^2 и его максимизации путём выбора предикторов, но и реально тестировать модель на фронттест данных. Выходит как-то неоднозначно. С одной стороны я добился увеличения R^2 модели путём удаления коррелирующих пар предикторов (функция findCorrelation из бибилотеки caret), но как оказалось R^2 при тесте модели на фронттест данных от этого падает. Чудо не произошло, PCA модель тоже переобучается. Хочу попробовать более сложную оценку предикторов - разбить обучающую выборку на две - для собственно тренировки и для валидации, Обучать PCA модель, затем сразу тестировать на валидационной выборке, возвращать минимальный R^2 как итоговый результат. Если использовать такую функцию для оценки набора предикторов и максимизации этого значения, то по идее будут находиться именно те наборы предикторов, которые дают хорошие результаты и на обучаемых, и на новых данных. Надо проверять.

Ещё я видимо не так понял текст из той самой первой статьи про PCA в этой теме. Там говорилось про то что количество компонент нужно выбирать так чтобы описать 95% вариации, я думал что говорят о точности предсказания целевой переменной. Но всё не так, главные компоненты вообще строятся без учёта целевых переменных, а точность 95% - это насколько точно описываются именно исходные данные, используя эти самые компоненты. А точность предсказания с этим вообще не связана.

Да, получается, что не поняли.

РСА можно применять как самостоятельный инструмент, но в статье это не обсуждается.

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

По моим представления это делается в следующие шаги:

1.  Y-aware. Это масштабирование предикторов в зависимости от целевой переменной

2.  С помощью алгоритма РСА упорядочивается набор предикторов и берется та часть, которая объясняются 95% дисперсии.

2. Или так (сам не разобрался) с помощью алгоритма РСА строится новый набор предикторов, которые получаются путем умножения исходного на вычисленные коэффициенты (loading). Этот набор упорядочен. Берем такое количество этих новых векторов, которые объясняют 95% дисперсии.

 

ПС.

Пошли публикации, что    Y-aware - этио новый писк в области фильтрования шумовых предикторов.

 

Успеха 

 
СанСаныч Фоменко:

2.  С помощью алгоритма РСА упорядочивается набор предикторов и берется та часть, которая объясняются 95% дисперсии.

Это я ещё не понял. (я сейчас буду писать только про y-aware подход, чтоб не путать его с другим). Сама статья тут: http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

После кода "princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" имеется такая ситуация: данные прочитаны, промасштабированы по Y, построены PC компоненты. Эта функция не ограничивает число компонент, их строится столько, сколько есть предикторов. Первым делом нужно отобрать только часть из них (рекомендуют достаточное для описания 95% вариаций). В самой статье автор посмотрел на график sdev (какие-то неуточнённые отклонения) для компонент, и сказал что ему хватит 2 или 5, потому что они выделяются на графике. У меня как-то ничего не выделяется, график плавно убывает.

Есть таблица sdev, число записей в ней равно числу компонент. Можно ли из этого посчитать сколько нужно взять компонент? Сумма всех чисел не обязательно ограничена в 1, я видел сумму 6, и наверное больше.

> princ$sdev
[1] 0.17585066 0.15322845 0.13818021 0.13090573 0.12177070 0.11854969
[7] 0.11176954 0.10910302 0.10616631 0.10265987 0.10056754 0.09441041
[13] 0.09343688 0.08832101 0.08620753 0.08235531 0.08132748 0.07992235
[19] 0.07800569 0.07575063 0.07463254 0.07311194 0.07210698 0.07032990
[25] 0.06907964 0.06763711 0.06634935 0.06544930 0.06451703 0.06260861
 
Dr.Trader:

Это я ещё не понял. (я сейчас буду писать только про y-aware подход, чтоб не путать его с другим). Сама статья тут: http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

После кода "princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" имеется такая ситуация: данные прочитаны, промасштабированы по Y, построены PC компоненты. Эта функция не ограничивает число компонент, их строится столько, сколько есть предикторов. Первым делом нужно отобрать только часть из них (рекомендуют достаточное для описания 95% вариаций). В самой статье автор посмотрел на график sdev (какие-то неуточнённые отклонения) для компонент, и сказал что ему хватит 2 или 5, потому что они выделяются на графике. У меня как-то ничего не выделяется, график плавно убывает.

Есть таблица sdev, число записей в ней равно числу компонент. Можно ли из этого посчитать сколько нужно взять компонент? Сумма всех чисел не обязательно ограничена в 1, я видел сумму 6, и наверное больше.

 Запускаю rattle и получаю три таблицы:

  • Standard deviations: здесь могут самые разные величины и говорить, что в сумме = 1 не приходится
  •  Rotation: эьл коэффициенты, на которые нужно умножить исходные векторы чтобы получить новые
  • Importance of components. то, что обсуждается 

 

У последней 1-й столбец говорит, что если взять только РС1, то будет объяснено 0.9761 изменчивости (Cumulative Proportion) , если взять ДВЕ компоненты - РС1 и РС2, то будет объяснено 0.99996 и т.д. 

(не умею вставлять таблицы) 

Importance of components:

                                        PC1     PC2     PC3      PC4      PC5

Standard deviation             2.2092 0.34555 0.01057 0.008382 0.004236

Proportion of Variance       0.9761 0.02388 0.00002 0.000010 0.000000

Cumulative Proportion       0.9761 0.99996 0.99998 1.000000 1.000000 

 

Долго искал эту таблицу, наконец нашёл в summary. Самое очевидное место на самом деле :) , спасибо что показали. Это тот случай когда что-то есть в summary, но нету в аттрибутах объекта. 

summary(princ)$importance[3,]

У той статьи оказывается есть продолжение, посвящённое именно вопросу выбора компонент, с каким-то особенным решением для Y-aware. Ещё не пробовал.

http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/  

 
Dr.Trader:

Долго искал эту таблицу, наконец нашёл в summary. Самое очевидное место на самом деле :) , спасибо что показали. Это тот случай когда что-то есть в summary, но нету в аттрибутах объекта. 

У той статьи оказывается есть продолжение, посвящённое именно вопросу выбора компонент, с каким-то особенным решением для Y-aware. Ещё не пробовал.

http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/  

В этом R как только получил какой-нибудь объект, так сразу на него натравливаешь str и summary, а еще и  plot. Много чего можно увидеть удивительного. Дело в том, что "объект" в R штука гораздо сложнее, чем во многих языках программирования.
 
Dr.Trader:

Да, нашёлся поднабор предикторов с отрицательным фитнесс значением. Предикторов было очень много, несколько тысяч, я ограничил gensa всего 2 итерациями, на всё ушло 8 часов :). Результат фитнесс функции - 6%. На фронттесте на этих предикторах с nnet получил ошибку 45%. Это мало, не думаю что советник был бы в прибыли. Поставил ограничение снова в 10 итераций, чтобы найти результат лучше, запустил, уже сутки жду, надеюсь gensa когда-нибудь завершится. Надо попробовать генетику (библиотека GA), его работа с несколькими потоками будет быстрее (GA минимизирует а не максимизирует результат, тоесть результату фитнесс функции для GA надо менять знак). Буду экспериментировать дальше.

Почитал разные статьи про модель главных компонент, попробовал теперь не только обучать модель для измерения R^2 и его максимизации путём выбора предикторов, но и реально тестировать модель на фронттест данных. Выходит как-то неоднозначно. С одной стороны я добился увеличения R^2 модели путём удаления коррелирующих пар предикторов (функция findCorrelation из бибилотеки caret), но как оказалось R^2 при тесте модели на фронттест данных от этого падает. Чудо не произошло, PCA модель тоже переобучается. Хочу попробовать более сложную оценку предикторов - разбить обучающую выборку на две - для собственно тренировки и для валидации, Обучать PCA модель, затем сразу тестировать на валидационной выборке, возвращать минимальный R^2 как итоговый результат. Если использовать такую функцию для оценки набора предикторов и максимизации этого значения, то по идее будут находиться именно те наборы предикторов, которые дают хорошие результаты и на обучаемых, и на новых данных. Надо проверять.

Ещё я видимо не так понял текст из той самой первой статьи про PCA в этой теме. Там говорилось про то что количество компонент нужно выбирать так чтобы описать 95% вариации, я думал что говорят о точности предсказания целевой переменной. Но всё не так, главные компоненты вообще строятся без учёта целевых переменных, а точность 95% - это насколько точно описываются именно исходные данные, используя эти самые компоненты. А точность предсказания с этим вообще не связана.

Я не совсем понял почему так долго. Сколько получилось optim_var_number? Должно быть в пределах 10. Ставьте на 1200 секунд и должно быть уже что-то.
Причина обращения: