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

Схабрено

Я не настоящий бигдатщик, я просто 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. Если постоянно с ним работать, то тоже дело нетрудоемкое, классы в библиотеке удобные, реализуют практически все фантазии.
  • Объединяя нескоррелированные результаты даже низкого качества можно улучшить точность до уровня выше лучшего из имеющихся исходных вариантов (полезность ансамблей).

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.