www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Выявление повторяющихся вопросов по Quora | Лучшие 12% на Kaggle!

Дата публикации 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 не хватало простора с точки зрения простоты использования, скорости и размера словарного запаса.

Word Embeddings на основе расстояния:

Во время соревнований НЛП Word2Vec может остаться позади! Я чувствую, что word2vec может быть самой крутой концепцией информатики, которую я когда-либо читал, я всегда поражаюсь ее эффективности. Каждый раз.

Word2Vec Магия!

Как бы то ни было, у меня были вопросы, сопоставленные с 300-мерными векторами в формате Sent2Vec, что дало вектор для каждого вопроса. Естественно, были построены основанные на расстоянии особенности между векторами - косинус, ситиблок, жакард, канберра, евклидов и брейкуртис. Необходимо упомянуть @ abhishek'sскриптыдля вдохновения для этих функций. К сожалению, я не смог создать реальные слои для встраивания, которые я мог бы передать в lstm-слои в keras - моя оперативная память просто не позволяла мне. Скоро у меня будет серьезное оборудование!

гОсобенности raph: В соревновании НЛП, эти графические функции сыграли весьма неплохую роль! Однако это было хорошим напоминанием о том, как теории социальных сетей могут применяться в наборах данных, таких как пары вопросов Quora.

Типичная структура графа в социальных сетях

Здесь каждый вопрос является узлом в графе, а пара вопросов в наборе данных указывает грань между двумя узлами. Мы также можем использовать графическую структуру тестовых данных, поскольку мы нигде не рассматриваем метку is_duplicate - эти 2 миллиона ребер внесли большой вклад в график! Были горячие дискуссии между kagglers о том, являются ли основанные на графике функции якобы «волшебными функциями», которые должны быть выпущены, чтобы выровнять игровое поле В любом случае, все эти функции дали значительный импульс большинству моделей:

  • Степень узла: по сути, частота вопроса, будет столько раз, сколько раз этот вопрос возникал в наборе данных. Эта функция дала огромный выигрыш, потому что выборка вопросов (повышающая дискретизация дубликатов), выполненная Quora, скорее всего, зависела от этой частоты.
  • Пересечение соседей: процент соседей первой степени пары вопросов, например. Q1 имеет соседей Q2, Q3, Q4, а Q2 имеет соседей Q1, Q3. Общими соседями для (Q1, Q2) являются Q3, половина всех соседей первой степени.
  • Степень разделения: это была особенность, которую я придумал и реализовал с помощью поиска в ширину, но не дал большого улучшения.
  • PageRank: я реализовал эту функцию, даже выпустилядроon kaggle - вопросы с более высоким рейтингом страницы связаны с важными вопросами (с более высоким рейтингом страницы), а вопросы со спамом - со спамом.
  • kcore / kclique: K-core - это, по сути, самый большой подграф, где каждый узел связан по крайней мере с «k» узлами, хотя и не дал мне большого выигрыша. Я думал о kclique, но не реализовал его из-за нехватки времени :( Оказалось, это было очень важно!
  • Взвешенный граф. Позже в конкурсе коллеги-кагглеры поделились идеей иметь взвешенный граф, где весом каждого узла является weighted_word_share (мы обсуждали это ранее). Пересечение соседей в этом взвешенном графике было полезным.

Волшебство Транзитивности- В продолжение структуры графа моделирование транзитивности между вопросами было очевидным подходом. Например, если Q1 похож на Q2, а Q2 похож на Q3, это означает, что Q1 чаще всего похож на Q3 (согласно нашему набору данных). Это была одна из особенностей, которую я начал строить, но оставил на полпути, дорогая ошибка. Многие топ-решения использовали эту функцию в той или иной форме, более простой версией было усреднение вероятностей дублирования между каждым вопросом и соседями его коллеги.

Мои занятия по доске

Часть 1 из 2
Часть 2 из 2

Некоторые придурки

Когда такой нуб, как я, с головой погружается в увлекательную борьбу, неизбежно возникают проблемы. Несмотря на то, что я прилагаю сознательные усилия, чтобы сохранить мой конвейер модульным и контролируемым по версии, я потерял почти работу на выходных из-за неприятной ошибки в конвейере. Изучив его нелегко, я перевернул и переделал конвейер на ipython.блокнот, Основной проблемой, с которой я столкнулся при создании функций, было написание кода с эффективным использованием памяти, а не восстановление прежних функций. Это привело к другому провалу - поскольку я не мог обработать весь свой набор данных тестирования в своей оперативной памяти, я разбил его на шесть подмножеств и построил функции итеративно. Это означало, что я выполнял конкат между пандами между старым фреймом данных с новой функцией, мало что я сконцентрировался на индексации :( Потратил больше пары дней, ломая голову над всеми функциями NaN. Ошибка Noob.

Загадка QID:

Набор обучающих данных имел идентификатор для каждого вопроса, таким образом, 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из золотых медалистов просто заставляет меня чувствовать себя полным нубом! Я должен действительно улучшить свою игру, и работать усерднее, чтобы подняться туда, бронза не далеко! Некоторые из основных уроков из решений победителей:

  • Большинство команд изменили свои окончательные прогнозы на основе краев взвешенного графика или частоты узлов
  • Каждая топ-команда создала укладчик с сотнями моделей с многоразовым конвейером для построения моделей.
  • Были использованы современные архитектуры нейронных сетей (Сиамские сети / сети внимания), LightGBM, но даже модели с более низкой производительностью, такие как ExtraTrees или Random Forests, помогают!
  • Графические функции были основой многих решений, так как команды использовали различные методы, чтобы извлечь из этого выгоду. Некоторые удалили паразитные (менее частые) узлы, некоторые использовали среднее / медианное значение веса соседей, в то время как большинство моделировали транзитивность.
  • Очевидно, что вопрос 1 или 2 тоже имел значение. Удивительно!
  • НЛП: обрабатывать текст по-разному - строчные и неизменные, пунктуация заменяется по-разному, стоп-слова включаются и исключаются, ставятся и не ставятся и т. Д.
  • Стекинг важен, но люди достигли 0.14x и с одной моделью xgb.
  • Первое местопосле, Поистине унизительно.

Выводы:

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

  • Мой конвейер моделирования был хорош для тестирования, но мне нужно масштабировать операции по построению большего количества моделей на разных гиперпарамах / подмножествах данных.
  • Не отказывайтесь от конструктивных деталей на полпути, некоторые из них оказались дорогостоящими промахами.
  • Не слишком увлекайтесь функцией, потому что вы потратили на нее время. Это довольно забавно, лол!
  • Потратьте много времени на ядра Kaggle и обсуждения. Они чертовски крутые :)

Так что да, это так. Одно соревнование заканчивается, другое начинается. Kaggle вызывает привыкание!

Это верно!

Это было изначально размещено на моемблог, Один блог каждую неделю

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map