Как начать соревноваться на Kaggle?

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

адаптированный перевод статьи Chirag Chadha

kha

Chirag Chadha работает в UnitedHealth Group/Optum в Dublin, Ireland. Вы можете отправить ему email (chadhac@tcd.ie), или связаться с ним через LinkedIn, Kaggle и GitHub.

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

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

“Но что может быть веселее, чем посоревноваться со случайными незнакомцами в интернете за деньги?”

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

Первые шаги в выборе конкурса

Найдите соревнование, которое вас интересует.

Это самое важное, что нужно учитывать при начале нового конкурса. Вам понадобится около двух месяцев, чтобы разобраться в проблемах и по-настоящему освоить все нюансы работы с данными. Это вполне достаточное количество времени. Выбор соревнования, к которому вы не проявляете особого интереса, приведет к тому, что вы станете незаинтересованными и сдадитесь через несколько недель.

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

“Начав участвовать раньше, вы получите гораздо больше времени для получения базовых знаний”

Сосредоточьтесь на обучении

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

Старайтесь понять каждую строчку в лучших работах

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

Ищите какие-нибудь странные условия в правилах

Этот не так важно как остальное, но, тем не менее, стоит это упомянуть. Недавний конкурс содержал правило, которое гласило следующее:

[ваша заявка] не содержит конфиденциальной информации или коммерческой тайны и не является предметом зарегистрированного патента или рассматриваемой заявки на патент

Пользователь на форумах заявил, что это условие сделает использование выпадающих форм незаконным, поскольку эта технология запатентована Google!

​Ядра и обсуждение

Вкладки «Ядра» и «Обсуждение» должны регулярно проверяться в течение соревнования.

Начните с проверки некоторых EDA (Exploratory Data Analyses?, Exploratory Data Analysis’s?, Exploratory Data Analysii?) и измерения вашего уровня интереса в области и теме. Подумайте о любых новых идеях, которые вам нравятся, когда вы просматриваете работы других людей с точки зрения подходящих типов моделей для данных, разработки функций и т. д.

Приветственное сообщение «Welcome» на вкладке обсуждений дает отличную справочную информацию

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

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

На чем вам следует сосредоточиться?

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

Есть несколько основных вопросов, которые нужно задать в любой начальной стадии исследования:

1. Как распределяются целевые значения?
2. Есть ли существенная корреляция между признаками?
3. Есть ли пропущенные значения в данных?
4. Насколько похожи обучающие и тестовые данные?

Как распределяются целевые значения?

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

Существует ряд методов для устранения дисбаланса классов (например, SMOTE, ADASYN, удаление образцов вручную, моделирование параметров для обработки несбалансированных наборов данных), но сначала мы хотим выяснить, равномерно ли представлены классы в данных. Есть быстрый способ проверить это с помощью библиотеки графиков Seaborn, основанной на популярной программе matplotlib.

import seaborn as sns 
sns.countplot(df['target'])
Multi-class target imbalance

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

Есть ли существенная корреляция между признаками?

Вычисление коэффициента корреляции Пирсона между признаками может дать некоторые бесценные сведения о данных. Знание того, связаны ли признаки или нет, может помочь в разработке креативных признаков или удалении ненужных столбцов. Например, на графике тепловой карты, показанном ниже, EXT_SOURCE_1 – это кредитный рейтинг заявителя на получение ссуды, предоставленный внешним источником. DAYS_BIRTH, возраст заявителя в днях (отрицательное целое число), отрицательно коррелирует с EXT_SOURCE_1. Это может означать, что расчет EXT_SOURCE_1 включает возраст заявителя. Как правило, мы хотим избежать включения признака, который может быть линейно получен из другого признака (это называется линейной зависимостью), поскольку она предоставляет избыточную информацию для модели.

import seaborn as sns
import matplotlib.pyplot as plt
def correlation_map(df, columns, figsize=(15,10)):
    correlation = (df.loc[:, columns]).corr()
    fig, ax = plt.subplots(figsize = figsize)
    sns.heatmap(correlation, annot = True, ax = ax)
Correlation heatmap showing positive and negative values for Pearson correlation coefficient between numerical features

Есть ли пропущенные значения в данных?

Вначале надо всегда проверить, что у вас есть полный набор обучающих данных с как можно меньшим количеством пропущенных значений. Например, если ваша модель считает признак очень важным, но оказывается, что большое количество строк этого признака имеют пропущенные значения, вы можете значительно улучшить производительность, заполнив пропущенные значения. Это можно сделать, выведя значение признака на основе похожих строк, которые не содержат NaN. Другая стратегия (известная как обратная заливка) заключается в заполнении пропущенного значения следующим ненулевым значением. Среднее значение, медиана или модуль остальной части значений признака также иногда используется для расчета пропущенных данных. Метод pandas.DataFrame.fillna() предоставляет несколько различных опций для обработки этого сценария, и это ядро ​​Kaggle является полезным ресурсом для чтения.

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

