Pull to refresh

Comments 38

Пробовал Google Prediction, результат порядка 47% был.
0.75 с GradientBoostingClassifier-ом из scikit-learn и feature-selection-ом (надо было ансамбли попробовать).
Вот опубликовали финальные результаты, удивительно, что стало с Владимиром Лариным, который все лидировал с 77.4% по первым тестовым 15тыс строк, а на остальных у него оказалось менее 76.20%. У всех был overfit.
Тоже не бигдатщик :)
Пробовал DeductorAcademic от российских разработчиков (использовал еще студентом), на деревьях показал максимум 74,4%, на нейронных сетях максимум <50% (1-2 скрытых слоя), пробовал разбивать выборку на части по полноте данных, существенных улучшений не принесло. Квантификация столбцов со строками помогла поднять результат на деревьях с 73,7 до 74,4% Про xgboost прочитал уже только 27-ого октября :(
Похоже, что из финального рейтинга выкидывают подозрительных или нежелающих сотрудничать (неприславших резюме). Еще у Ильи Езепова пропал бот или однофамилец(?) из «финального рейтинга». Мои 23к+ попыток явно были подозрительны :)
Билайн никак не комментировал эти манипуляции?
Приватно никак, публично не попадалось тоже, но, судя по опубликованной полной итоговой таблице, сначала «финальный рейтинг» был построен по последним загруженным до 2015-10-28 00:00мск файлам решений, как и предписывалось правилами, а затем при формировании текущего «финального рейтинга» были использован последний из файлов решений, залитых до какого-то другого момента времени (по крайней мере такой вывод могу сделать по моему перемещению в «финальном рейтинге» :)
Чтобы больше 77.3% получить на первых 15000 тестовых секретный какой-то метод использовали или можете поделиться?)
Ничего особенного, stacking разных моделей.
Использовал самодельную нейронную сеть. Не смог перепрыгнуть выше 75% на тестовой подвыборке. Когда опубликуют всю тестовую выборку узнаю на сколько мог бы запрыгнуть при идеальном заполнении пропущеных значений, но пока результат всё равно мне нравится. Как я понимаю, все кто пробовал сетки получал в разы худший результат.
Кстати, плюс один, тоже очень разочаровался, когда нейросеть оказалась хуже случайного леса здесь) (у меня на ней было что-то типа 75.25)
Прямо даже интересно, почему, потому что самая лучшая сеть в итоге оказалась довольно слабенькой — два слоя, не больше.
Использовал самодельную нейронную сеть. Не смог перепрыгнуть выше 75%

А что за сеть дала такой хороший результат? Много ли слоев, структура связей, какая активационная функция? Если не секрет, конечно :)
Глубина в среднем 4 слоя. Функция активации гипертангенс. Свзи в первом приближении хаотические. 73 нейрона, 1560 синапсов. Продукт жестокого и изощрённого дропапа и дропдауна. Допобрпдотка входных данных: всякое нормирование, заполнение пропущеных, представление категорий как ворох входов 0-1, подробнее не опишу, предобработку мне жена делала. :)

Вообще по трезвому и выспавшемуся размышления называть хорошим результат лишь на 3% лучше чем можно получить из голой переменной x8 можно лишь с определённой натяжкой.
А не могли бы Вы ты куда-нибудь выложить ту часть выборки, которую удалось вытянуть из билайновцев, а то что-то своё обещание выложить всю выборку они не спешат выполнять, а я хочу кое какие теории проверить на счёт оверфита, редких категорий и пропущнных значений.
pastebin.com/AqqXwqH5 но как я понял, Вы можете использовать для тренировки 40к, а проверить свои гипотезы на оставшихся 10к, разница с тем, чтобы тренировать на 50к а проверять на еще 15 будет небольшая.
Не так всё просто. Я пытался натренировать отдельный классификатор на редкие категории, типа 0, а её в трейновой выборке всего 350 значений. Не особо раскроссвалидируешься. Кроме того я пытался довольно экзотическим алгоритм борьбы с оверфитом заниматься. Я учил модель, потом смотрел на остатках степень оверфита и если перебор — менял метапараметры и учил дальше. Методологически такая выборка уже считается скомпрометированной, и то как просела итоговая таблица относительно предварительной — тому доказательство.

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

Долго и упорно поборов оверфит отыграл бы, может быть пару десятых, но большего мне моими инструментами пока не получить даже теоретически.
Использовал ансамбли random forest, с небольшой предобработкой пробелов в данных. Результат был 76.38, куда делся из финальной — непонятно
Я не поднялся сколь-либо далеко до топа, в процессе получил что-то вроде 76.6 на случайном лесе из scikit-learn. Какое-то время игрался с отбрасыванием шумящих фич, что давало забавный эффект — маленький лес лучше работал при выкидывании половины неважных фич, но уже большой (~2000 деревьев) показывал результат наоборот — видимо, все шло в ход.

Лучи легкого неодобрения авторам реализации мультипроцессного леса в scikit-learn, который для каждого процесса копирует дополнительно выборку в память. x8 процессов — x8 памяти, пожалуйста.

Очень много времени убил на попытки решить это кастомной нейросетью из Theano+Lasagne, результаты на удивление грустные (см. чуть выше). Зато в качестве бонуса — много опыта на тему влияния разных метапарамтеров. Learning rate decay и много-много дропаута сильно помогли.

