Визуализация: графики данных и скользящее среднее

Разработка функций с помощью tsfresh

Моделирование

Вывод

Первоначальный исследовательский анализ данных

Набор данных, с которым мы работаем, содержит 8773 строки и 7 столбцов. Я хочу воздержаться от подробностей о том, как увидеть измерение и любую другую базовую функцию Python, поскольку она вездесуща. Вместо этого этот блог предназначен для понимания моих знаний во время проекта/возможности наставничества.

Вот снимок набора данных

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

Второй столбец — это time_period_start, т. е. первый экземпляр даты и времени — 1/1/18 0:00, что, очевидно, является записанной датой и временем, а вторая строка — 1/1/18 1:00, что означает, что это почасовой набор данных.

Price_open — это цена открытия актива в тот конкретный час, когда были записаны данные.

Price_high — это самая высокая цена в этот конкретный час.

Price_low — самая низкая цена в течение данного часа.

Price_close — это цена закрытия актива в конце этого часа.

Volume_traded — это количество единиц валюты, торгуемых в течение каждого часа.

Извлеченный урок: часто бывает полезно установить столбец даты в качестве индекса, чтобы упростить последующие задачи визуализации (как часто бывает, ось X на графиках рассматривается как индекс фрейма данных).

Ввизуализация:

График для цены закрытия:

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

График для объема торгов:

Я хотел бы ограничиться конкретным торговым часом, когда объем превысил 2,5 миллиона, и выполнить поиск в Интернете.

Теперь мы знаем, что 13 марта 2018 года объем торгов превысил 2,5 миллиона долларов. Когда я посмотрел на данные, я заметил, что цена всех 10 крупнейших криптовалют пошла вниз. Я предполагаю, что это может иметь какое-то отношение к объему торгов BNB, хотя это не входило в рамки этого проекта.

График данных и скользящих средних за 1 день и 1 неделю:

На следующем графике я попытался показать скользящее среднее с отставанием в 1 день и 1 неделю:

Скользящее среднее. Рассчитывается на основе средних значений прошлых точек данных. В зависимости от типа инвестора вы можете установить задержку 10, 20, 50 и т. д. Скользящая средняя представлена ​​плавной линией на графике выше. По мере увеличения количества дней в наборе данных значение среднего будет меняться, что создает большее отставание.

Разработка функций с помощью tsfresh

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

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

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

Подготовка данных для извлечения признаков с помощью TSFRESH

Прежде чем мы извлечем функции с помощью tsfresh из набора данных, мы должны преобразовать его в несколько временных рядов с помощью функции сдвига. Мы используем функцию сдвига в python, чтобы взять смену в 168 часов (то есть данные за неделю) и создать функцию, в которой мы будем хранить эти новые данные.

Я хотел сделать визуальное представление того, как я преобразовывал данные из одного набора в несколько наборов.

Затем я создал фрагменты исходного набора данных, используя следующий метод

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

Зачем нам нужно создавать сдвиг в наборе данных? Tsfresh извлекает функции из срезов временных рядов, которые он принимает в трех значениях: идентификатор, дата и переменная. Каждый вернет функцию 795 для каждого идентификатора. Тем не менее, если ID имеет только один ID, он будет вычислять значения, вычисляя характеристику с самим собой, что не обязательно имеет смысл. Следовательно, мы хотим создать сдвиг. Для ID = 1 он содержит данные за одну неделю (168 экземпляров), а затем мы переместимся на один экземпляр вперед во временном порядке и снова создадим временной ряд с ID: 2, который будет иметь 168 экземпляров, а позже будет обработан каждый идентификатор. в цфреш.

Для каждого идентификатора он будет выполнять различные вычисления для выбранной нами переменной, поэтому, если 1D:1 будет иметь данные за 168 часов. Мы можем взять столько переменных, сколько захотим для процесса извлечения признаков tsfresh. Например, если мы возьмем идентификатор, дату, переменную1 и переменную2, то есть две переменные, tsfresh вычислит 795*2=1590 признаков.

