Machine Learning Boot Camp — как это было и как это будет
13 июня стартовал ML Boot Camp — состязание по машинному обучению от Mail.Ru Group. В связи с этим мы хотим поделиться с вами впечатлениями о его предыдущем запуске, историями успеха победителей и рассказываем, что нового ждет участников в этом году.
При запуске чемпионата участники получают условие задачи — словесное описание того, что содержится в данных, служащих обучающей выборкой. Кроме условия, становится доступной и сама обучающая выборка, она состоит из размеченных примеров — векторов описаний каждого объекта с известным ответом. Если возможных ответов конечное число, то их можно интерпретировать как номер класса, к которому принадлежит объект.
Участники с помощью известных им методов машинного обучения тренируют компьютер и используют обученную систему на новых объектах (тестовой выборке), пытаясь определить для них ответ. Тестовая выборка случайно поделена на две части: рейтинговую и финальную. Общий результат на рейтинговых данных вычисляется нашей системой и публикуется сразу, однако победителем становится тот, кто получит наилучшие результаты на финальных данных. Они остаются скрытыми для участников до самого конца соревнования.
На выполнение задания отводится один месяц. Опытные участники могут совершенствовать свои алгоритмы на протяжении всего контеста, обновляя результат. А тем, кто пока не так глубоко знаком с этой областью, хватит времени во всем разобраться и написать свое решение. Для новичков также предлагается обширная ознакомительная статья, которая укажет, в каком направлении нужно «копать», и схематично опишет возможное решение для задачи чемпионата.
В 2015 году мы провели открытый чемпионат, о котором многие не знали. Участниками стали преимущественно студенты наших образовательных проектов — Техносферы и Технопарка.
Вот условие задания, которое участники получили при открытии контеста:
«Перед вами стоит задача классификации: на основе известного распределения по классам обучающих элементов распределить также и тестовые. Все предоставленные для данной задачи данные разбиты на две части: обучающую (x_train.csv и y_train.csv) и тестовую (x_test.csv). Каждая строка файлов x_train.csv и x_test.csv представляет собой описание некоторых объектов в виде наборов бинарных значений (признаков), перечисленных через запятую. Все объекты распределены по трем категориям (классам). Для объектов из обучающей выборки данное разбиение известно и приведено в файле y_train.csv. В качестве ответа для данной задачи принимается текстовый файл, каждая строка которого соответствует строке в файле x_test.csv и содержит номер класса (0, 1 или 2).
Пример данных:
x_train.csv | y_train.csv | x_test.csv |
1,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,0,1,1,0,1 | 1 | 1,1,0,1,1,0,1,0,0,1,1,0,1,0,0,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0 |
1,0,1,0,0,0,1,1,0,1,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,0,0,1,0,0 | 2 | 0,1,1,0,1,0,1,0,1,0,0,0,1,0,1,0,0,1,1,0,1,0,0,1,0,0,1,0,0,0 |
0,1,1,0,0,0,0,1,1,1,0,1,0,1,0,1,0,0,1,0,1,1,0,0,1,1,1,0,1,0 | 1 | 0,0,1,0,0,0,0,0,0,0,1,1,0,1,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1 |
1,0,1,1,0,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,0,1,0,0,1,0,1,1,1,0 | 0 | 1,0,1,0,1,1,0,1,0,0,1,0,0,1,0,1,0,1,1,0,0,1,1,0,0,1,0,0,1,0 |
В качестве критерия качества решения задачи будет приниматься точность классификации, т. е. доля правильно классифицированных объектов. Тестовая выборка случайным образом разбита на две части в соотношении 40/60. Результат на первых 40% будет определять положение участников в рейтинговой таблице на всем протяжении конкурса. Результат на оставшихся 60% станет известен после окончания конкурса, и именно он определит финальную расстановку участников».
Конкурсанты не имели ни малейшего представления о том, каким способом были получены безликие цепочки из нолей и единиц, но, несмотря на это, им удалось добиться впечатляющих результатов. Посмотрите сами в таблице ТОП-10 участников контеста.
№ | Участник | Предварительный балл | Финальный балл |
1 | Павел Швечиков | 0,6984126984 | 0,6785714286 |
2 | Антон Гордиенко | 0,6904761905 | 0,6547619048 |
3 | Анастасия Виденеева | 0,6984126984 | 0,630952381 |
4 | Артем Кондюков | 0,6825396825 | 0,619047619 |
5 | Александр Луценко | 0,7301587302 | 0,619047619 |
6 | Константин Созыкин | 0,6587301587 | 0,619047619 |
7 | Виталий Малыгин | 0,4126984127 | 0,5833333333 |
8 | Алексей Несмелов | 0,4841269841 | 0,5714285714 |
9 | Владимир Винницкий | 0,380952381 | 0,5714285714 |
10 | Виктор Шевцов | 0,4047619048 | 0,5714285714 |
Здесь балл — это процент последовательностей, для которых итоговая программа верно определила класс.
На самом деле мы получили эти цепочки следующим образом.
Класс 0 содержит последовательности, сгенерированные людьми. Мы попросили каждого из 140 человек, которые согласились нам помочь, записать последовательность из нулей и единиц так, чтобы она выглядела как можно больше похожей на случайную. При этом они не могли пользоваться компьютером, таблицами и другими материалами. Каждый должен был просто представить, что он подбрасывает монетку. Если в его воображении выпадает орел, то записать 1, если решка — записать 0. Разумеется, настоящей монеткой и другими приспособлениями также запрещено было пользоваться.
Класс 1 содержит последовательности, сгенерированные компьютером с помощью датчика псевдослучайных чисел. Вероятность появления нуля, так же как и вероятность появления единицы, равна 50%, при этом зависимости между разными элементами последовательности нет.
Класс 2 содержит последовательности, также сгенерированные компьютером, но при этом последовательные значения различны с вероятностью 70%.
Только задумайтесь: даже не имея никакого представления о том, как были получены эти цепочки, участники при помощи своего железного друга (компьютера) с вероятностью почти в 70% (!) верно определяют, написал эту последовательность человек или компьютер, случайным образом или с алгоритмом. Это кажется достаточным поводом, чтобы оценить силу методов машинного обучения, ведь даже оценка в 50% была бы хорошей, учитывая, что априорные шансы угадать — всего 33,(3)%.
Мы попросили победителей состязания рассказать, как они добились такого результата.
Анастасия Виденеева
«Решала я задачу следующим образом. Сначала исследовала данные и выяснила, что в обучающей выборке объектов из разных классов примерно поровну, количество нулей и единиц примерно одинаковое в объектах из каждого класса, но в классе 2 чаще, чем в других, следующий символ отличается от предыдущего (в классах 0 и 1 таких «переключений» было в среднем около 14 в каждом объекте, в классе 2 — 17). Я добавила число переключений как новый признак и обучила randomForest на получившихся признаках. Результат оказался невысоким (без подбора параметров мой скор был 0,438, насколько я помню). Судя по скорам остальных участников на тот момент, они, скорее всего, тоже использовали исходные признаки, но более аккуратно подбирали параметры алгоритмов или использовали комбинации алгоритмов.
Задумалась о принципиально другой идее, которая в данной задаче может «выстрелить». Решила рассматривать данные как строки длины 30, а в качестве признаков использовать n-граммы, потому что они позволяли отразить и тот факт, что в классе 2 часто происходит смена символа, и другие закономерности в данных. На новых признаках все алгоритмы позволяли получить значительно более высокий результат (тот же randomForest без подбора параметров получил скор 0,706). Затем делала отбор признаков с помощью ExtraTreesClassifier (выборка очень маленькая, не хотелось переобучиться) и классификацию с помощью gradient boosting, svm и randomForest. Параметры всех алгоритмов и порог отсечения по важности выбирались с помощью leave-one-out кросс-валидации. Не получила значительной разницы между алгоритмами, поэтому в финальной посылке использовала более привычный мне randomForest. Интересно было бы еще посмотреть, каких результатов можно добиться с помощью нейронных сетей, но времени не хватило с ними разобраться».
Антон Гордиенко
«До участия в конкурсе весь мой опыт machine learning сводился к прохождению курса Andrew Ng на Coursera, и пару раз я пробовал делать простые классификаторы с помощью логистической регрессии.
Первая попытка: попробовал обучить XGBoost. На ночь поставил перебирать параметры. Получил неплохое локальное качество (порядка 50%), но после отправки решения на сайт — всего лишь 39%. Наверняка переобучился, так как при отправке XGBoost с параметрами по умолчанию получил 41%.
Вторая попытка: пробовал анализировать признаки. Выяснил, что каждый столбец в отдельности не содержит абсолютно никакой информации: число нулей и единиц одинаково для каждого класса. Решил искать зависимости для разных наборов столбцов. Перебирал всевозможные комбинации из трех столбцов (также пробовал комбинации из двух и четырех столбцов) и смотрел, как часто встречается каждая комбинация в каждом классе. Теперь многие комбинации в одном из классов встречались в 1,5–2 раза чаще (или реже), чем в двух других. Но переход на новые бинарные признаки «наличие в последовательности каждой комбинации» в результате ничего не дал. Сайт вернул тот же 41%. Причина, скорее всего, в слишком большом количестве признаков (4060 признаков при размере обучающей базы в 210 элементов).
Третья попытка: решил рассмотреть в качестве признаков количество подпоследовательностей каждого вида длины 5 (другие длины тоже пробовал, но качество оказывалось немного хуже). Обучил с помощью randomForest на случайных параметрах и получил на сайте 63%. Посмотрев на важность признаков, увидел, что хорошо выделяется признак «наличие подпоследовательности 10101». Добавил еще один признак: «общее количество чередований в последовательности». Немного поперебирал параметр max_features и получил финальные 69%».
Павел Швечиков
«Это было мое первое соревнование по машинному обучению, поэтому я пытался испробовать все, что приходило мне на ум и могло улучшить качество предсказания. Сначала я долго пытался визуализировать данные, пробовал посмотреть на данные, разложив их по PCA, но это не дало сколько-нибудь хороших результатов. Данные были все в куче, и чего-то простого, сразу заметного глазу не было видно. Потом меня заинтересовало, связаны ли как-нибудь признаки между собой, и я построил диаграмму корреляций между признаками в разных классах. Так диаграмма выглядела для класса 0:
Так же я построил диаграмму корреляций для первого класса:
На этом этапе я надолго остановился и пытался понять, в чем же истинное отличие, но, когда я построил подобную диаграмму для второго класса, все стало несколько понятней:
Очевидно, что признаки были связаны между собой, и больше всего это было заметно во втором классе. После этого я вспомнил, как один мой друг говорил, что на kaggle в большинстве случаев побеждают ансамбли из моделей, напрочь забыл про найденные зависимости и ударился в построение ансамблей.
Тут я дал себе волю. :) Я пробовал простое голосование, взвешенное голосование, stacking, blending, каждое из перечисленных с разным количеством уровней и разными моделями. Здесь я пробовал много разных интересных вещей, в том числе обучать модели более высокого уровня на предсказаниях предыдущего уровня с добавлением исходных бинарных признаков, пробовал разные типы кросс-валидации. Надо признаться, что метод кросс-валидации leave-one-out стал настоящей находкой для моделей второго уровня в силу небольшого количества данных, что еще несколько подняло качество ансамбля, который я заботливо причесывал, черпая методы и их обоснования из статей и обсуждений.
В какой-то момент мне совершенно случайно подали несколько хороших идей, в частности про то, что можно использовать для обучения моделей следующего уровня не предсказания предыдущих, а вероятности классов, которые получены на моделях первого уровня, а также прекрасную идею, что можно посмотреть на признаки как на строки. Вкупе с теми диаграммами корреляции, которые я получил в самом начале контеста, это открыло мне глаза на то, что еще можно сделать для улучшения качества. В частности, я пробовал представить бинарные признаки как случайное блуждание, пытался использовать симметрию признаков, количество смены 0–1, количество непрерывных 0 или 1, их максимальную/медианную/среднюю длину, а также я пытался представить исходные признаки в виде текстовых документов, состоящих из слов 0, 1, добавлял новые признаки, обозначающие номер признака, на котором непрерывная последовательность из одинаковых значений прерывается. Я думал пойти дальше и добавлять признаки TF-IDF для разных комбинаций «слов», но время поджимало, и я решил остановиться на том, что уже получилось.
Получившаяся модель выглядела следующим образом:
На 90% данных (c добавленными признаками, описанными выше) я обучил семь моделей (представлены ниже), для остальных 10% данных я получал предсказания вероятности класса от моделей первого уровня и на этих новых признаках обучал модели второго уровня, в числе которых был svm, randomForest и небольшая нейронная сеть. Предсказания моделей второго уровня я сливал вместе с помощью majority voting».
Как можно заметить, двое из трех финалистов признались в том, что опыт решения задач по машинному обучению до контеста у них был невысок. Это означает, что сроки соревнования и открытые ресурсы предоставляют вам возможность не только во всем этом разобраться и предложить свое решение, но и показать достойный результат — было бы только желание и упорство.
***
В этом году мы проводим состязание вновь! На этот раз для участников подготовлена новая задача, а победителей ждут не только респект и уважуха, но еще и полезные призы (iPod shuffle и внешние жесткие диски на 500 Гб), а также возможность присоединиться к команде Mail.Ru Group! Сфера применения алгоритмов машинного обучения постоянно расширяется, уже сейчас они активно используются у нас в рекламных сервисах, антиспаме и социальных сетях. Мы заинтересованы в специалистах по machine learning и хотим, чтобы люди знали, что это такое и как этим пользоваться. Такие состязания, как ML Boot Camp, — отличная возможность не только прочитать абстрактно непонятную теорию, но и сразу же обкатать ее на задачах, близких к реальным. Это повод наконец заняться машинным обучением тем, кто всегда этим интересовался, но медлил в нерешительности, и шанс для опытных юзеров показать свой высокий уровень. Присоединяйтесь к нам на ML Boot Camp!
Чемпионат ML Boot Camp входит в число инициатив Mail.Ru Group, направленных на развитие российской IT-отрасли и объединённых ресурсом IT.Mail.Ru. Платформа IT.Mail.Ru создана для тех, кто увлекается IT и стремится профессионально развиваться в этой сфере. Также проект объединяет чемпионаты Russian Ai Cup, Russian Code Cup и Russian Developers Cup, образовательные проекты Технопарк в МГТУ им. Баумана, Техносфера в МГУ им. М.В. Ломоносова и Технотрек в МФТИ. Кроме того, на IT.Mail.Ru можно с помощью тестов проверить свои знания по популярным языкам программирования, узнать важные новости из мира IT, посетить или посмотреть трансляции с профильных мероприятий и лекции на IT-тематику.