Простой и практичный комплексный пример управления компромиссом между смещением и дисперсией на небольшом наборе текстовых данных

Неудивительно, что обнаружение спама в Google или отслеживание 200 000 судов в Vortexa требует машинного обучения и инженерии данных. Люди не могут обрабатывать миллиарды точек данных, и они не так отзывчивы и согласованы, как компьютеры.

Однако многим аналитикам это может показаться далеким от повседневной жизни. Во многих случаях создание новой специальной электронной таблицы Excel или SQL-запроса может довольно быстро дать хорошие результаты. Однако компании, которые также применяют такие технологии в непрофильных областях, получают конкурентное преимущество как в плане масштабируемости, так и в принятии решений на основе данных. В противном случае рутинные процессы заполнят ваши недели и оставят мало места для выявления исключительных возможностей.

В этом сообщении блога мы приводим пример того, как повторяющаяся бизнес-задача может быть преобразована в процесс самосовершенствования всего за пару часов. Этот первый прототип состоит менее чем из 10 строк кода и обеспечивает точность 90% всего лишь с 1000 обучающей выборкой.

Кому это следует прочитать? Эта статья предназначена для тех, кто уже знаком с некоторыми концепциями анализа данных и хочет узнать, как объединить их для решения конкретной бизнес-проблемы.

Прочитав этот пост, вы

  • уметь улучшать и автоматизировать задачи ручной обработки текста
  • знать на практике, как измерять и контролировать недостаточное / переобучение
  • понять, как машинное обучение может принести пользу в повседневной жизни всего за несколько часов, не требуя ресурсов у инженеров или ИТ-специалистов.
  • расширить свою интуицию в отношении того, как на самом деле выглядит машинное обучение, помимо модных словечек

Деловой контекст

В рамках своей деятельности по сравнительному анализу наши аналитики энергетического рынка должны определить, какая часть справочных данных из таможенных данных или национальной статистики (например, JODI или EIA) соответствует данным, предоставленным Vortexa для своих клиентов. У каждого источника данных есть собственное определение того, что представляет собой продукт, и это сообщение в блоге будет сосредоточено на интерпретации строки описания. Ниже приведены примеры описаний товаров:

На основе этих описаний наши рыночные аналитики сопоставляют каждый тип справочных данных с соответствующим продуктом в таксономии Vortexa:

Постановка задачи: классификация текста

Наши рыночные аналитики заметили повторяющуюся модель и спросили команду НИОКР, как они могут объединить свои усилия с помощью некоторой автоматизированной обработки.

В соответствии с формулировкой проблема выглядит как пример классификации на основе функций текста, также известной как обработка естественного языка (NLP).

Проверка реальности: наборы надзора, созданные вручную, как правило, довольно малы

Хотя у них есть десятки тысяч типов данных, которые нужно классифицировать для сравнительного анализа, наши рыночные аналитики на момент написания вручную пометили только 1400 образцов. Напротив, в нашем наборе данных 650 различных слов - это в среднем всего 2 образца на слово.

Что еще хуже, слова не могут быть напрямую связаны с результатом: например, в нашем примере №2 выше описание включает «искл. смеси биодизеля ». Это означает, что слова следует интерпретировать в их контексте: мы не можем просто сделать вывод, что присутствие слова «биодизель» означает, что это биодизель (как раз наоборот!).

Первый простой прокси для захвата контекста слов - это отслеживание соседних слов - концепция, называемая n-грамм.

Если мы рассмотрим все комбинации 1, 2, 3 и 4 соседних слов (1, 2, 3, 4 грамма), это приведет к 6600 функциям.

Это в 6 раз больше параметров, чем точек данных. Если мы не будем осторожны, можно будет построить модель, которая выучит наизусть все примеры, но не сможет извлечь из них обобщаемые уроки. Это означает, что он не сделает ошибок в обучающей выборке, но не сможет эффективно предсказать новые случаи. На жаргоне статистики это называется переобучением или дисперсией. Пример ниже:

Выбор надежного и простого в использовании алгоритма для первого прототипа

Современное НЛП обычно использует сложные нейронные сети, и у специалиста по данным может возникнуть соблазн воспользоваться этими инструментами при любой возможности. Контекст, в котором используются эти инструменты, обычно включает как очень большие наборы данных, так и очень сложные задачи вывода (например, чат-боты или некоторые из основных моделей Vortexa). Однако они, как правило, требуют настройки множества параметров и могут усугубить проблему переобучения.

