Pull to refresh

Comments 32

Собственно на картинке в хабракате есть одна большая неточность: Naive Bayes, Logistic Regretion, SVM — это методы, а xgboost это библиотека для распределенного бустинга градиентов, что само по себе достаточно распространённая методика, которая используется для связки нескольких алгоритмов классификации для получения более точных результатов, её особенностью является генерализация и последующая возможность оптимизации простых дифференцируемых функций потерь.

Нужно понимать что тут нет методов которые чем-то лучше, или хуже — просто они по разному подходят для решения тех, или иных задач.
«Рейтинги» составлять — довольно нелепое занятие.
Класс, спасибо, все понятно описано! Об XGB слышу впервые, довольно полезная штука оказывается. А численную регрессию она делать умеет? В моей практике размеры обучающей выборки бывают больше на порядки, еще ни одна библиотека не смогла такое прожевать — остается только кастомная нейросеть на плюсах и хардкорное обучение в 24 ядра на Xeon.
Численную регрессию умеет, нужно указать в конструкторе objective=«reg:linear»
Вот это, я считаю, — настоящий победитель. Примерно до середины статьи читал с мыслью «о, я заморачивался точно так же!», после середины уже пошло то, до чего мне не хватило упорства, или знаний, не имеет значения. Но, очевидно, что такой подход — это подход специалиста, а не как в предыдущих статьях — «я засунул данные в веб сервис машинного обучения хх и он выдал мне 75%». От которых было немножко обидно (я выбил максимум 58 что-ли, где-то так).
Было круто читать! Хотя я почти ничего не понял. :( Но это проблема в моей низкой квалификации в данной области. Но все равно было очень интересно прочитать.
Спасибо!
Кратко, как я лоханулся и поверил публичному лидерборду :). В публичном я находился на отметке в 77.41, т.е. в топ 3 в таблице последнего дня, а в итоговом улетел далеко вниз.

Сделал 3 разных датасета:
1) В первом категориальные поля с большим кол-вом категорий были удалены, остальные были закодированы в бинарные фичи. У числовых переменных удалялись выбросы, а некоторые из них проходили через разнообразные преобразования.
2) Второй набор был оптимизирован для линейных моделей, от большинства которых, в итоге я отказался. На кроссвалидации в 5 проходов обычная логистическая регрессия показывала точность порядка 75.8.
3) В третем датасете все категориальные переменные были прогнаны через лассо регрессию, а их результаты использовались в качестве фичей. Это стандартная практика, т.к. модели на основе деревьев неспособны нормально воспринимать большие категориальные переменные.

На основе 2х xgboost моделей и одной randomforest с помощью первого датасета мне удалось получить 77.11.

Далее я решил попробовать stacking, эту технику давно хотелось изучить, а тут как раз повод появился.
После череды неудачных тестов я почти забросил эту идею, но в конце решил попробовать в качестве мета модели SVM и сразу же получил 77.21. Стандартным выбором для мета моделей обычно является логистическая регрессия, GBM, Knn или нейронная сеть. Все эти методы показывали достаточно неплохие результаты на моей кроссвалидации, но получали 76.7-76.9 в паблик таблице. Knn был очень нестабильный, но в самом конце он смог показать 77.27 на лидерборде. Логика говорила, что svm в качестве мета модели не может быть круче GBM, но я ей не поверил :)

C SVM все было наоборот, на кроссвалидации он показывал себя немного хуже. На этом моменте у меня закралась мысль, что тестовый датасет существенно отличается от того, на котором приходится тренировать модель или промежуточные 30% имеют перекос в сторону какого-то класса. Проверять это мне было лень, т.к. участие в конкурсе уже поднадоело, поэтому я взял запылившийся купон на 300$ для сервиса облачных вычислений и запустил сотни экспериментов на уже имеющемся у меня «фреймворке» :).

После 5 дней работы 16ти ядерного сервера я получи примерно такую модель, которая давала 77.41:


