- Кластеризация названий продуктов с помощью Python — Часть 2
- К-средство кластеризации
- Оптимальное количество кластеров
- Создание кластеров
- Оценка качества кластера
- Кластерные метки для удобства чтения
- Размер кластера
- Дальнейшая маркировка не обязательна
- Визуализируем все это вместе
- Результаты
- Мешок слов | K = 200 | 93% в чистых кластерах
- Fuzzywuzzy | K = 500 | 86% в чистых кластерах
- TF-IDF (уровень слов) | K = 300 | 78% в чистых кластерах
- TF-IDF (уровень н-грамм) | K = 500 | 87% в чистых кластерах
- Тонкая настройка
- Вывод
Кластеризация названий продуктов с помощью Python — Часть 2
В этом руководстве рассказывается, как мы можем использовать обработку естественного языка (NLP) и K-means в Python для автоматической кластеризации немаркированных названий продуктов, чтобы быстро понять, какие виды продуктов входят в набор данных.
Эта статья является частью 2 и будет охватывать: K-средство кластеризации, оценку качества кластера и точную настройку.
Если вы еще этого не сделали, прочтите Часть 1, которая посвящена предварительной обработке и векторизации.
Теперь, когда у нас есть матрицы слов, приступим к кластеризации.
К-средство кластеризации
Это самая сексуальная часть: кластеризация наших матриц слов.
Кластеризация K-средних распределяет точки данных в дискретные группы на основе их сходства или близости друг к другу. Мы указываем количество кластеров K, и алгоритм итеративно назначает каждое наблюдение кластеру, пока наблюдения каждого кластера не станут как можно ближе к его среднему значению (или центроиду).
Теоретически похожие названия продуктов должны быть сгруппированы вместе, потому что они имеют одинаковые значения для одних и тех же слов (и n-граммов).
Оптимальное количество кластеров
Как мы узнаем, что указывать как K? Мы можем использовать метод изгиба для проверки различных значений K и сравнения расстояний каждой точки данных от их центроидов (сумма квадратов ошибок или SSE).
Чтобы понять типы продуктов питания в нашем наборе данных, мы хотим сбалансировать, чтобы названия продуктов питания были как можно более похожими в кластере (низкий SSE) и имели значимые кластеры из более чем 1 или 2 названий продуктов в каждом.
Давайте сделаем это с помощью нашей матрицы набора слов. Мы знаем, что в названиях наших продуктов есть 851 отдельное слово, поэтому их не может быть больше.
Чем больше кластеров мы создаем, тем ниже должно быть SSE и тем ближе друг к другу каждый кластер от своего центроида. Если бы мы расширили график до K = 1500 (один кластер для каждого отдельного названия продукта), SSE было бы 0.
Точка изгиба выглядит на 200. Снижение SSE после этой точки начинает становиться все меньше.
Создание кластеров
Начнем с этого и проверим K = 200.
Теперь каждая строка в нашей матрице набора слов была назначена кластеру от 0 до 199. И вы можете видеть, что наши измельченные специи в первых 5 строках находятся в том же кластере. Ваху!
Оценка качества кластера
Создать кластеры было достаточно просто. Теперь мы хотим знать, правильно ли кластеризация отвечает на вопрос о том, какие продукты есть в наборе данных. Мы уже знаем, что чем больше кластеров, тем меньше SSE. Но как это повлияет на значимость кластеров?
Нам нужны другие меры для сравнения разного количества кластеров, а также различных матриц слов. Примечание. SSE не следует использовать для сравнения разных матриц, поскольку их значения по своей сути разные. Например, набор слов использует целые числа (0, 1, 2 и т. Д.) Для представления появления слова, в то время как TF-IDF использует взвешенную оценку от 0 до 1.
Кластерные метки для удобства чтения
Сейчас наши кластеры представляют собой числа от 0 до 199. Давайте дадим нашим кластерам удобочитаемые ярлыки. Мы можем сделать это автоматически, получив имена столбцов матрицы, которые имеют значение ›0 для каждой строки в каждом кластере. Таким образом, мы можем увидеть слово (а), общее для всех названий продуктов питания в кластере.
Мы можем начать понимать, что представляет собой каждый из кластеров. Примечание. Есть группы, в названиях блюд которых нет общих слов, поэтому они не помечены.
Размер кластера
Теперь, когда у нас есть метки кластера, мы можем посмотреть количество помеченных кластеров и их размер.
При K = 200 с матрицей «мешок слов» только 96 из 1534 названий продуктов питания не маркированы, а 8 названий продуктов находятся в кластерах по 1. В целом 93% названий продуктов питания были сгруппированы в чистый кластер. Для первого теста звучит неплохо!
Дальнейшая маркировка не обязательна
Чтобы упростить оценку качества кластеров, я сгруппировал кластеры по категориям супермаркетов высокого уровня (фрукты и овощи, кладовая и т. Д.). В этом нет необходимости, особенно с меньшим количеством кластеров, но читать стало проще простого.
Категоризация 1534 наименований еды вручную — это не весело. Классифицировать несколько сотен кластеров вручную проще. Если у вас есть частично размеченные данные, здесь может пригодиться алгоритм классификации.
Визуализируем все это вместе
Распространенным методом визуализации сходства документов является t-SNE. Он проецирует векторизованные данные с высокой размерностью в два измерения.
Однако из-за большого количества имеющихся у нас кластеров t-SNE не самый лучший для удобочитаемости. Трудно увидеть отдельные кластеры и их размер. А на 200 кластерах мы перебираем цветовые карты несколько раз, чтобы раскрасить каждый кластер, что еще больше усложняет чтение.
Вместо этого я выбрал древовидную карту, которая может аккуратно отображать метки и размеры наших кластеров в соответствующих категориях супермаркетов. Давайте посмотрим, что мы получим с нашей матрицей набора слов.
Результаты
Мешок слов | K = 200 | 93% в чистых кластерах
Довольно фантастично для нескольких строк кода.
Давайте оценим наши кластеры в K = 200. Для большинства категорий у нас есть несколько больших групп общих слов, которые описывают, в какой форме входят продукты. Например, «сырой», «сушеный», «сырой», «вареный», «осушенный». Даже с небольшими кластерами мы не получаем представления о типах продуктов питания в наборе данных.
K = 200 оказалось оптимальным для матрицы мешка слов. Тесты 100, 150, 250 и 300 поместили меньшее количество названий продуктов в чистые кластеры и не сделали ярлыки кластеров более значимыми.
Если пакету слов присваивается (в основном) равный вес каждому слову в векторе, имеет смысл, что кластеризация дает группы наиболее часто встречающихся слов.
Fuzzywuzzy | K = 500 | 86% в чистых кластерах
Как и набор слов, наши кластеры Fuzzywuzzy сосредоточены на словах, используемых для описания продуктов, а не на самих продуктах: «с добавлением жира», «коммерческий», «сырой».
Он смог найти больше групп с описанием длинного хвоста, например «вареные, без добавления жира или соли», потому что в матрице упор делался на сходство строк, а не на сходство слов.
Опять же, кластеры основаны на наиболее часто встречающихся словах или последовательностях слов.
TF-IDF (уровень слов) | K = 300 | 78% в чистых кластерах
TF-IDF на уровне слов дала результаты, которые имели самый человеческий смысл для большинства категорий супермаркетов.
Теперь мы можем видеть типы продуктов питания в большинстве кластеров: «свинина», «ростбиф», «несоленые орехи», «макароны из пшеничной муки», «капуста», «сырые неочищенные яблоки»!
Эти слова можно было сгруппировать, поскольку алгоритм TF-IDF придал им больший вес, а более распространенным описательным словам — меньший вес.
TF-IDF (уровень н-грамм) | K = 500 | 87% в чистых кластерах
TF-IDF на уровне N-грамм добавил намного больше цвета к некоторым категориям, чем TF-IDF на уровне слов, из-за ключевых биграмм. Например, в кладовой у нас теперь есть «хлопья для завтрака», «сладкое печенье» и «батончик мюсли». Среди молочных продуктов, яиц и холодильников теперь есть «маргариновый спред с пониженным содержанием жира», «козий сыр» и «сливочный жир».
Тонкая настройка
Хотя эти тесты впечатляют тем, насколько мало требуется человеческого вмешательства, всегда есть порог названий продуктов, которые не маркированы или имеют менее подходящие ярлыки (например, «сырые» гораздо менее полезны, чем «капуста»).
Вот еще несколько дополнительных настроек, которые можно протестировать, чтобы свести к минимуму количество остаточных названий продуктов питания.
- Попробуйте удалить больше слов на этапе предварительной обработки или уменьшить их вес на этапе векторизации.
- Проверьте пороговые значения в настройках min_df и max_df, чтобы игнорировать термины, которые появляются слишком часто или недостаточно часто на этапе векторизации.
- Для более крупных кластеров с широкими этикетками повторная кластеризация по отдельности может помочь различить названия продуктов питания.
- И наоборот, протестируйте иерархическую кластеризацию для восходящего подхода к группированию названий продуктов питания. Примечание: это лучше всего работает с наборами данных меньшего размера или менее уникальными.
- Если ничего не помогает, попробуйте вручную пометить достаточно названий продуктов желаемыми этикетками и вместо этого использовать алгоритм классификации.
Вывод
Мы увидели, насколько эффективны НЛП и кластеризация K-средних для организации текста без меток.
Как и в случае с любым другим моделированием, не существует одной модели, подходящей для всех наборов данных и вариантов использования. Но есть практические шаги, которые нужно пройти, и соображения по поводу тестирования.
Применение этого в категоризации продуктов электронной коммерции дает много преимуществ: высвобождение рабочего времени, более точная и динамическая категоризация, лучшее понимание запасов и более значимый конкурентный анализ, и это лишь некоторые из них.
И есть еще много реальных приложений: анализ настроений в сообщениях и обзорах в социальных сетях, нечеткий поиск, рекомендации по продуктам, фильтрация электронной почты.
Набор данных, используемый в этом руководстве, взят из Австралийской базы данных о составе пищевых продуктов и лицензирован Food Standards Australia New Zealand.