Как мы вошли в 4% лучших в соревновании Kaggle

и как ты тоже можешь

Если вы следите за новостями Kaggle, возможно, вы знакомы с недавно закрытой Лабораторией инновационных наук в Гарварде Механизм действия конкурса. С гордостью могу сказать, что мне и моему партнеру Энди Вангу удалось попасть в 4% лучших - 152-е место из 4373 команд.

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

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

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

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

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

Технические советы и хитрости

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

Разработайте эти функции как следует.

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

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

Модель хороша ровно настолько, насколько хороши данные! - вы могли бы также дать ему больше информации, чтобы понять исходные данные, чем меньше.

Две полезные идеи для разработки функций:

  • PCA / сокращение функций. Это отличный метод разработки функций, поскольку мы проделываем большую работу для модели, говоря: Это наиболее важные структурные элементы данных, вот и все. . Вы можете заменить данные этой версией с сокращенным PCA или объединить сокращенные функции PCA с данными (возможно, более успешно). Другие методы обучения многообразию / сокращения функций, такие как локально линейное встраивание, также должны работать.
  • Добавьте статистику. Если есть много столбцов, которые имеют сопоставимый масштаб друг с другом, вы можете добавить простые статистические данные, такие как среднее значение и дисперсия, а также статистические данные более высокого порядка, такие как эксцесс или перекос. . Например, расхождение между точками данных# of cars moving in Los Angeles, # of cars moving in Santa Monica, # of cars moving in Beverley Hills, может дать нам полезную информацию о различном влиянии погоды. Если дисперсия низкая, то, возможно, погода влияет на все города одинаково. Затем это может быть интерпретировано моделью для облегчения ее прогнозирования.

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

Будьте строги при выборе функций.

Функциональная инженерия - это здорово, и рекомендуется делать все возможное. Но также важно помнить, что слишком много данных может перегрузить модель и затруднить изучение того, что важно. Точное указание того, какие функции оставить, а какие нет, может оказать модели огромную услугу.

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

  • Внимательно изучите данные. Особенно, если имеется много категориальных переменных, могут быть избыточные столбцы. Например, иногда в соревнованиях используются образцы «контрольной группы», в которых цель всегда равна 0. Удаление этого обычно помогает.
  • Сбор информации. Вы можете рассчитать объем информации, обеспечиваемый каждой функцией для прогнозирования окончательной модели, а затем удалить функции, которые практически не предоставляют никакой информации.
  • Порог дисперсии. Менее интересный вариант получения информации (но иногда более практичный), рассчитайте дисперсию каждого столбца и удалите столбцы с небольшой дисперсией (после выполнения необходимого масштабирования).
  • Уменьшение количества функций. Если вы обнаружите много сильно коррелированных функций, может быть полезно заменить их версией с уменьшенной размерностью. В общем, вы должны стараться не удалять менее «важные» функции, а сокращать их. Таким образом, у вас все еще есть информация.

Изучите метрику и разработайте решение с учетом этого.

Kaggle оценивает ваше решение по определенной метрике, которая определяет ваш рейтинг в таблице лидеров. Иногда это что-то вроде Area Under Curve (AUC) или, возможно, потеря журнала. Kaggle всегда предоставляет свою формулу в разделе «Оценка» обзора конкурса.

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

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

  • Допустим, ваша модель плохо справляется с потерями журнала, потому что есть систематическая ошибка (т.е. модель не понимает данные). Возможно, будет полезно сделать вашу модель более «нерешительной», потому что, если она будет давать неправильные ответы, по крайней мере, она не должна в них быть очень уверенной. Вы можете сделать это с точки зрения модели, дополнив данные (если это возможно) или сделав модель менее достоверной. Если вам лень, вы можете просто использовать «целевое отсечение»: если прогноз меньше 1% или больше 99%, просто отсекайте его на 1% и 99% соответственно. Это предотвращает любые излишне самоуверенные ответы. (Конечно, еще одно направление, на которое следует обратить внимание, должно заключаться в том, как уменьшить систематическую ошибку в вашей модели и лучше понять данные.)
  • С другой стороны, возможно, ваша модель хорошо понимает данные. Вместо систематической ошибки он имеет скорее ошибку точности, при которой он часто слишком колеблется. Это дает новое направление для изучения: возможно, вы можете попробовать мешковину или другой ансамблевой подход, который, как известно, делает предсказания более постоянными и уверенными.

Такое мышление - творческий и увлекательный аспект науки о данных. Это способность переводить математические знания в реальные методы.

Ура… пора моделировать.

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

а) сборка
б) точная настройка
в) оценка
г) повторение.

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