Вместо этого мы выбрали другой класс алгоритмов: Классификаторы случайного леса. Почему мы выбрали именно их, выходит за рамки этого поста. Одним словом, этот класс моделей хорошо работает без особой оптимизации - он особенно устойчив к переобучению.

Извлечь немного больше информации, чем набор слов

Ранее мы видели, что текстовые шаблоны могут быть разных типов (включая слово и n-грамм). Эти языковые шаблоны, также называемые токенами, связаны между собой грамматикой, и абсолютная и относительная последовательность токенов может быть довольно сложной в человеческом языке. В этом разделе рассказывается о степени сложности, которую мы хотим закодировать для решения поставленной задачи, и о том, как это сделать.

Простое определение наличия определенного шаблона / слова в описании может иметь большое значение - оно часто называется мешком слов (BoW) и в основном кодирует слова как фиктивные переменные (каждый шаблон / слово будет представлен как новый столбец, который равен 1, когда слово присутствует в строке, в противном случае - 0).

Простой способ извлечь немного больше информации из группы документов - удалить или наказать слова, используемые неспецифически во многих описаниях (документах), и выделить слова, которые появляются только в некоторых конкретных случаях и, возможно, используются с настойчивостью в этом конкретном контекст.

Scikit-learn реализует в одном методе ряд стратегий, которые идут в этом направлении: удаление стоп-слов (и / затем и т.д.), установка границ для частоты терминов и оценка терминов по частоте термина и обратной частоте документа (TF-IDF) и сохраняя их в разреженной матрице, эффективно использующей память:

Дальнейший шаг к контролю переобучения: уменьшение размерности

Применение алгоритмов уменьшения размерности к описанию наших продуктов позволит определить, какие группы слов лучше всего разделяют наши образцы. Идея здесь состоит в том, чтобы удалить группы слов, которые являются избыточными или перекрывающимися (коллинеарность), и определить, какая комбинация кажется наиболее дополняющей. Вот иллюстрация концепции уменьшения размерности:

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

Однако для быстрой работы я бы сказал, что это может улучшить производительность за счет снижения риска переобучения (меньшее количество функций) и сделать выбор функции более оптимальным (ортогональные элементы, то есть не коллинеарные, выбираются более эффективно). Учитывая большое количество функций и небольшое количество образцов, я счел вероятным, что уменьшение размерности поможет быстро получить хорошие результаты. Однако более длительное обучение нашего классификатора или выбор функций разными способами может привести к лучшим результатам в долгосрочной перспективе.

Существует ряд стратегий и алгоритмов уменьшения размерности. Я наполовину произвольно выбрал усеченную декомпозицию по сингулярным значениям (SVD), чтобы сохранить разреженную матричную структуру нашего конвейера. Это сделано для оптимизации памяти, но преимущества ограничены, пока набор данных невелик.

Давай попробуем!

Наш простой прототип умещается всего в нескольких строках кода. Мы оборачиваем его конвейером, чтобы его было легче настраивать (см. Ниже).

Как мы должны оценить, что есть добро? Выбор показателя зависит от бизнес-задачи. Здесь нам нужна большая доля правильных результатов по сравнению с неправильными, потому что это то, что аналитики рынка должны будут исправить: это называется точностью. С этим быстрым прототипом мы получаем точность 90% - неплохо для такого небольшого набора данных и простой модели!

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

Несколько слов о тонкой настройке - оптимизация гиперпараметров

Даже после тщательного проектирования все еще остаются оптимизации, зависящие от конкретного случая, которые трудно предвидеть с теоретической точки зрения. Один из способов дальнейшего улучшения алгоритма довольно прост: попробуйте множество комбинаций различных параметров - это называется Gridsearch.

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

Предупреждение: если вы используете только набор train и набор test, после большой оптимизации гиперпараметров вы можете косвенно подогнать гиперпараметры под специфичность вашего набора тестов. . Вместо этого вам, вероятно, понадобится набор обучения, набор перекрестной проверки (CV) и набор тестов. Более сложные методы позволяют оптимизировать обучение и резюме, например k-складки, выходящие за рамки этой публикации.

Что на самом деле повлияло?

Пока что я изложил вам свое видение того, как следует подходить к этой проблеме. Давайте попробуем нашу базовую модель со всеми константами параметров, кроме количества n-граммов и с уменьшением размерности или без него.

Здесь SVD, похоже, помог модели быстрее учиться (с учетом большего количества деревьев и, следовательно, большего времени вычислений, no-SVD, возможно, достиг аналогичного уровня). Добавление большего количества n-граммов, похоже, имеет лишь незначительное влияние.