Как я уже писал выше, такой метод называется stacking, это очень популярный подход на kaggle, kddcup и т.д. Суть его достаточно проста, предсказания моделей на предыдущей уровне являются фичами для модели на следующем, в моём случае для SVM. Предсказания используются либо в обычном виде, либо в виде вероятности для каждого класса, я использовал второй подход. Чтобы не переобучить модели на первом уровне я делил обучающую выборку на две части и обучал попеременно (2-fold cv).

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

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

В итоге у меня встала задача, какое решение выбрать, обычно на kaggle можно выбирать два, а тут надо было выбрать всего лишь одно.
Модель со стакингом получилась очень громоздкой и проверять её на локальной 5-fold кросс-валидации у меня не было никакого желания, поэтому решение я принимал, можно сказать, в слепую. В итоге я не устоял соблазну и сделал выбор в пользую сложной модели, хотя на практике сложные модели в итоге ведут себя хуже.

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

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

p.s. Жду от авторов тестовую выборку, чтобы самому покрутить результаты.
Если бы мы смотрели не последний результат, а вообще все, то твой был бы на первом месте :)
Я даже видел таблицу, с надписью финальный рейтинг, где я был первый, но верить ей не стал, учитывая предыдущие проблемы с организацией конкурса.
Таки 69.7% на зачетных 35000, которые Вам приписывают, тоже не похожи на правду, не верю, что та же модель, которая показывала 77%+ попаданий на пробных 15к (при том, что модель ранее эти 15к не видела) упала ниже 75% на оставшихся 35к. Скорее всего, тестовую выборку не покажут, чтоб не было бурлений по поводу некорректных итогов :)
Увидел что билайн все-таки выложил фаил с ответами, вот какие результаты получились, первый столбец это классы:
             precision    recall  f1-score   support
          0       0.00      0.00      0.00       337
          1       0.65      0.41      0.50      1966
          2       0.81      0.82      0.81     15756
          3       0.77      0.83      0.80     14516
          4       0.75      0.77      0.76     10235
          5       0.72      0.69      0.70      5369
          6       0.76      0.55      0.64      1821

avg / total       0.76      0.77      0.76     50000

Сплит по файлам там не указали, точность по всему файлу получилась 0.76716. Попробовал сделать 100 случайных сплитов на 0.3/0.7, точность ниже 0.767 не опускается.

Кто виноват? Я точно помню какой фаил последний загружал :).
Красавцы! Не побоялись бурлений :) У меня на (как я считал) последнем отправленном 0.7637 = 26730 попаданий из 35000. Вроде что-то такое и было в первой версии «финального рейтинга». Но, видимо, трактовка «последний отправленный» у Билайна отличается :) А Вы отправляли решение с 69.7% правильных? Есть гипотеза, что применено какое-то другое время отсечки для «последнего загруженного решения».

Справедливости ради стоит отметить, что в официальных Правилах конкурса вопрос, какое именно решение будет использоваться для определения победителя, не уточняется. Сказано только, что победитель выбирается комиссией из топ-3 Рейтинга, а Рейтинг составляется на основании точности решений.
Что я имею в итоге:

За месяц мне не удалось получить никакой информации, после 4х попыток связаться с билайном — везде проигнорировали, на половине разговора. Даже обращение через пресс-службу не помогло.

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

Точность (accuracy) по всем классам:

Class       Accuracy      Samples
0       0.0                 337
1       0.410478128179      1966
2       0.824638233054      15756
3       0.826054009369      14516
4       0.769907181241      10235
5       0.687837586143      5369
6       0.545853926414      1821

То, что мне нарисовали в итоговой таблице — это не моё итоговое решение, я просмотрел все логи и перепроверил 5 последних решений на точность.

Выводы делайте сами.
модели на основе деревьев неспособны нормально воспринимать большие категориальные переменные