К счастью, в искусстве моделирования можно получить массу удовольствия и поучиться. Хотя нет ни в коем случае исчерпывающего списка, вот несколько вещей, которые стоит попробовать:

  • Предварительное обучение. Если у вас есть данные без учителя или без оценки (данные, которые предоставляются в наборе для обучения, но не в наборе для тестирования), вы можете использовать их для предварительного обучения, пропустив их через модель. Это не так уж и сложно. В том же духе попробуйте некоторые предварительно обученные и собранные модели из Кераса. Они могут сэкономить много работы, и их не так уж сложно обойти.
  • Нелинейные топологии. Эти типы нейронных сетей не являются последовательными; вместо этого один слой может разветвляться на несколько, которые позже могут снова объединиться в какой-то другой момент. Это действительно очень просто сделать с функциональным API Кераса. Например, вы можете разделить данные изображения на два сверточных слоя с разными размерами фильтров. Они изучают представления в разных масштабах, а затем объединяют свои знания.
  • Безумные решения для безумных ученых. Модель DeepInsight - отличный пример безумных решений для безумных ученых. Этот подход был чрезвычайно популярен и успешен в соревновании Механизмы действия. Он использовал t-SNE, метод уменьшения визуальной размерности, для преобразования табличных данных в изображение, а затем обучил на нем сверточную нейронную сеть.

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

Главное: моделирование для всех. Вам не нужно писать исходный код для TensorFlow для разработки сложных и успешных моделей. Все, что вам нужно, - это творчество и желание опробовать идеи.

Стратегические советы и хитрости

Эти уловки и уловки больше относятся к вашей стратегии и настроению в соревнованиях Kaggle.

Часто проверяйте доску обсуждений.

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

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

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

Однако важно относиться к чужим идеям не как к конечной точке, а как к трамплину. На то есть две причины:

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

Таким образом, это баланс: просмотрите доску обсуждений, чтобы найти вдохновение, но это не стоит усилий, копируемых.

Не обращайте слишком много внимания на общедоступную таблицу лидеров.

В Kaggle есть система публичных и частных лидеров.

  • общедоступная таблица лидеров содержит результаты участников во время соревнования. Он основан на 25% тестовых данных.
  • закрытая таблица лидеров представляет окончательное положение и рассчитывается с использованием 75% тестовых данных.

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

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

Помните, что речь идет об обучении!

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

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

Когда мы сосредоточились на обучении и мышлении, мы смогли добиться больших успехов. Это ключевой компонент эффективного успеха: получение максимальной отдачи от ограниченных усилий и времени.

Сами рейтинги Kaggle - большие достижения в изучении науки о данных. Однако, если у вас нет честно заработанных денег (достаточно честно), они останутся вехами, а не гарантиями работы.

Как написал в посте Гарет Джонс, старший научный сотрудник Monolith AI:

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

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

То есть: используйте Kaggle для получения опыта! Здесь есть несколько указателей:

  • Придерживайтесь правил - это часть проблемы. Для успешных решений часто используется сочетание как минимум восьми или около того моделей. Поскольку у записных книжек Kaggle есть ограничение по времени, большинство из них обучают свои модели в течение десятков часов на частных компьютерах, а затем загружают веса моделей. Это требует большой работы, и хотя это не «нарушение правил», считайте это частью учебного процесса и вызовом - использовать только вычислительные ресурсы Kaggle.
  • Участвуйте в соревнованиях по два за раз. Это очень полезно для изучения. Когда у вас есть два (или более, если вы амбициозны) соревнования, вы больше сосредоточены на больших идеях и решении проблем, чем беспокоитесь о мелких деталях, которые могут поднять вас на процентный пункт. Кроме того, если вы разочарованы одним соревнованием, вы можете переключиться на другое.
  • Придерживайтесь правила трех дней. Если вы не видите улучшений после работы над чем-то более трех дней, продолжайте! Во всем конвейере машинного обучения есть что исследовать, от разработки функций до творческого моделирования. Процесс мышления намного ценнее, чем то, как вы наконец нашли этот кусок документации, похороненный в темном уголке Интернета.

Резюме

Вот и все! Вот краткое изложение основных моментов.

Технические знания:

  • Разработайте эти функции как следует.
  • Будьте строги при выборе функций.
  • Разберитесь в решении и разработайте его с учетом этого.
  • Откройте для себя широкие возможности и творческий подход в моделировании.

Стратегические выводы:

  • Часто проверяйте доску обсуждений.
  • Не обращайте слишком много внимания на общедоступную таблицу лидеров.
  • Помните, что речь идет об обучении!

Спасибо за чтение и удачи в обучении!