Недостаточно иметь данные, вам нужен MVD (Minimum Viable Data)

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

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

В нашем примере нам нужно решить, какие столбцы достаточно важны, чтобы повлиять на наше поле прогноза (цена закрытия). Эти столбцы в машинном обучении также называются функциями, а поле прогноза — меткой.

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

dataFrame = dataFrame[['Adj. Open',  'Adj. High',  'Adj. Low',  'Adj. Close', 'Adj. Volume']]

Наша таблица dataFrame выглядит так:

Недостаточно иметь данные, вам нужен MVD (Minimum Viable Data). Как и MVP (минимально жизнеспособный продукт), MVD подталкивает вас к тому, чтобы столкнуться с большими данными и взять минимальные данные, на которые, по вашему мнению, опирается ваша этикетка (цена закрытия).

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

Можно сказать, что волатильность, такая как изменение High минус Low %, принесет в таблицу более ценную информацию. Ради этого примера давайте поработаем с данными. Мы создадим еще две функции: HighLowPrecentage и CloseOpenPrecentage. Теперь мы можем оставить только наши функции MVD («Adj. Close», «HighLowPrecentage», «CloseOpenPrecentage» и «Adj. Volume»)

dataFrame['HighLowPrecentage '] = (dataFrame['Adj. High'] - dataFrame['Adj. Low']) / dataFrame['Adj. Low'] * 100.0
dataFrame['CloseOpenPrecentage'] = (dataFrame['Adj. Close'] - dataFrame['Adj. Open']) / dataFrame['Adj. Open'] * 100.0
 
dataFrame= dataFrame[['Adj. Close', 'HL_PCT', 'PCT_change', 'Adj. Volume']]

В большинстве случаев в наших функциях будут отсутствовать данные. Хорошей практикой является заполнение отсутствующих данных числами, которые наша машина будет рассматривать как шум и игнорировать. Таким образом, нам не придется выбрасывать хорошие данные. Заполнение недостающих данных числом можно увидеть здесь:

dataFrame.fillna(value=-99999, inplace=True)

Поскольку наш KPI для POC/MVD был прогнозом на 1 день вперед (см. предыдущий пост), мы добавим в наш набор данных дополнительный столбец, который будет нашей меткой. Эта метка будет «Adj. Закрыть столбец, но смещен на одну запись вверх. Теперь таблица готова для предсказания. У нас есть функции, которые представляют данные за определенную дату, и метка, которая в основном представляет собой цену закрытия следующего дня.

forecast_col = 'Adj. Close'
forecast_out = 1
dataFrame['label'] = dataFrame[forecast_col].shift(-forecast_out)

Теперь мы в одном шаге от того, чтобы увидеть наш классификатор в действии — предсказание цены закрытия…

Далее прочитайте Назад в будущее (часть 3)