Советы и рекомендации по машинному обучению

Привет! Сегодня я хочу повторить основные принципы машинного обучения, о которых я всегда должен напоминать перед началом нового проекта. Некоторые из них довольно очевидны, но это не делает их менее важными.

Данные

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

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

import pandas as pd
import numpy as np
import seaborn as sns
import pyplot as plt
ind = np.random.randint(0, X.shape[0], 100000)
df = pd.DataFrame(X[ind])
df_std = df.melt(var_name='Column', value_name='Normalized')
plt.figure(figsize=(40, 10))
ax = sns.violinplot(x='Column', y='Normalized', data=df_std)
_ = ax.set_xticklabels(df.keys(), rotation=90)

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

Всегда лучше использовать векторизованные операции в вашем конвейере. Python — очень полезный инструмент для науки о данных, но у него есть большой недостаток — слишком долгое время обработки. Циклы Python работают бесконечно долго, когда у вас есть массив с более чем 1 миллионом элементов. Иногда в начале проекта объем данных невелик, и вы можете срезать углы с помощью простой функции Python, но очень скоро, когда объем собранных данных вырастет, вы столкнетесь с узким местом в очень простых операциях. Вот почему следует подумать о поиске более оптимальных решений с программированием Numpy или Cython.

Модель

На мой взгляд, лучше начать с фреймворка, с которым вы знакомы. Например, если у вас есть опыт участия в соревнованиях Kaggle, вы, вероятно, знаете, как работать с XGBoost или LightGBM. Так что лучше сначала попробовать их, а уже потом искать более подходящие решения. Даже если у вас есть конкретные данные (временные ряды, изображения, видео), можно создать комплексные функции для моделей GBDT и получить точную основу для дальнейших исследований.

Не пренебрегайте научными статьями или общедоступными сведениями. Есть большая вероятность, что вы не первый, кто работает в этой сфере. Иногда хорошей отправной точкой является поиск научного названия вашей проблемы. Или ознакомьтесь со средними статьями с необходимыми ключевыми словами. Я обычно использую connectedpapers.com, когда нахожу интересную статью, этот сайт позволяет вам просматривать связанные статьи и делать обзор области. Интересные материалы можно найти и на arxiv-sanity.com. Это проект Андрея Карпаты.

Еще одна вещь, которой вы не должны пренебрегать, — это модели в старинном стиле. Для меня всегда интересно попробовать новые методы исследования, такие как различные типы трансформаторов или N-BEATS, но правда в том, что эти методы обычно работают с небольшим набором задач, а некоторые только с синтетическими наборами данных. Методы старого стиля, такие как GBDT, RNN, SVM или даже линейная регрессия, намного проще опробовать, их намного проще настроить, и вы можете найти гораздо больше вспомогательных материалов.