Часто помогает такой подход: значения в категориальной переменной заменяются целыми числами («a» -> 1, «b» -> 2...). Заодно feature space не разрастается, как при использовании dummy variables.
А разницы нету практически, ваш вариант обычно немного лучше работает, чем dummy. Если увеличивать глубину деревьев, то в итоге получится переобучение.
«этой части подготовки данных я обошелся стандартным подходом: логарифмирую все, что распределено плотнее около нуля». А не настоящий сварщик, а почему это улучшает результаты и насколько это эффективно? Я тоже логарифмами проходился, но это ничего не дало.
На деревья это не должно влиять, т.к. преобразование монотонное. Должно было быть влияние на k-means(результат используется, как дополнительные фичи) и k-neighbors, как и для любых методов, где есть понятие «расстояния». Насколько это эффективно я точно не знаю, т.к. преобразования были сделаны практически сразу. Ну и конечно на данные после таких преобразований смотреть намного приятнее :)
Тоже участвовал в этом конкурсе, но в привате оказался только на 80-м месте с результатом 75.67%.
Схема работы с данными приблизительно такая же. Отчистка данных, предварительные прогоны по xgb/glm/nn, анализ предикторов с высоким показателем важности. Была попытка генерации доп-фич в виде CTR для каждой пары класс-предиктор для ряда хорошо показавших себя предикторов. На тестовой выборке доп. фичи скорее мешали, чем помогали. Поэтому были исключены. Но благодаря им была найдена взаимосвязь между предикторами x55-60 и финальным классом. Так же обнаружилось, что каждый класс помимо самых жирных предикторов вроде x8 или x29/x30 наилучшим образом предсказывался своим набором предикторов и поэтому была сделана модель на основании xgboost, предсказывающая каждый класс в отдельности и потом делающая свёртку с коррекцией весов для каждого класса. В конечном итоге упёрся в те самые 25% выборки, которые по моим выводам предсказать было невозможно. Видимо, это те самые пенсионеры, покупающие молодёжные тарифы в подарок внучке :) И, судя по финальному месту, просто не хватило времени/терпения чтобы сделать тонкую настройку модели.
Сделайте одолжение, дайте какую-нибудь нормальную ссылку почитать про алгоритм XGboost. Именно top-level алгоритм. Реализация и детали не имеют значения.
А то я что-то никак не врублюсь, о чем идет речь.
Интересует организационный вопрос. Какой процент налога с этого дохода (выигрыша) надо заплатить?
Почитайте правила, там все написано: Билайн платит налог 13% за победителя сам, приз 500 кр чистыми.
У меня такой вопрос: вы используете для обучения SGDRegressor и KMeans полный набор данных train, а потом же на этом же наборе с дополнительными переменными, полученными от SGDRegressor и KMeans обучаете XGBClassifier. Разве тут не должно быть переобучение XGBClassifier, который в качестве важных переменных воспримет только предсказания от SGDRegressor и KMeans?
Обычно для обучения вспомогательных моделей используют часть датасета, а основную модель обучают на второй части датасета + предсказания по этой второй части от вспомогательных моделей (как тут, например).
Про SGDRegressor вы наверное правы, с таким подходом могло бы быть и лучше. Но с таким маленьким датасетом не хотелось разделять на части, т.к. маленький датасет сам по себе менее устойчив к переобучению. В KMeans все совсем немного по-другому. Он вообще запускается сразу на train+test, т.к. он unsupervised. Кластеры у него не очень соответствовали классам, и они были не самими важными(а некоторые вообще не вошли в топ100), то есть большого переобучения не могли дать.
На самом деле про train+test я обманул, KMeans у меня обучается на train :) Вспомнил про то, что лучше обучать на train+test слишком поздно и в финальную версию это не попало
Если не секрет, было бы интересно посмотреть на весь код.
Очень интересно, но ничего не понял :) подскажите, пожалуйста, где можно почитать информацию для начинающих по машинному обучению, дата майнингу?
Вот тьюториал с неплохим обзором пути, по которому обычно идут исследователи данных
Sign up to leave a comment.

Articles