Как создать собственный преобразователь для конвейера 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 за то, что порекомендую вам эти товары. Ваш опыт не изменится, и вы не будете платить больше, но это поможет мне масштабировать свой бизнес и создавать еще больше контента на основе ИИ.

Полезные ссылки (написано мной)

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



Код