Визуализация: графики данных и скользящее среднее
Разработка функций с помощью 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, особенно Остина Хаббелла и Влада Ариалина, которые любезно предоставили данные и щедро уделили время. Я также хотел бы поблагодарить своего наставника Амита за то, что он помог мне, когда я застрял, и указал мне правильное направление.