Количество извлеченных признаков — 795 (предупреждение: некоторые столбцы могут иметь постоянные значения).

И для того же я сделал функцию, которая удаляет все столбцы с постоянным значением.

Снимок извлечения функции публикации набора данных:

Следующим шагом является построение модели с использованием функций, которые мы смогли вычислить с помощью tsfresh.

Ммоделирование:

Избегайте предубеждений во время разделения обучения/тестирования.

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

Да, мы можем уберечь себя от подобных результатов смещения, просто изменив гиперпараметр по умолчанию с shuffle=True на shuffle=False, и это сохранит временной порядок набора данных при выполнении разделения обучения и тестирования.

Точность и полнота чрезвычайно важны, и их построение может дать вам хорошее представление о подгонке модели.

Точные попытки ответить, какая доля положительно идентифицированных была на самом деле положительной, в нашем случае цена BNB была определена высокой, и она действительно была высокой.

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

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

plt.plot(thresholds, precision[1:] , marker=’.’,color=’y’)plt.plot(thresholds, recall[1:] , marker=’.’,color=’b’)plt.show()

См. ниже для полного понимания результата и его интерпретации.

Accuracy =TP+TN/TP+TN+FP+FN
Accuracy: Proportion of correct classifications (True positives and negatives) from the overall number of cases
Precision = TP/TP+FP
Precision: Proportion of positive identified where actually correct
Recall = TP/TP+FN
Recall: Proportion of correct positive classifications (True positives) from cases that are actually positivef1-Score = 2 * (precision * recall) / (precision + recall)f1Score: harmonic mean of precision and recall

Cзаключение:

О проекте:

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

Для не запутанной матрицы бинарных результатов мы можем использовать:

T_N, F_P, F_N, T_P=confusion_matrix(y_test,predictions).ravel()
print(T_N,F_P,F_N,T_P)
481 389 429 409

Результат матрицы путаницы больше не сбивает с толку. Здесь мы можем сделать вывод, что

T_N True Negative: эквивалентно тому, что цены были ниже текущей цены, которая была предсказана соответствующим образом.

F_P Ложное срабатывание: эквивалентно ложной тревоге, т. е. прогнозировалось, что цена актива будет выше текущей цены, но это не так, и это также называется ошибкой типа 1.

F_NЛожноотрицательный: цена актива была предсказана как ложная, но оказалось иначе.

T_PИстинный положительный результат: предполагалось, что цена актива будет высокой, и прогнозировалось, что она будет высокой.

У нас 910/798, у нас 53 процента от общего числа выявленных положительных случаев.

Далее может быть интересно собрать релевантные данные о других криптовалютах и ​​найти закономерности между ними.

О наставничестве:

У меня была возможность представить свою работу на видеоконференции, что позволило мне вырасти как оратору. Работать над сложным проектом в рамках программы наставничества — отличный опыт. Строить модели легко, но понять, как и что модель делает с набором данных, было непросто. Сотрудничество с наставником было вдохновляющим, и я настоятельно рекомендую SharpestMinds тем, кто только начинает свое путешествие по науке о данных.

Если бы я попытался сделать этот проект самостоятельно, мне пришлось бы провести исчерпывающий поиск в Интернете, просто чтобы найти решения проблем, с которыми я столкнулся, что заняло бы очень много времени. Но те, у кого есть опыт решения этих проблем, часто могут дать быстрые советы и предложения, чтобы избежать ловушек. Умение решать проблемы приходит с опытом. И один из самых важных уроков, которые я усвоил, заключается в том, что я не должен сравнивать свою первую главу с чужой 50-й главой; то есть путешествие важно, и полезно решать эти типы проблем и экспериментировать с различными моделями и наборами данных науки о данных.

Благодарности

Я хотел бы поблагодарить программу SharpestMinds за действительно отличный опыт. Я также хотел бы поблагодарить команду Consilium, особенно Остина Хаббелла и Влада Ариалина, которые любезно предоставили данные и щедро уделили время. Я также хотел бы поблагодарить своего наставника Амита за то, что он помог мне, когда я застрял, и указал мне правильное направление.