А вообще было весело.
Был ли прирост качества если добавить эти «угаданные» 15000 объектов к обучающей выборке?
Качнул эти дополнительные 15к в последний день, так что погонял по ним по-быстрому только xgboostом, разницы при кроссвалидации не заметил. Может, 5-10 сотых добавляли, что для меня в меркантильном плане роли не играло :) А если проверять создаваемую модель на этих же 15к, то, очевидно, там и 99% попаданий быстро достигались.
Вот это нормально ваще, я писал сам на перле дробилку под все это, все как положено, сам алгоритм, плюс thread queue и thread pool с 10 потоками (на 12 ядерном сервере) которая все это жевала. Выбил максимум что-то около 58%, уже не помню точно. И забил, потому что не совсем понятно какие данные более ценны чем другие. Непонятны веса этих данных.
Например может там в одной колонке город, в другой улица, и совпадающая улица без совпадающего города не значит близкоживущих людей, а вот совпадающий город вполне. Вобщем забил.
А теперь чувствую себя прямо лохом — все оказывается пихали это в чьи-то чужие дробилки и двигали скроллер…
Зачем вам живущие рядом, если требовалось узнать возрастную группу? :)
А может там детдом или, наоборот, дом престарелых, или общага заводская :) на 50 тыс., конечно, вряд ли это позволит что-то выделить.
при значимости 73,743% для x8, максимальная значимость из квантифицировнных строк была для x17 с 0,128% значимости, т.е. не так уж и много можно было выдоить из строковых данных
Это был просто сферический пример. Без известных весов признаков, что важнее чего, это все тыканье пальцем в небо было, я к этому.
Да те же самые строковые данные и численные. Численные понятно чем ближе число тем более одни данные похожи на другие. А строковые? если они чуть-чуть разные это близкие данные или все равно разные? И что важнее, если например совпадает 10 из 10 строк, но числа расходятся процентов на 10, или когда совпадает 9 из 10 строковых, зато числа расходятся всего на 1?..
Я полагал что строки скорее всего хэши от строк (названий тарифов, услуг), соответственно связи между xxxxxx1 и xxxxxx2 никакой нет.
Хотя могу и ошибаться и это перечень значений классификатора, т.е. грубо говоря axxxxx и axxxxx показывают принадлежность к одному классу.
Я примерно об этом и говорю — есть масса вариантов что может быть ценнее чего. Дробилка которую я написал готова была разжевать что угожно, только подкидывай веса. Я как-то покрутил немного, и понял что это гадание на кофейной гуще, а не задача, без хотя бы легкого намека что где.
В общем я попробовал несколько раз, подумал намного больше раз, но ни один из вариантов не показался мне «да, это правильный подход». всегда есть какие-то «неизвестные».
Наверное big-data это не мое. =D
Кстати о численных и категориальных, мало кто заметил, но переменная x8 которая тут оказалась самой главной вообще-то категориальная, у неё всего меньше сотни возможных значений.
Вы имеете ввиду дискретная численная переменная, а не непрерывная, численная? Пробовал оба варианта, результат был одинаков
я делал несколько разных срезов — сколько каких значений встречается, какой разброс у значений… там есть несколько интересных колонок, есть какие-то с очень маленьким разбросом, типа все в пределах 0.2, есть какие-то с совсем небольшим количеством значений.
Есть три колонки в которых много 0 и 1, некоторое количество 1/2, в полтора раза реже встречаются 1/2 и 2/3, в два раза реже 1/4 и 3/4 и так далее. До сих пор интересно что кодировали эти столбцы. Есть колонки в которых часто встречаются значения 0,6,12,18,x6, в три раза реже 2,8,14,x6+2 и сильно реже все остальные. Пытался для подвыборок по разным типам таких значений делать отдельные классификаторы, но так ничего из них полезного и не вытянул.
Вот это нормально ваще, я писал сам на перле дробилку

Да, это все нормально. Вы занимались тем, что делаете хорошо, пускай в данной задаче и не пришли к каким-то выдающимся результатам. А реализовали бы другой алгоритм (кстати, какой был у Вас реализован на 58% попаданий?) — получили бы более приятные 75%+. Зато теперь узнали, пускай и не на своем опыте, что есть много удобных, эффективных, простых в использовании инструментов, реализующих ML. Они и «фичи» взвесят, и кроссвалидацию сделают, и годный прогноз дадут.

И, уверяю Вас, далеко не все использовали готовые решения и библиотеки. Я и сам пару лет назад решал подобные задачи без представления о ML (Экселем и Си). Тогда этого даже хватало на призовые места :)
UFO just landed and posted this here
Использовал классическую линейную регрессию из коммерческого miner продукта — получил 52% на тестовой выборке — но и времени потратил совсем мало
Сначала изучал как обрабатывать пропущенные данные.
Затем сделал one hot encoding для категорических признаков (в дальнейшем сделал вывод что они полностью бесполезные).
Затем попробовал классификаторы в порядке знакомства с ними: линейный SVM, ближайший сосед, random forest. Только последний смог дать более-менее адекватную точность.
Далее решил попробовать xgboost и сразу же удалось достичь точности порядка 76%, но этого к тому моменту уже было недостаточно, чтобы удержаться в Top25. Довольно много времени ушло на знакомство с этим классификатором и на его настройку.
Потом попробовал собирать ансамбли из этих классификаторов, но за один вечер так и не удалось сделать ничего лучше, чем чистый xgboost.
В конце концов как-то потратив целый день и улучшив точность на жалкие 0.2% (так и не попав в Top25), понял, что оставшийся процент точности (расстояние до лидера) не стоит таких усилий — перестал уже что-либо делать.
О, я тоже сначала долго думал над строковыми столбцами, решая, какие из них переводить в one-hot и считать категориальными, а какие нет. Ориентировался по разбросу значений, само собой — столбец, где было ~1500 разных значений, допустим, точно можно выбросить, а тот, где их всего три, стоит и оставить. Испытал легкое разочарование, когда оказалось, что их все можно выкинуть и точность только вырастет)
Sign up to leave a comment.

Articles