Дата публикации Jun 8, 2017
Если вы обычный Коран, как я, вы, скорее всего, наткнулись на повторяющиеся вопросы, задавая один и тот же важный вопрос.
Это плохой пользовательский опыт как для писателей, так и для ищущих, поскольку ответы фрагментированы по разным версиям одного и того же вопроса. Фактически, это проблема, которая очень очевидна на других социальных платформах для вопросов и ответов, таких как StackOverflow. Существует реальная проблема, требующая от ИИ ее решить :)
В течение последнего месяца или около того я провел ночи, разбивая свой череп от этой проблемы, вместе с тремя тысячами других преступников! Это был мой второй серьезный турнир подряд, иногда это было стрессом, но я многому научился - получил 12% лучших позиций, золотую медаль за обсуждение и пару бронзовых медалей за ядро :)
о проблеме- Quora предоставила (почти) реальный набор данных пар вопросов с меткой is_duplicate вместе с каждой парой вопросов. Цель состояла в том, чтобы минимизировать потерю прогнозов на дублирование в наборе данных тестирования. В учебном наборе было около 400 тыс. Пар вопросов, в то время как в тестовом наборе содержалось около 2,5 млн. Пар. Да, 2,5 миллиона! Подавляющее большинство этих пар были компьютерными вопросами для предотвращения мошенничества, но 2 с половиной миллиона, господи! Я использовал мой бедный компьютер на 8 ГБ каждый час :(
Мой подход- Я начал с xgboostстартер@anokas, и постепенно на нем основывались. Мой набор функций включал около 70 функций, которые находятся в довольно низком диапазоне по сравнению с подходами Top Kagglers. Мои функции могут быть в общих чертах классифицированы на основе NLP-функций, расстояний на основе встраивания и функций на основе графов. Позвольте мне уточнить:
NОсобенности LPНекоторые очевидные текстовые особенности - это процент совпадений слов между двумя вопросами, длина двух вопросов, количество слов, количество предложений, количество стоп-слов, обычные вещи на естественном языке! Я пытался идти вперед с результатами tfidf, но это было не очень полезно и вычислительно дорого. Вместо этого одной из наиболее важных функций оказалась взвешенная доля совпадения слов, где вес каждого слова является обратной частотой слова в корпусе (в основном idf) - если у меня есть редкое слово в обоих вопросах, они могут быть обсуждая похожие темы. У меня также были такие особенности, как расстояние по косинусу, расстояние по Джакарду, расстояние по Яровинклеру, расстояние по Хеммингу и совпадения по n-граммам (шинглинг).
Библиотекой, которую я широко использовал для задач НЛП, была Spacy, которая в последнее время развивает некоторые отличные функциональные возможности - сходство с spacy также оказалось хорошей функцией. Некоторые творческие вопросы, о которых я думал, были связаны с таким вопросом - будь то вопрос «Как» или «Почему» - в зависимости от первого слова предложения. Странно, что при моделировании этого я должен был подумать о построении «подобия последнего слова», совершенно упустил это! Именованные сущности являются ключевым ключом для понимания контекста вопроса - таким образом, оценка common_named_entity и оценка common_noun_chunk были очевидным выбором. Я вытолкнулядроо вычислении подобия через корпус Wordnet, однако Wordnet не хватало простора с точки зрения простоты использования, скорости и размера словарного запаса.
Во время соревнований НЛП Word2Vec может остаться позади! Я чувствую, что word2vec может быть самой крутой концепцией информатики, которую я когда-либо читал, я всегда поражаюсь ее эффективности. Каждый раз.
Как бы то ни было, у меня были вопросы, сопоставленные с 300-мерными векторами в формате Sent2Vec, что дало вектор для каждого вопроса. Естественно, были построены основанные на расстоянии особенности между векторами - косинус, ситиблок, жакард, канберра, евклидов и брейкуртис. Необходимо упомянуть @ abhishek'sскриптыдля вдохновения для этих функций. К сожалению, я не смог создать реальные слои для встраивания, которые я мог бы передать в lstm-слои в keras - моя оперативная память просто не позволяла мне. Скоро у меня будет серьезное оборудование!
гОсобенности raph: В соревновании НЛП, эти графические функции сыграли весьма неплохую роль! Однако это было хорошим напоминанием о том, как теории социальных сетей могут применяться в наборах данных, таких как пары вопросов Quora.
Здесь каждый вопрос является узлом в графе, а пара вопросов в наборе данных указывает грань между двумя узлами. Мы также можем использовать графическую структуру тестовых данных, поскольку мы нигде не рассматриваем метку is_duplicate - эти 2 миллиона ребер внесли большой вклад в график! Были горячие дискуссии между kagglers о том, являются ли основанные на графике функции якобы «волшебными функциями», которые должны быть выпущены, чтобы выровнять игровое поле В любом случае, все эти функции дали значительный импульс большинству моделей:
Волшебство Транзитивности- В продолжение структуры графа моделирование транзитивности между вопросами было очевидным подходом. Например, если Q1 похож на Q2, а Q2 похож на Q3, это означает, что Q1 чаще всего похож на Q3 (согласно нашему набору данных). Это была одна из особенностей, которую я начал строить, но оставил на полпути, дорогая ошибка. Многие топ-решения использовали эту функцию в той или иной форме, более простой версией было усреднение вероятностей дублирования между каждым вопросом и соседями его коллеги.
Когда такой нуб, как я, с головой погружается в увлекательную борьбу, неизбежно возникают проблемы. Несмотря на то, что я прилагаю сознательные усилия, чтобы сохранить мой конвейер модульным и контролируемым по версии, я потерял почти работу на выходных из-за неприятной ошибки в конвейере. Изучив его нелегко, я перевернул и переделал конвейер на ipython.блокнот, Основной проблемой, с которой я столкнулся при создании функций, было написание кода с эффективным использованием памяти, а не восстановление прежних функций. Это привело к другому провалу - поскольку я не мог обработать весь свой набор данных тестирования в своей оперативной памяти, я разбил его на шесть подмножеств и построил функции итеративно. Это означало, что я выполнял конкат между пандами между старым фреймом данных с новой функцией, мало что я сконцентрировался на индексации :( Потратил больше пары дней, ломая голову над всеми функциями NaN. Ошибка Noob.
Набор обучающих данных имел идентификатор для каждого вопроса, таким образом, QID1 и QID2 в каждой строке. Однако это не относится к набору данных тестирования, что означает, что «QID» не может быть использован в качестве функции сразу. Товарищ Kaggler выпустил невероятно творческийнаблюдениеуменьшающегося среднего коэффициента дублирования (скользящего среднего) с увеличением QID - наиболее вероятно свидетельство улучшения алгоритма Quora со временем, таким образом уменьшая количество повторяющихся вопросов с увеличением ID. Этот вывод основан на предположении, что значения QID не маскируются и действительно отражают время публикации вопроса. Чтобы смоделировать QID в нашем наборе данных тестирования, у меня была хеш-таблица, которая отображала тексты вопросов в QID. Теперь перебираем все вопросы в test_df - если я столкнулся с существующим вопросом, ему был назначен соответствующий QID. Иначе мы предположили, что это был новый вопрос в порядке времени публикации, увеличивая QID на 1. Это привело к различным функциям, таким как разница QID, средняя QID, min QID с надеждой смоделировать уменьшение дублирования во времени.
Основная часть обсуждений была сосредоточена вокруг предположения о разделении классов в тестовом фрейме данных, которое не было явно похоже на разделение тестирования. Математические люди вычислили узкий диапазон раскола через пару постоянных ценностей,Вота такжеВот, В обучающем наборе было около 34% положительных дубликатов, в то время как в тестируемом наборе было примерно 16% -17% положительных дубликатов - вероятно, в результате улучшенного алгоритма Quora или в результате сгенерированных компьютером пар вопросов. В любом случае, неверно представленный набор данных для обучения не помог бы - люди придумали решения по избыточной выборке (дублирование отрицательных строк в обучении) или изменили свои прогнозы на соответствующий фактор
Мои модели - XGBoost - это любовь, XGBoost - это жизнь
Очень стыдно признаться, но мое представление было всего лишь одним модельным решением - xgboost с 2000 раундами. Если честно, я не тратил много времени на настройку параметров или создание разнообразных моделей, оставил это слишком поздно. Я попробовал случайный лес по умолчанию и GBM, но не с лучшим эффектом, чем XGB. Укладка и ансамбль тоже были в дорожной карте, но они остались там :(
Вместо этого я провел очень долгие выходные, изучая Керас и создавая плотные нейронные сети - это был мой первый раз! Пройдя через понимание различных гиперпараметров и идеальных архитектур, теории функций активации, выпадающих слоев и оптимизаторов! Очень интересные вещи! Я поиграл с моей двухслойной сигмовидной нейронной сетью с моими 70 функциями, доводя ее до совершенства, хотя она никогда не приближалась к xgboost. Как я упоминал ранее, я не мог создавать слои встраивания или LSTM с моим оборудованием, это определенно помогло бы. Скоро.
Гордясь своим конвейером моделирования, мне не нужно беспокоиться о создании функции для каждой модели - это будет полезно, когда я создаю сотни моделей для штабелирования. Скоро.
Пост-конкурсwriteupsиз золотых медалистов просто заставляет меня чувствовать себя полным нубом! Я должен действительно улучшить свою игру, и работать усерднее, чтобы подняться туда, бронза не далеко! Некоторые из основных уроков из решений победителей:
Я должен лучше распоряжаться своим временем, выделяя подходящее время для исследования, разработки функций, построения моделей и укладки. Действительно чувствовал кризис на прошлой неделе, поскольку мне не хватило представлений.
Так что да, это так. Одно соревнование заканчивается, другое начинается. Kaggle вызывает привыкание!
Это было изначально размещено на моемблог, Один блог каждую неделю
© machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map