- Оригинальный адрес:Automated Feature Engineering in Python
- Оригинальный автор:William Koehrsen
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:mingxing47
- Корректор:yqian1991 Park-ma
Автоматизация проектирования функций в Python
Как автоматизировать создание функций машинного обучения
Машинное обучение использует такие преимущества, какH20,TPOTиauto-sklearnи инструменты все чаще переходят от ручных моделей проектирования к автоматизированным конвейерам оптимизации. Эти библиотеки вместе сrandom searchВместе с другими методами цель состоит в том, чтобы найти лучшую модель для набора данных без вмешательства человека, тем самым упростив выбор модели и часть настройки машинного обучения. Однако разработка признаков как один из конвейеров машинного обученияВозможно, более ценный аспект, почти вся ручная работа.
разработка функций, также известный как создание признаков, представляет собой процесс создания новых признаков из существующих данных и их использования для обучения моделей машинного обучения. Этот шаг может быть более важным, чем фактическая используемая модель, потому что алгоритм машинного обучения учится только на данных, которые мы ему предоставляем, и очень важно создавать функции, соответствующие задаче (см. эту статью)."A Few Useful Things to Know about Machine Learning"-- "Некоторые полезные сведения о машинном обучении", примечание переводчика).
Как правило, проектирование признаков — это длительный ручной процесс, основанный на знаниях предметной области, интуиции и манипулировании данными. Этот процесс может быть очень утомительным, а результирующие свойства ограничены человеческим субъективизмом и затраченным на это временем. Цель автоматической разработки признаков – помочь специалистам по обработке и анализу данных сократить свою рабочую нагрузку путем создания множества признаков-кандидатов из набора данных. Из этих наборов данных, из которых создаются признаки-кандидаты, специалисты по данным могут выбрать лучшие признаки и использовать их для обучения.
В этой статье мы разберемfeaturetools Python libraryСлучай с библиотекой, выполняющей автоматическую разработку функций. Мы будем использовать образец набора данных, чтобы продемонстрировать основы (следите за будущими статьями с использованием реальных данных). Окончательный код для этой статьи можно найти по адресуGitHubПолучать.
Основы проектирования функций
разработка функцийОзначает создание дополнительных функций из существующих наборов данных, распределенных по нескольким связанным таблицам. Разработка признаков влечет за собой извлечение соответствующей информации из данных и помещение ее в отдельную таблицу, которую затем можно использовать для обучения модели машинного обучения.
Процесс создания признаков занимает много времени, поскольку создание каждого нового признака требует множества шагов, особенно когда информацию необходимо получить из более чем одной таблицы. Мы можем разделить операции создания признаков на две категории:конвертироватьиполимеризация. Давайте посмотрим на эти концепции в действии на нескольких примерах.
однаждыконвертироватьОперации работают только с таблицей и могут создавать новые функции из одного или нескольких существующих столбцов (например, в Python таблица похожа на таблицу в библиотеке Pandas).DataFrame
). Как показано в следующем примере, предположим, что у нас есть следующая таблица информации о клиенте (клиентах):
Мы можем получить отjoined
Найдите месяц или пару в столбцеincome
Возьмите натуральный логарифм столбца, чтобы создать функцию. Это все категории преобразований, поскольку все они используют информацию из одной таблицы.
с другой стороны,полимеризацияЭто выполняется для таблиц с использованием отношения «один ко многим» для группировки наблюдений перед вычислением статистики. Например, если у нас есть другая таблица с информацией о кредитах клиентов, и в этой таблице может быть несколько кредитов для каждого клиента, мы можем рассчитать средний, максимальный и минимальный кредиты для каждого клиента и другие статистические данные.
Этот процесс включает в себя группировку таблиц ссуд по клиентам, вычисление агрегаций и последующее слияние полученных данных с данными о клиентах. Следующий код показывает, как мы можем использоватьlanguage of PandasПроцесс расчета библиотеки:
import pandas as pd
# 根据客户 id (client id)进行贷款分组,并计算贷款平均值、最大值、最小值
stats = loans.groupby('client_id')['loan_amount'].agg(['mean', 'max', 'min'])
stats.columns = ['mean_loan_amount', 'max_loan_amount', 'min_loan_amount']
# 和客户的 dataframe 进行合并
stats = clients.merge(stats, left_on = 'client_id', right_index=True, how = 'left')
stats.head(10)
Эти операции сами по себе несложны, но если у нас есть сотни переменных, разбросанных по десяткам таблиц, выполнить их вручную невозможно. В идеале нам нужно решение, которое автоматизирует преобразования и агрегирование нескольких таблиц и, наконец, объединяет полученные данные в одну таблицу. Хотя Pandas — отличный репозиторий, при использовании Pandas нам все равно нужно вручную обрабатывать большое количество данных! (Более подробную информацию о ручной разработке функций можно найти в этой превосходной книгеPython Data Science Handbook).
Фреймворк Featuretools
К счастью, featuretools — это именно то решение, которое мы искали. Эта библиотека Python с открытым исходным кодом может автоматически создавать множество функций из ряда связанных таблиц. Featuretools основан на программе под названием "Deep feature synthesis"(Глубокий синтез признаков), который звучит более впечатляюще, чем на самом деле. (Название происходит от суперпозиции нескольких признаков, а не потому, что метод использует глубокое обучение!)
Глубокий синтез функций объединяет несколько операций преобразования и агрегации (также известных как feautretools).примитивы функций) для создания функций из данных, разбросанных по многим таблицам. Как и большинство идей в области машинного обучения, это сложный подход, основанный на простых концепциях. Этот мощный подход можно хорошо понять, изучая по одному строительному блоку за раз.
Во-первых, давайте посмотрим на наши данные. Мы уже видели некоторые наборы данных, полный набор таблиц выглядит так:
-
clients
: Основная информация о клиенте в кредитном союзе. У каждого клиента есть только одна строка в этом фрейме данных
-
loans
: Кредиты клиентам. Каждый кредит имеет только одну строку в этом фрейме данных, но у клиентов может быть несколько кредитов.
-
payments
: погашение кредита. Для каждого платежа существует только одна строка, но для одного кредита может быть несколько платежей.
Если у нас есть задача машинного обучения, например предсказать, погасит ли клиент будущий кредит, мы объединим всю информацию о клиенте в одну таблицу. Эти таблицы взаимосвязаны (черезclient_id
иloan_id
переменные), мы можем сделать это вручную, используя ряд преобразований и агрегаций. Однако, как мы вскоре увидим, мы можем использовать инструменты для автоматизации этого процесса.
Сущности и наборы сущностей
Для функциональных инструментов двумя наиболее важными понятиями являютсяорганизацияинабор объектов. Сущность — это просто таблица (или PandasDataFrame
). Одиннабор объектовпредставляет собой набор таблиц и отношений между этими таблицами. Вы можете думать о наборе сущностей как о другой структуре данных в Python, которая имеет свои собственные методы и параметры.
Мы можем создать пустой набор сущностей в featuretools с помощью следующего кода:
import featuretools as ft
# 创建新实体集
es = ft.EntitySet(id = 'clients')
Теперь нам нужно добавить несколько объектов. Каждый объект должен иметь индекс, который представляет собой столбец, содержащий все уникальные элементы. То есть каждое значение индекса должно встречаться в таблице ровно один раз.clients
Индекс в кадре данныхclient_id
, потому что у каждого клиента есть только одна строка в этом фрейме данных. Мы добавляем уже проиндексированную сущность в набор сущностей, используя следующий синтаксис:
# 从客户 dataframe 中创建出一个实体
# 这个 dataframe 已经有一个索引和一个时间索引
es = es.entity_from_dataframe(entity_id = 'clients', dataframe = clients,
index = 'client_id', time_index = 'joined')
loans
Фрейм данных также имеет уникальный индекс,loan_id
и добавление в набор сущностейloan_id
синтаксис иclients
Такой же. Однако дляpayments
Для фреймов данных нет уникального индекса. Когда мы добавляем сущность в набор сущностей, нам нужно поместить параметрmake_index
Установить какTrue
( make_index = True
), при этом давая индексу хорошее имя. Кроме того, хотя инструменты функций автоматически определяют тип данных каждого столбца в объекте, мы также можем передать словарь типов столбцов в параметрvariable_types
переписать тип данных.
# 从付款 dataframe 中创建一个实体
# 该实体还没有一个唯一的索引
es = es.entity_from_dataframe(entity_id = 'payments',
dataframe = payments,
variable_types = {'missed': ft.variable_types.Categorical},
make_index = True,
index = 'payment_id',
time_index = 'payment_date')
Для этого фрейма данных, даже еслиmissed
это целочисленные данные, это неЧисловая переменная, так как он может принимать только два дискретных значения, мы указываем featuretools рассматривать его как категориальную переменную. После добавления фреймов данных в набор сущностей мы проверим любой из них:
Модификации, которые мы указали, правильно определяют типы столбцов. Далее нам нужно указать, как связаны таблицы в наборе сущностей.
отношение таблицы
Рассмотрим разницу между двумя таблицамисвязьЛучший способАналогия отца и ребенка. Это отношение «один ко многим»: у каждого родителя может быть несколько дочерних элементов. В табличном мире у родителя есть строка в каждой родительской таблице, но в дочерней таблице может быть несколько строк, соответствующих нескольким дочерним элементам одного и того же родителя.
Например, в нашем наборе данныхclients
кадр данныхloans
Родитель фрейма данных. каждый клиент вclients
имеет только одну строку вloans
Может быть несколько строк в . такой же,loans
даpayments
отец, так как каждый кредит имеет несколько платежей. Отец связан с ребенком через общую переменную. Когда мы выполняем агрегацию, мы группируем дочерние таблицы по родительской переменной и вычисляем статистику дочерних таблиц для каждой родительской таблицы.
хотетьФорматирование отношений в featuretools, мы просто указываем переменную, которая связывает две таблицы вместе.clients
иloans
проход столаloan_id
переменная ссылка,loans
иpayments
пройти черезloan_id
связать вместе. Синтаксис для создания отношения и добавления его в набор сущностей следующий:
# 客户与先前贷款的关系
r_client_previous = ft.Relationship(es['clients']['client_id'],
es['loans']['client_id'])
# 将关系添加到实体集
es = es.add_relationship(r_client_previous)
# 以前的贷款和以前的付款之间的关系
r_payments = ft.Relationship(es['loans']['loan_id'],
es['payments']['loan_id'])
# 将关系添加到实体集
es = es.add_relationship(r_payments)
es
Набор сущностей теперь содержит три сущности (или таблицы) и отношения, соединяющие эти сущности. После добавления сущностей и формализации отношений наш набор сущностей готов, и мы готовы создавать функции.
примитивы функций
Прежде чем погрузиться в синтез функций, нам нужно понятьпримитивы функций. Мы уже знаем, что они собой представляют, но мы просто называем их по-разному! Вот основные операции, которые мы используем для формирования новых функций:
- Агрегация: Операция, выполняемая через отношения родитель-потомок (один-ко-многим) и вычисляющая статистику дочернего элемента. Пример через
client_id
будетloan
Сгруппируйте таблицы и найдите максимальную сумму кредита для каждого клиента. - Преобразование: операция, выполняемая над одним или несколькими столбцами одной таблицы. Например, возьмем разницу между двумя столбцами в таблице или возьмем абсолютное значение столбца.
Новые функции создаются в featruetools, используя эти примитивы функций сами по себе или объединяя несколько примитивов функций. Ниже приведен список некоторых примитивов функций в featuretools (мы также можемОпределение примитивов пользовательских функций:
примитивы функций
Эти примитивы можно использовать сами по себе или комбинировать для создания функций. Чтобы использовать указанный примитив, мы используемft.dfs
функция (расшифровывается как глубокий синтез признаков). мы проходим в实体集
,目标实体
(эти два параметра — таблица, к которой мы хотим присоединить функцию) иtrans_primitives
параметры (для преобразования) иagg_primitives
Параметры (для агрегации):
# 使用指定的基元创建新特征
features, feature_names = ft.dfs(entityset = es, target_entity = 'clients',
agg_primitives = ['mean', 'max', 'percent_true', 'last'],
trans_primitives = ['years', 'month', 'subtract', 'divide'])
Результат, возвращаемый вышеприведенной функцией, представляет собой фрейм данных новых функций для каждого клиента (поскольку мы определили клиентов как目标实体
). Например, у нас есть месяц, в который присоединяется каждый клиент, и этот месяц является примитивом конверсии:
У нас также есть некоторые примитивы агрегации, такие как средняя сумма платежа на одного клиента:
Хотя мы указали только несколько примитивов функций, featuretools создает много новых функций, комбинируя и складывая эти примитивы.
Полный фрейм данных имеет 793 новых столбца!
Глубокий синтез признаков
Теперь мы готовы понять все части глубокого синтеза признаков (dfs). На самом деле мы уже выполнили функцию dfs в предыдущем вызове функции! Функция глубины — это просто функция, которая объединяет несколько примитивов функций, а dfs — это имя процесса, который генерирует эти функции. Глубина глубокой функции — это количество функций, необходимых для создания функции.
Например,MEAN(payments.payment_amount)
Столбец — это функция с глубиной 1, поскольку она была создана с использованием одного агрегата. Особенности глубины 2LAST(loans(MEAN(payments.payment_amount))
, который формируется путем наложения двух агрегатов: ПОСЛЕДНИЙ (самый последний) выше среднего. Это представляет собой среднюю сумму платежа по последнему кредиту каждого клиента.
Мы можем накладывать функции на любую глубину, какую захотим, но на практике я никогда не выходил за пределы глубины 2. После этого функции трудно объяснить, но я призываю тех, кто заинтересован, попробовать«Глубокое исследование».
Вместо того, чтобы указывать примитивы функций вручную, мы можем позволить инструментам функций автоматически выбирать функции для нас. Для этого используем тот жеft.dfs
Вызов функции, но без передачи каких-либо типовых примитивов:
# 执行深度特征合成而不指定特征基元。
features, feature_names = ft.dfs(entityset=es, target_entity='clients',
max_depth = 2)
features.head()
Featuretools создал много новых функций, которые мы можем использовать. Хотя этот процесс автоматически создает новые функции, он не заменит специалиста по данным, поскольку нам все еще нужно выяснить, что делать со всеми ними. Например, если наша цель состоит в том, чтобы предсказать, погасит ли клиент кредит, мы можем искать функции, наиболее релевантные для конкретного результата. Кроме того, если у нас есть специальные знания предметной области, мы можем использовать их для выбора определенных примитивов признаков с признаками-кандидатами илиСинтез признаков глубины затравки.
следующие шаги
Автоматизированная разработка функций решает одну проблему, но создает другую: создание слишком большого количества функций. Хотя трудно сказать, какие из этих функций важны, пока модель не будет определена, вполне вероятно, что не все из них имеют отношение к задаче, над которой мы хотим тренироваться. и,имеет слишком много функцийМожет ухудшить производительность модели, так как во время обучения некоторые менее полезные функции перевешивают более важные.
Проблема слишком большого количества функций называетсяПроклятие размерности. По мере увеличения количества признаков (увеличение размерности данных) модели становится все труднее понять сопоставление между признаками и целями. Фактически, количество данных (экспоненциально пропорциональное количеству признаков), необходимое для хорошей работы модели (stats.stackExchange.com/ah/65380/157…).
Что может снять проклятие размерности?Сокращение функций (также известное как выбор функций): процесс удаления ненужных функций. Это может принимать различные формы: анализ основных компонентов (PCA), использование класса SelectKBest, использование функций, представленных в модели, или использование глубоких нейронных сетей для автоматического кодирования. Конечно,Сокращение функцийЭто уже другая тема для другой статьи. Теперь мы знаем, что можем использовать инструменты функций для создания большого количества функций из многих таблиц с минимальными усилиями!
в заключении
Как и многие темы машинного обучения, автоматическая разработка функций с помощью feautretools — это сложная концепция, основанная на простых идеях. Используя концепции наборов сущностей, сущностей и отношений, feautretools может выполнять глубокий синтез функций для создания новых функций. Глубокий синтез функций, в свою очередь, объединяет примитивы функций, то естьполимеризация, установить связь «один ко многим» между таблицами, и в то же времяконвертировать, применять к одному или нескольким столбцам в одной таблице и создавать новые функции из многих таблиц с помощью этих методов.
Следите за этой статьей, а пока прочитайте введение в конкурс.this introduction to get started. Я надеюсь, что теперь вы можете использовать автоматическую разработку функций в качестве вспомогательного средства в своем конвейере обработки данных. Наши модели будут такими же качественными, как и данные, которые мы предоставляем, а автоматизированная разработка признаков может помочь сделать процесс создания признаков более эффективным.
Для получения дополнительной информации об инструментах функций, включая расширенное использование этих инструментов, см.онлайн-документация. Чтобы увидеть, как инструменты объектов применяются на практике, см.Работа Feature Labs, которая является компанией, разработавшей инструменты библиотеки с открытым исходным кодом.
Как всегда, я приветствую ваши отзывы и конструктивную критику, которые вы можете найти в Твиттере.@koehrsen_willОбщайтесь со мной дальше.
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.