Насколько похожи обучающие и тестовые данные?

Объект DataFrame pandas включает метод pandas.Dataframe.describe(), который предоставляет статистику по каждому признаку в наборе данных, например, максимальное, среднее, стандартное отклонение, значение 50-го процентиля и т. д. Этот метод возвращает другой DataFrame, чтобы вы могли добавить дополнительную информацию по вашему желанию. Например, у вас может быть другая строка, которая проверяет количество пропущенных значений в столбце, используя следующую функцию:

def describe_df(df):
    stats_df = df.describe()
    stats_df.append(pd.Series(df.isna().any(), name='nans'))
    return stats_df

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

Состязательная проверка включает в себя следующие этапы:

1. Объедините ваши обучающий и тестовый наборы данных в один большой набор
2. Установите целевую переменную всех строк обучающих данных на значение 0
3. Введите значение 1 для целевой переменной во всех строках тестовых данных
4. Создайте стратифицированные выборки из данных (мне нравится использовать реализацию sklearn)
5. Обучите такую ​​модель, как LightGBM, на тренировочных выборках и проверьте на тестовых.
6. Теперь сделайте прогнозы по всему набору данных и вычислите область под кривой ROC AUC. Я использую эту реализацию для расчета площади.
7. Площадь 0,5 под кривой ROC означает, что модель не может различить обучающие и тестовые строки, и, следовательно, два набора данных похожи. Если площадь больше, есть некоторые различия между обучающими и тестовыми данными, которые может видеть модель. Поэтому стоит потратить время на более детальное изучение данных, чтобы ваша модель могла хорошо прогнозировать результаты во время теста.

Я нашел следующие два материала полезными для освоения этой техники:

https://www.kaggle.com/tunguz/adversarial-santander

https://www.kaggle.com/pnussbaum/adversarial-cnn-of-ptp-for-vsb-power-v12

Зачем начинать с моделей на основе деревьев?

Выбор правильной модели для начала важен и может быть довольно затруднительным, когда вы только начинаете. Давайте снова предположим, что вы работаете со структурированными данными и хотите получить представление о своих данных, прежде чем увлекаться моделированием. Я считаю, что модель LightGBM или XGBoost отлично подходит для начала исследования, как только вы начинаете новый конкурс. Это обе модели бустинга на основе деревьев, которые легко объяснимы и понятны. Обе предлагают функциональность для просмотра своих разветвлений, так что может быть полезным создать деревья с максимальной глубиной = 3 или около того и точно посмотреть, на какие признаки разделяется модель с самого начала.
Метод lightgbm.Booster.feature_importance() показывает наиболее важные признаки модели с точки зрения количества разделений, которые модель сделала для определенного признака (importance_type=”split”), или объема информации, полученной каждым разделением для конкретного признака (importance_type=”gain”). Просмотр важности признаков особенно полезен в анонимных наборах данных, где вы можете взять 5 или около того основных признаков и сделать выводы о том, какую роль они играют с точки зрения важности для модели. Это может значительно помочь в дальнейшей разработке признаков.

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

Оценка

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

В дополнение к этому, вам надо настроить оценку вашей модели таким образом, чтобы в итоге вы получали одно число. Взглянуть на ошибку при обучении в сравнении с потерей при валидации или набор метрик, представленных в виде точности, отзыва, F1-счета, AUROC и т. д., иногда может быть полезно в производстве, но на соревновании вам надо иметь возможность быстро взглянуть на одно число и сказать «Эта модель лучше моей предыдущей модели». Опять же, это число должно быть официальной метрикой. Если это не так, у вас должна быть на это веская причина.

Если вы последуете приведенному выше совету, вы попадете в ситуацию, когда вы сможете экспериментировать достаточно часто, и вам понадобится надежный метод для отслеживания ваших результатов. Мне нравится использовать MongoDB, работающий в контейнере Docker, в который я отправляю параметры модели и ее оценку после каждого запуска моего сценария оценки. Я держу отдельную таблицу (или коллекцию, как MongoDB любит их называть) для каждой модели. Закончив несколько экспериментов, я помещаю записи в локальный каталог на моем компьютере в виде файла .archive MongoDB, а также в виде CSV для быстрого чтения. Код для этого можно найти здесь. Следует отметить, что существуют разные мнения о том, как сохранять результаты, и это мой предпочтительный метод, но мне бы очень хотелось услышать, как к этому подходят другие исследователи данных!

Поделиться...
Поделиться в facebook
Поделиться в twitter
Поделиться в vk