Комментарии 20
Думаю пока идёт война на Украине, курс будет только расти..
И так, гранулярность, с которой я решил начать эксперименты = 1ч. А
значит твитты также были распределены по часам. Итого за три года получилось: 26246 записей....
А значит сконкатенированные твитты нужно было преобразовать в индексы. Я воспользовался керасовским Tokenizer'ом и создал словарь, задав при
этом максимальный индекс=15000. Вначале я пробовал 10000, затем 15000.
Разницы в финальных результатах после обучения нейронки выявлено не
было. При этом Tokenizer обнаружил 47 742 уникальных значения. Далее в
целях нормализации я преобразовал индексы в OneHotEncoding (OHE). Таким
образом в качестве X я получил numpy матрицу 26246Х15000 со значениями 0
и 1.
Эта часть не очень понятна. Т.е. вы разбили твитты на слова/токены (каждый твитт представляется как вектор из токенов), верно? Как тогда вы закодировали последовательность токенов в виде one-hot вектора? Или весь твитт - это один токен? Т.е. получается, что вы подаете на вход нейросети информацию о том, какие слова есть в твитте, без структуры (порядка слов)?
Я не датасайентист, но, ИМХО, ваша модель (2 млн параметров) просто не в состоянии обрабатывать язык. Для этого я бы рекомендовал вам использовать _языковые модели_, такие как BERT (или что-то более новое). Это существенно более объемная сеть специально для Natural Language Processing.
Берете предобученный BERT, к выходу BERT добавляется классификатор из нескольких (одного? я не датасейентист) полносвязанных слоев с выходами как у вас (растет, не изменна, падает) и дообучаете на своем датасете. Примеры есть в интернете. Я так делал задачу оценки тональности текста (негативный, нейтральный, положительный). Выглядит точно так же, только данные другие.
На ваших графиках явное переобучение: на тренировочной выборке работает хорошо, на валидационной - нет. Видимо, емкость сети достаточная, чтобы просто "запомнить" все соответствия между конкретной матрицей слов конкретного твитта и изменением курса, но не способна к генерализации. Как я выше предполагаю - потому что "не понимает" язык.
У вас три класса, вероятность угадать ~33%. Accuracy 0.5 (в последнем случае где-то как раз около 0.3). Иными словами, ваша сеть не лучше просто случайного выбора.
С 2019 года биткоин вырос более, чем в 10 раз. Можно утверждать, что количество выборок, где курс растет больше, чем тех, где он падает или нейтрален. Проверьте эту гипотезу! Если у вас классы в датасете представлены не в равных долях, то нейросеть обучится плохо. Условно, она может всегда выдавать ответ "растет" вне зависимости от входных данных и угадывать лучше, чем случайный выбор (наверное, этим и объясняется, что accuracy 0.5, а не 0.33)
С 2019 года биткоин вырос более, чем в 10 раз. Можно утверждать, что количество выборок, где курс растет больше, чем тех, где он падает или нейтрален. Проверьте эту гипотезу!
вроде бы в статье есть распределение и там по росту и падению близко к паритету (правда, автор не проверил, сохраняются ли пропорции между обучающей и тестовой выборками).
кроме того, все современные пакеты умеют в stratify
Одно слово - один индекс. Одна запись - один набор индексов. Т.е. если в записи один твит из одного слова, то из 15000 колонок только одна будет равна 1, остальные 0. Два слова - две единицы.
За идею с BERT - спасибо. Беру в бэклог
Неужели есть примеры верного\удачного предсказания ИИ любого курса валюты, акции и тп?
Их скрывают.
ответ на этот вопрос надо делить на несколько частей.
1) модели предсказания вряд ли есть, т.к. надо предсказывать цену, которая есть ни что иное как производная от потока событий. поток событий предсказать не то, что бы очень возможно.
2) здесь идет скорее речь о задаче классификации реакции системы на то или иное событие. если система достаточно инерционна, то почему бы и нет. интервал в час, наверное, многовато, но пока не попробуешь - нельзя утверждать однозначно.
3) на любом рынке, будь то акции, облигации, фьючерсы, криптовалюты и т.п. распределение доходностей (aka изменений цен) сильно неравномерно, с толстыми хвостами распределения, поэтому само по себе accuracy тут не решает - модель может 99 раз угадать, но на 100ый потерять все заработанное и еще полдепозита.
курс битка определяется не твитами, а "китами", и ведут они курс туда, где можно больше "сбрить" ликвидности с толпы
Можно попробовать отбрасывать лидеров мнений, может кого-то ошибочно занесли.
Попытка зачетная.
1. Модели действительно переобучаются. Значит их надо упрощать.
2. Возможно основная проблема мешающая принципиальной возможности предсказать курс по высказываниям - это временной лаг.
Кто-то обсуждал долгосрочный курс, кто-то краткосрочный. Часовая привязка скорее характерна паническому поведению. А такое на рынке случается не так уж и часто. Как вариант можно попробовать дневки.
3. Можно попробовать оптимизировать архитектуру через https://github.com/509981/kerasin
С одной стороні - очень серьезная работа, и инструментарий, с другой - я совершенно не уловил смысл токенизации твитов. Ведь это слишком сложно уловить смысл твита. Мое предложение - первым этапом сделать все то же самое, но упростить - просто оценить зависимость при помощи нейронки от самого факт появления твита кого-то из указаных лидеров мнений, включающего "BTC" или "crypto", или "coin" на любое значимое изменение курса коина через n-часов. Подобрать n, конечно.
А правильных ответов на проверочной выборке больше на 5/10 эпохе или на 50? С первого взгляда похоже на переобучение. Можно попробовать поделить на 5 семплов, и посмотреть на их скоры. Возможно дело в датасете
Читайте про overfit. У вас уже на 10-той эпохе все очень плохо.
Учить миллион коэффициентов на 100к точек - не самая разумная идея.
У меня была идея анализировать твиты при помощи textqa от deeppavlov
Составляем набор вопросов. Получаем ответы на вопросы по каждому твиту. И уже эти ответы отправляем в catboost regressor для прогнозирования курса по каждому твиту.
Можно даже подумать над автоматическим формированием вопросов, например, на основании комментариев.
ИИ для прогнозирования тренда стоимости Bitcoin на данных Twitter. ч.1