Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 24
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Алексей, у меня ещё вопрос по вашей функции для отсева предикторов - какой у неё должен быть интервал возвращаемых значений? Я позапускал ту фитнесс функцию на своих данных со случайными входами (fitness_f(runif(predictor_number, min = 0, max = 1))), видел результаты от 0 до 0,03. Ещё вижу в коде что в случае ошибки (ноль входов) функция вернёт тоже 0. Тут что-то не так, GenSA пытается минимизировать результат, тоесть в конце GenSA просто дойдёт до нулевого количества входов и остановится. Может тогда нужно менять знак результата фитнесс функции, чтобы генса действовало в обратном направлении?
Если фитнесс фунция в какой-то момент оптимизации начнёт возвращать отрицательные числа, и чем они ниже тем лучше - тогда сейчас всё ок.
Алексей, у меня ещё вопрос по вашей функции для отсева предикторов - какой у неё должен быть интервал возвращаемых значений? Я позапускал ту фитнесс функцию на своих данных со случайными входами (fitness_f(runif(predictor_number, min = 0, max = 1))), видел результаты от 0 до 0,03. Ещё вижу в коде что в случае ошибки (ноль входов) функция вернёт тоже 0. Тут что-то не так, GenSA пытается минимизировать результат, тоесть в конце GenSA просто дойдёт до нулевого количества входов и остановится. Может тогда нужно менять знак результата фитнесс функции, чтобы генса действовало в обратном направлении?
Если фитнесс фунция в какой-то момент оптимизации начнёт возвращать отрицательные числа, и чем они ниже тем лучше - тогда сейчас всё ок.
Блок-схема работы алгоритма на основе скорректированной взаимной информации и стохастического поиска поднабора предикторов.
Пункт «б» требует пояснения. Оптимальное количество переменных — это условная величина, которая определятся по формуле:
Интуиция в том, что, при допущении о независимости входных переменных, среднее количество уровней переменной нужно возвести в искомую степень с тем, чтобы получить общее количество уникальных взаимодействующих уровней такое, чтобы на каждом из них в среднем концентрировалось не менее n наблюдей, где n принято за 100.
Мы не можем слишком много входных переменных с большим количеством уровней, так как консервативная оценка частоты наблюдений по входным уровням получится слишком маленькая для того, чтобы дать статистическое заключение о зависимости выходной переменной от набора входных.
При этом, устанавливая порог, выше которого значения вектора длиной в количество входных переменных будут преобразовываться в 1 (флаг включения индекса переменной), мы делаем вероятностный расчет:
Суть его сводится к тому, что мы задаем максимальное значение вероятности для отбора вычисленного оптимального количества входов. И проверяется эта логика применением биномиального распределения.
Например, возьмем наши данные: половину всего набора, которая используется для обучения.
У нас 17 973 строки, 12 предикторов, в каждом по 5 уровней. В результате применения вышеопианных формул мы получаем, что оптимальное количество предикторов равно 3,226.
Применяя формулу порога для включения предиктора в набор, получаем 0,731.
Какое наиболее вероятное количество отобранных переменных будет получено на биномиальном распределении?
Максимум приходится на 3 наблюдения. Если быть точным, то 5 ^ 3,226 даст нам 178 уровней, на которых как раз в среднем разместится по 100 наблюдений.
Да, нашёлся поднабор предикторов с отрицательным фитнесс значением. Предикторов было очень много, несколько тысяч, я ограничил 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% - это насколько точно описываются именно исходные данные, используя эти самые компоненты. А точность предсказания с этим вообще не связана.
Да, нашёлся поднабор предикторов с отрицательным фитнесс значением. Предикторов было очень много, несколько тысяч, я ограничил 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, и наверное больше.
Это я ещё не понял. (я сейчас буду писать только про 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 и получаю три таблицы:
У последней 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/
Долго искал эту таблицу, наконец нашёл в summary. Самое очевидное место на самом деле :) , спасибо что показали. Это тот случай когда что-то есть в summary, но нету в аттрибутах объекта.
У той статьи оказывается есть продолжение, посвящённое именно вопросу выбора компонент, с каким-то особенным решением для Y-aware. Ещё не пробовал.
http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/
Да, нашёлся поднабор предикторов с отрицательным фитнесс значением. Предикторов было очень много, несколько тысяч, я ограничил 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% - это насколько точно описываются именно исходные данные, используя эти самые компоненты. А точность предсказания с этим вообще не связана.