Давайте также сделаем шаг назад к тому, чего мы достигли: используя 6-граммовый SVD, мы можем в 9 случаях из 10 предсказать правильный продукт. На этом этапе вы можете решить, что (i) это достаточно хорошо, (ii) это можно исправить вручную с гораздо меньшими усилиями и (iii) это нужно улучшить. Для случая (i) больше комментариев не требуется, а для случая (ii) вы захотите рассмотреть в приоритетном порядке низкие вероятности. В оставшейся части этого поста мы предполагаем, что вы находитесь в ситуации (iii).

Помогло бы больше данных?

Ключевой вопрос, на который нужно ответить организации, - поможет ли большее количество тех же данных улучшить результаты, или нужно потратить больше усилий на создание новых функций, или данные лучше / глубже / точнее.

Приведенные ниже кривые обучения показывают, что модели были обучены на оценочном наборе фиксированного размера.

→ Ось x: размер обучающей выборки увеличивается слева направо.

→ Ось Y показывает точность:

  • Красная кривая представляет точность обучающего набора: модель обучается и оценивается на одних и тех же данных. Это показывает, насколько точно модель соответствует данным.
  • Синяя кривая представляет точность перекрестной проверки, т. е. данных, которые модель еще не получала. Это показывает, насколько хорошо модель может быть обобщена.

Интерпретация результатов тренировки (красная кривая)

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

Что еще более интересно, на графике выше точность обучения довольно низкая, когда нет SVD (слева): это может быть то, что модель не может уловить или кодировать изменчивость, показанную в данных. Однако с SVD точность обучения довольно хороша с теми же основными функциями. Так что, вероятно, происходит то, что без SVD наш классификатор не может определить, какие функции имеют значение, и не соответствует данным! В то время как с SVD мы проводили неконтролируемый предварительный отбор.

Интерпретация результатов перекрестной проверки (синяя кривая)

Ожидается, что точность CV будет увеличиваться с увеличением количества данных, поскольку модель учится отличать шум (который может быть переобучен) от подлинного обобщаемого сигнала.

В случае отсутствия SVD (левый столбец) добавление дополнительных данных, по-видимому, замедляет улучшение модели. Вероятно, это связано с тем, что чем больше данных, тем больше новых слов, а значит, и новых функций. Для классификатора, как определено, увеличение сигнала и шума, по-видимому, растет с одинаковой скоростью, а отношение сигнал / шум почти не улучшается.

Напротив, для модели с уменьшением размерности (правый столбец) добавление дополнительных данных явно помогает модели делать более точные прогнозы.

Интерпретация разницы между тренировкой и показателями резюме

Разрыв между обучением и показателями CV - показатель того, насколько больше данных можно получить.

Если оба действительно близки, больше данных одного и того же типа не поможет, и необходимо изучить больше функций, лучшую модель или, возможно, более глубокие / точные данные. Или, возможно, мы достигли максимума информации, которую можно извлечь из данных, и, возможно, оставшаяся ошибка является истинным шумом, который никто или никакой алгоритм не может уменьшить - например, в анализируемых данных могут быть ошибки.

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

Заключение

В этом примере бенчмаркинга полдня работы позволили команде Vortexa снизить нагрузку на аналитиков рынка на 90%.

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

В этом путешествии мы использовали несколько специальных инструментов:

  • N-граммы и TF-IDF для извлечения простой информации из текста,
  • СВД для уменьшения размерности,
  • Случайный лес как классификатор,
  • Gridsearch и конвейеры для настройки нашей модели,
  • Кривые обучения, чтобы понять, следует ли улучшить модель или получить больше данных

Следующим шагом для Vortexa является увеличение контролируемого набора за счет маркировки большего количества наших необработанных данных. Это будет приоритетным, чтобы сосредоточиться там, где бизнесу требуется более высокая производительность, и где классификатор делает наиболее значимые ошибки. Параллельно мы также улучшили наши результаты с помощью других функций, выходящих за рамки этой публикации.

Если это решение окажется полезным, его, возможно, придется дополнить небольшим количеством инженерных решений, чтобы автоматизировать и развернуть масштабируемым образом во всей организации. Это тема следующего сообщения в блоге. Однако это ни в коем случае не должно помешать вам улучшить и автоматизировать свою работу и работу ваших ближайших коллег: как для подтверждения концепции, так и для немедленного воздействия.