Обучение машинному обучению

Схабрено

Я не настоящий бигдатщик, я просто xgboost на github’e нашел.
Beeline-Machine-Learning-Test
Погоня за 500кр от Билайна заставила окунуться в мир машинного обучения, к коему я интерес проявлял и раньше, но доверия не оказывал и, соответственно, не окунался. Беглый поиск показал, что в этом плане рулит сейчас xgboost от китайских товарищей из вашингтонского университета. Как я понял, это что-то вроде Apple в области машинного обучения: нажал одну кнопку — получил быстро и красиво что хотел.

При ближайшем рассмотрении выявились настройки, подкручивая которые, можно ускорять или замедлять обучение, уточнять или огрублять предсказания, даваемые этой программой. Входные данные программе удобнее всего подаются в libsvm формате. Наверняка есть куча библиотек, с помощью которых можно что угодно (от csv до avi) перевести в libsvm, но в данном случае я обошелся своим «велосипедом» на JavaScript.

Итак, уже 30 сентября с xgboostной помощью было получено 76.58% попаданий по предварительной оценке. Матерые бигдатщики тем временем попадали на 77%+! Прочитав о пользе ансамблей (это объединение нескольких предсказаний по принципу большинства голосов) стал искать другие методы, чтобы получить нескоррелированные с уже имеющимися предсказания. Так как если составлять ансамбль из примерно одинаковых по своему происхождению предсказаний, то их точность усредняется, а если из совсем разных — то точность растет.

Попробовал метод опорных векторов (SVM), метод ближайших соседей с взвешиванием по удаленности соседа и «случайно-лесной». Эти методы уже потребовали кое-какой подготовки данных: где-то нормализовать, где-то взвесить значимость факторов, пришлось немного разбираться, так как знаю питон на уровне «читаю/пишу со словарем», с питоновской sklearn (Sci-Kit Learn), благо там документация и примеры понятны и коту. Результаты намного хуже: от 57 до 73% попаданий, сказалось неумение готовить данные, к которому эти методы критичны. Хотя вроде делал как пишут в книжках, категории в фиктивные переменные, числа в диапазон [0;1], незначимые выкидывал.

Чтобы разнообразить модели начал избавляться от значимых и незначимых факторов. Переменная x8 содержит более 90% из имеющейся во всех переменных информации о возрастной группе (только по ней одной можно получить 72%+ попаданий). Xgboost без этой информации что-то стал часто промахиваться — в пределах 55% попаданий, а вот по ближайшим соседям, на удивление, осталось 73%. Создав еще несколько десятков вариантов с различными обрезаниями доступной для обучения информации, собрал их в ансамбль и… 77.05%. Это печально…

Какой-то полезный прием обработки входных данных или метод, стало быть, не применил, а знающие люди применили. Ну и уже стало надоедать. Немного приободрило то, что, как выяснилось, проверка Билайном для предварительного рейтинга производится всегда на первых 15 тыс тестовых строк, а не случайных 15 тыс, как я изначально предполагал. А это значит, что можно вытащить еще немного строчек данных для тренировки и кросс-валидации. Вдруг в них что-то неизведанное и полезное?!

Непонятно, было ли это предусмотрено устроителями конкурса, но 27 октября перебором за несколько часов и примерно 23 тыс. попыток получил 15 тыс. первых строк тестовой выборки с правильными ответами (ни капчи, ни ограничений по частоте отправки вариантов решений не было, так что все прошло быстро и дешево даже в 1-2 потока). Но особой пользы, кроме потехи ЧСВ, эти дополнительные 15к не принесли: по моим оценкам лидеров обойти на зачетных 70% тестовых данных не удалось, так как новой информации, определяющей возрастную группу, использованные мною методы не смогли обнаружить.

Практические итоги урока ML от Билайна

 

  • xgboost оптимален при поиске зависимостей в данных, позволяет получить 95% от наилучшего возможного результата ценой 5% усилий, годится при потребительском подходе к задаче лентяем с нулевым уровнем.
  • Для продвинутого уровня пойдет python-sklearn. Если постоянно с ним работать, то тоже дело нетрудоемкое, классы в библиотеке удобные, реализуют практически все фантазии.
  • Объединяя нескоррелированные результаты даже низкого качества можно улучшить точность до уровня выше лучшего из имеющихся исходных вариантов (полезность ансамблей).

Добавить комментарий