Как создать собственный преобразователь для конвейера Sklearn
Одной из наиболее часто используемых и популярных функций Scikit-Learn являются конвейеры. Хотя их использование не является обязательным, их можно использовать, чтобы сделать наш код чище и проще в обслуживании. Конвейеры принимают на вход оценщики, которые являются классами, унаследованными от sklearn.base.BaseEstimator и содержащими методы fit и transform. Это позволяет нам настраивать пайплайны с функциями, которые Sklearn не предлагает по умолчанию.
Мы поговорим об преобразователях, объектах, которые применяют преобразование к входным данным. Класс, от которого мы будем унаследованы, — TransformerMixin, но его также можно расширить от ClassifierMixin, RegressionMixin, ClusterMixin и других, чтобы создать собственный оценщик. Читайте здесь для всех доступных вариантов.
Мы будем работать с набором текстовых данных, к которым мы хотим применить такие преобразования, как:
- предварительная обработка текста
- Векторизация TF-IDF
- создание дополнительных функций, таких как тональность, количество символов и количество предложений
Это будет сделано с помощью Pipeline и FeatureUnion, класса Sklearn, который объединяет наборы функций из разных источников.
Набор данных
Мы будем использовать набор данных, предоставленный Sklearn, 20newsgroups, чтобы иметь быстрый доступ к массиву текстовых данных. В демонстрационных целях я буду использовать только образец из 10 текстов, но пример можно распространить на любое количество текстов.
Давайте импортируем набор данных
Создание текстовых функций
Мы создадим набор функций, содержащий эту информацию.
- векторизация с помощью TF-IDF после применения предварительной обработки
- настроения с NLTK.Vader
- количество символов в тексте
- количество предложений в тексте
Наш процесс без использования конвейеров заключался бы в последовательном применении всех этих шагов с отдельными блоками кода. Прелесть конвейеров в том, что последовательность поддерживается в одном блоке кода — сам конвейер становится оценщиком, способным выполнять все операции в одном операторе.
Давайте создадим наши функции
Наша цель — создать уникальный набор функций для обучения модели какой-либо задаче. Мы будем использовать Pipelines и FeatureUnion для объединения наших матриц.
Как объединить функции из разных источников
Векторизация TF-IDF создаст разреженную матрицу с размерами n_documents_in_corpus*n_features, тональностью будет одно число, а также выходными данными n_chars и n_sentences. Мы возьмем результаты каждого из этих шагов и создадим единую матрицу, которая будет содержать их все, чтобы мы могли обучить модель всем функциям, которые мы разработали. Начнем с такой схемы
и достичь этого окончательного представления
Набор функций будет использоваться в качестве обучающего вектора для нашей модели.
Классы, наследуемые от BaseEstimator и TransformerMixin
Чтобы запустить наш процесс, нам нужно определить классы и то, что они будут делать в конвейере. Давайте начнем с создания DummyEstimator, от которого мы унаследуем init, fit и transform. DummyEstimator — это удобный класс, который избавляет нас от написания избыточного кода.
DummyEstimator будет унаследован от четырех классов: Preprocessor, SentimentAnalysis, NChars, NSentences и FromSparseToArray.
Как видите, DummyEstimator позволяет нам определить только функцию преобразования, поскольку все остальные классы наследуют свои init и fit от DummyEstimator.
Теперь давайте посмотрим, как реализовать конвейер векторизации, который будет учитывать предварительную обработку наших текстов.
Все, что осталось, это применить FeatureUnion, чтобы собрать части вместе.
Давайте проверим вывод fit_transform на нашем корпусе.
Вывод вроде правильный! Хотя не очень понятно. Мы завершаем учебник, вставляя комбинированный набор функций в фрейм данных.
Результат следующий (здесь я обрезал результат для удобства чтения)
Теперь у нас есть набор данных, готовый для использования в любой модели обучения. Было бы полезно поэкспериментировать с sklearn.preprocessing.StandardScaler или подобным и нормализовать n_chars и n_sentences. Я оставлю это упражнение читателю.
Заключение
Мы увидели, что базовые манипуляции с классами BaseEstimator, TransformerMixin и FeatureUnion в Sklearn могут сделать для нашего пользовательского проекта.
Это позволяет нам создавать пользовательские классы предварительной обработки и объединять наборы функций вместе, оставаясь в конвейере.
Такой подход повышает производительность и чистоту кода и может помочь всей команде в структурировании сценариев и блокнотов.
Надеюсь, сегодня вы узнали что-то новое и примените эти принципы в своей кодовой базе! 😀
Рекомендуемые чтения
Для интересующихся вот список книг, которые я рекомендовал по каждой теме, связанной с ML. На мой взгляд, есть НЕОБХОДИМЫЕ книги, которые сильно повлияли на мою профессиональную карьеру.
Отказ от ответственности: это партнерские ссылки Amazon. Я получу небольшую комиссию от Amazon за то, что порекомендую вам эти товары. Ваш опыт не изменится, и вы не будете платить больше, но это поможет мне масштабировать свой бизнес и создавать еще больше контента на основе ИИ.
- Введение в машинное обучение: Уверенные навыки работы с данными: овладейте основами работы с данными и продвиньтесь по карьерной лестнице, Кирилл Еременко
- Sklearn / TensorFlow: Практическое машинное обучение с помощью Scikit-Learn, Keras и TensorFlow, автор Орельен Жерон.
- НЛП:Текст как данные: новая структура для машинного обучения и социальных наук, Джастин Гриммер
- Sklearn / PyTorch:Машинное обучение с помощью PyTorch и Scikit-Learn: разработка моделей машинного обучения и глубокого обучения с помощью Python, Себастьян Рашка.
- Визуализация данных: Рассказывание историй с помощью данных: руководство по визуализации данных для бизнес-профессионалов, Коул Кнафлик.
Полезные ссылки (написано мной)
- Узнайте, как выполнять первоклассный исследовательский анализ данных в Python: Исследовательский анализ данных в Python — пошаговый процесс
- Изучите основы TensorFlow: Начало работы с TensorFlow 2.0 — Введение в глубокое обучение
- Выполнение кластеризации текста с помощью TF-IDF в Python: Кластеризация текста с помощью TF-IDF в Python
Если вы хотите поддержать мою деятельность по созданию контента, не стесняйтесь перейти по моей реферальной ссылке ниже и присоединиться к программе членства Medium. Я получу часть ваших инвестиций, и вы сможете беспрепятственно получить доступ к множеству статей Medium по науке о данных и многому другому.