Введение в разработку функций для машинного обучения с помощью Python |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2024-03-31 14:01 Разработка функций — это процесс преобразования данных для повышения прогнозной эффективности моделей машинного обучения. Введение Разработка функций, пожалуй, самый важный, но упускаемый из виду навык в прогнозном моделировании. Мы используем его в повседневной жизни, даже не задумываясь об этом! Поясню — допустим, вы бармен, и к вам подходит человек и просит водку-тоник. Вы продолжаете запрашивать удостоверение личности и видите, что день рождения человека — «12.09.1998». Эта информация по своей сути не имеет смысла, но вы суммируете количество лет, выполняя быстрые математические вычисления, и выясняете, что этому человеку 22 года (что превышает возраст, с которого разрешено употребление алкоголя). Что там произошло? Вы взяли часть информации («12.09.1998») и преобразовали ее, чтобы она стала другой переменной (возраст), чтобы решить возникший у вас вопрос («Можно ли этому человеку пить?»). Разработка функций — это именно то, что касается моделей машинного обучения. Мы даем нашей модели (моделям) наилучшее представление наших данных — путем преобразования и манипулирования ими — чтобы лучше предсказать интересующий нас результат. Если сейчас это не на 100% ясно, то станет намного яснее, когда мы рассмотрим реальные примеры в этой статье. Определение Разработка функций — это процесс преобразования данных для повышения прогнозной эффективности моделей машинного обучения. Важность Разработка функций полезна и необходима по следующим причинам:
Разработка функций необходима, поскольку большинство моделей не могут принимать определенные представления данных. Например, такие модели, как линейная регрессия, не могут обрабатывать пропущенные значения самостоятельно — их необходимо вменить (заполнить). Мы увидим примеры этого в следующем разделе. Рабочий процесс Каждый конвейер обработки данных начинается с исследовательского анализа данных (EDA) или первоначального анализа наших данных. EDA — это важный предварительный шаг, поскольку мы лучше понимаем, какие функции нам нужно создать/изменить. Следующим шагом обычно является очистка/стандартизация данных в зависимости от того, насколько неструктурированы или беспорядочны данные. Далее следует разработка функций, и мы начинаем этот процесс с оценки базовой производительности имеющихся данных. Затем мы итеративно конструируем функции и постоянно оцениваем производительность модели (и сравниваем ее с базовой производительностью) с помощью процесса, называемого выбором функций, пока не будем удовлетворены результатами. О чем говорится в этой статье, а что нет Разработка функций — это обширная область, поскольку существует множество аспектов, специфичных для предметной области. В этой статье рассматриваются некоторые популярные методы, используемые при работе с наборами табличных данных. Мы не рассматриваем разработку функций для обработки естественного языка (NLP), классификации изображений, данных временных рядов и т. д. Два подхода к разработке функций Существует два основных подхода к проектированию признаков для большинства наборов табличных данных:
Теперь мы рассмотрим эти подходы подробно, используя реальные наборы данных. Обратите внимание: эти примеры довольно процедурны и направлены на то, чтобы показать, как их можно реализовать на Python. Тематическое исследование, следующее за этим разделом, покажет вам реальный комплексный сценарий использования практик, которые мы затрагиваем в этом разделе. Прежде чем загружать набор данных, мы импортируем следующие зависимости, показанные ниже.
Теперь мы продемонстрируем подход с использованием контрольного списка, используя набор данных о продажах в супермаркетах. Исходный набор данных и дополнительная информация о нем доступны здесь . Обратите внимание, что для этого урока набор данных был немного изменен. Разверните, чтобы увидеть описания столбцов Столбцы описаны следующим образом:
Вне:
Метод контрольного списка Числовые агрегаты Числовое агрегирование — это распространенный подход к проектированию признаков для продольных или панельных данных — данных, в которых объекты повторяются. В нашем наборе данных есть категориальные переменные с повторяющимися наблюдениями (например, у нас есть несколько записей для каждого филиала супермаркета). Числовая агрегация включает в себя три параметра:
В приведенном ниже фрагменте кода показаны три примера числовых агрегаций, основанных на среднем значении, стандартном отклонении и количестве соответственно. В следующем блоке наши три параметра:
Ниже мы группируем данные по ветвям и выполняем три статистических агрегирования (среднее значение, стандартное отклонение и подсчет), преобразуя интересующие числовые столбцы. Например, в первом назначении столбца мы вычисляем средний налог 5% и среднюю цену за единицу для каждого филиала, что дает нам два новых столбца —
И мы видим функции, которые мы только что создали ниже.
Вне:
Примечание. Поскольку мы просматриваем подмножество столбцов в полном объеме Выбор числовых параметров агрегирования Как нам выбрать, какие три параметра использовать? Ну, это будет зависеть от ваших знаний в предметной области и вашего понимания набора данных. Например, в этом наборе данных, если вы чувствуете, что изменение среднего ( тип агрегирования) рейтинга (числовая переменная) на основе отрасли (категориальный столбец) важно для прогнозирования валового дохода (целевая переменная), создайте функцию! Если вы считаете, что количество продуктов в линейке продуктов по отраслям важно для определения валового дохода, закодируйте это как функцию! Теперь, если вы можете протестировать как можно больше комбинаций трех параметров — продолжайте — при условии, что вы тщательно выбираете только те функции, которые имеют достаточную предсказательную силу, то есть убедитесь, что у вас есть строгий процесс выбора функций. Ниже мы можем увидеть пару созданных нами столбцов (
Вне:
1003 строки x 5 столбцов Но зачем все это необходимо? Прежде чем я продолжу, вы, возможно, задаетесь вопросом, почему это вообще необходимо – разве хорошие модели не созданы для того, чтобы учитывать все эти агрегаты? В какой-то степени да, но не всегда. Это во многом зависит от размера и размерности (количества столбцов) вашего набора данных. Чем больше набор данных, тем больше объектов (на несколько порядков) вы можете создать. Когда функций слишком много, модель имеет слишком много конкурирующих сигналов для прогнозирования целевой переменной. Разработка функций пытается явно сосредоточить внимание модели на определенных функциях. Подводя итог, можно сказать, что разработка функций заключается не в создании «новой» информации, а скорее в направлении и/или концентрации внимания модели на определенной информации, которую вы, как специалист по данным, считаете важной. Переменные индикатора и условия взаимодействия Следуя той же модели мышления, что и числовые агрегации, мы можем создавать индикаторные переменные и условия взаимодействия. Индикаторные переменные принимают значение 0 или 1 только для обозначения отсутствия или присутствия некоторой информации. Например, ниже мы определяем индикаторную переменную, Условия взаимодействия создаются на основе наличия эффектов взаимодействия между двумя или более переменными. Во многом это обусловлено экспертными знаниями в предметной области, хотя существуют статистические тесты, помогающие их определить (что выходит за рамки этой статьи). Например, хотя бесплатная доставка может повлиять на рейтинг клиента, бесплатная доставка в сочетании с количеством может иметь другое влияние на рейтинг клиента, который было бы полезно закодировать (предполагая, что в данном случае рейтинг клиента является целевой переменной). Ниже мы определяем переменную Мы используем
Вне:
Числовые преобразования Некоторые ученые, работающие с данными, не считают, что числовые преобразования подпадают под разработку функций. Это связано с тем, что многие модели, особенно новые, такие как древовидные модели (деревья решений, случайные леса и т. д.), не подвергаются воздействию этих преобразований. Другими словами, выполнение этих преобразований не улучшает производительность прогнозирования. Но для других моделей, таких как линейная регрессия, эти преобразования могут иметь большое значение, поскольку они чувствительны к масштабу переменных. Ниже мы создадим новую переменную Мы также можем выполнить другие преобразования, такие как возведение переменной в квадрат (показано в фрагменте кода ниже), если мы считаем, что связь между предиктором и целевой переменной носит не линейный, а квадратичный характер (при изменении предикторной переменной целевая переменная изменяется на порядок 2). Мы можем даже иметь кубические переменные или любой полиномиальный член n степени — это на ваше усмотрение и знание предметной области.
Вне:
РЕЗУЛЬТАТ: Как мы видим, логарифмическое преобразование сделало распределение стоимости проданных товаров (cogs) более нормальным (или менее смещенным вправо). Это принесет пользу таким моделям, как линейная регрессия, поскольку на их веса/коэффициенты не будут сильно влиять выбросы, вызвавшие первоначальную асимметрию. Кроме того, поскольку на протяжении статьи мы будем сравнивать графики рядом друг с другом много раз, с этого момента мы будем просто использовать эту вспомогательную функцию:
Числовое масштабирование Столбцы в наборе данных обычно имеют разные масштабы. Например, в нашем наборе данных «валовой доход» и «рейтинг» имеют совершенно разные шкалы (как показано ниже). Чтобы исправить это, мы можем выполнить «нормализацию», чтобы поместить оба столбца в шкалу от 0 до 1. Почему мы это делаем? Когда переменные-предикторы находятся в очень разных масштабах, такие модели, как линейная регрессия, могут смещать коэффициенты к переменным в более крупном масштабе. Поэтому мы исправляем это, нормализуя эти числовые переменные. Мы можем нормализовать переменную разными способами, но наиболее распространенный способ сделать это — использовать масштабатор min-max (показан ниже графиков). Формула приведена ниже — для каждого значения в столбце вычитаем минимальное значение столбца и полученное число делим на диапазон столбца ( ). Мы можем увидеть диапазон
Вне:
РЕЗУЛЬТАТ: Ниже мы можем увидеть разницу в масштабе после применения нормализации.
РЕЗУЛЬТАТ: Обратите внимание, что графики выглядят одинаково, но масштаб по оси X теперь находится между 0 и 1. Обработка категориальных переменных Горячее кодирование Модели машинного обучения могут обрабатывать только числовые переменные. Поэтому мы должны кодировать категориальные переменные как числовые. Самый простой способ сделать это — выполнить «горячее кодирование», что означает, что мы создаем индикаторные переменные для категориального столбца с категории. В приведенном ниже коде показано, как мы можем выполнить горячее кодирование двух категориальных столбцов —
Вне:
Но есть проблемы с этим подходом. Если у нас есть столбец с 1000 категориями, одно горячее кодирование этого столбца создаст 1000 новых столбцов! Это много! Вы снабжаете модель слишком большим количеством информации, и, естественно, найти закономерности становится гораздо сложнее. Когда у нас слишком много размерностей, нашей модели потребуется гораздо больше времени для обучения и поиска оптимальных весов предикторов. Целевая кодировка Чтобы решить эту проблему, мы можем использовать целевую кодировку. Целевая кодировка не создает дополнительных столбцов. Идея проста: для каждой уникальной категории рассчитывается среднее значение целевой переменной (при условии, что она непрерывная или двоичная), и оно становится значением для соответствующей категории в категориальном столбце. Давайте сначала рассмотрим простой пример, прежде чем применять его к нашему набору данных. У нас есть два столбца — цель и переменная-предиктор. Наша цель — закодировать переменную-предиктор (категориальный столбец) в числовую переменную, которая может использоваться моделью. Для этого мы просто группируем по переменной-предиктору, чтобы получить среднее целевое значение для каждой категории предикторов. Таким образом, для предиктора
Вне:
Далее мы используем целевую кодировку в нашем наборе данных супермаркета. В приведенном ниже примере мы используем
Вне:
1003 строки x 3 столбца У целевого кодирования есть свои недостатки: когда категория появляется только один раз, среднее значение этой категории является самим значением (среднее значение одного числа — это само число). В общем, не всегда полезно полагаться на среднее значение, если количество используемых в нем значений невелико. Это приводит к проблемам с обобщением результатов набора обучающих данных на набор тестовых данных или данных, на которых модель не обучается. Вывод из этого раздела — попытаться выполнить горячее кодирование, если размерность не будет проблемой. Если это проблема, вы можете использовать другие подходы, например целевое кодирование. Обработка отсутствующих значений Прогнозное моделирование можно рассматривать как извлечение правильных сигналов из набора данных. Отсутствующие значения могут быть либо самими источниками сигнала (когда значения отсутствуют случайно), либо отсутствием сигнала (когда значения отсутствуют случайно). Примечание Примечание. Данные были изменены и содержат пропущенные значения, чтобы мы могли обсудить эту тему. Если вы получили свежую копию от Kaggle, в ней не должно быть пропущенных значений. Например, предположим, что у нас есть некоторые данные о населении, и мы добавляем столбец, Почему это важно? Если у нас есть пропущенные данные, которые не являются случайными, мы знаем, почему значения отсутствуют, и это можно объяснить набором данных, мы можем просто закодировать это как индикаторную переменную, указывающую. Это позволит модели легко разобраться в этом. Однако если объяснение того, почему они отсутствуют, не объясняется набором данных, то мы находимся на неясной территории, и рассмотрение такого случая требует более пристального внимания. Когда данные отсутствуют случайно, мы теряем информацию, но мы надеемся, что сможем заполнить эти пробелы на основе информации из других функций. Меньшее, что мы можем сделать, — это удалить строки с отсутствующими данными, поскольку большинство моделей не обрабатывают недостающие данные. Поскольку столбцы со слишком большим количеством пропущенных значений обычно не дают полезного сигнала, мы могли бы удалить их на основе порогового условия отсутствия (показано ниже). Но прежде чем мы заполним пропущенные значения, возможно, будет полезно сначала визуализировать недостающие значения с помощью Seaborn.
РЕЗУЛЬТАТ: Мы видим, что в нескольких столбцах отсутствуют значения — Я не рекомендую эту стратегию — в этих столбцах/строках все еще может быть полезная информация, и я бы позволил процессу выбора функций решить, сохранять или удалять столбцы. В любом случае, если вы просто хотите быстро построить базовую модель, вы можете использовать эту стратегию. Вот как можно удалить пропущенные значения для определенного порога:
В качестве альтернативы (предпочтительно) мы можем заменить пропущенные значения одним значением, например средним значением или медианой столбца. Для категориальных столбцов мы могли бы вменить пропущенные значения с помощью режима или наиболее часто встречающейся категории в столбце.
Теперь мы больше не видим пропущенных значений в наборе данных!
РЕЗУЛЬТАТ: Существуют более сложные методы вменения, выходящие за рамки этой статьи, но этого должно быть достаточно для начала. Если вы заинтересованы в дальнейшем изучении обработки недостающих данных, я настоятельно рекомендую ознакомиться с «Отсутствующими данными» Пола Д. Эллисона. Разложение даты и времени Декомпозиция даты и времени представляет собой простое разбиение переменной даты на ее составляющие. Мы делаем это, поскольку модель должна работать с числовыми переменными.
Вне:
Вне:
Что мы только что сделали, так это разделили столбец даты, который был в формате «год-месяц-день», на отдельные столбцы, а именно год, месяц и день. Это информация, которую модель теперь может использовать для прогнозирования, поскольку новые столбцы являются числовыми. Доменный подход Не существует строгой границы между подходами к разработке функций, основанными на доменах и контрольных списках. Я бы сказал, что это различие весьма субъективно: при использовании предметно-ориентированных функций вы по-прежнему применяете множество методов, которые мы уже обсуждали, но с большим упором на знание предметной области. Функции, основанные на предметной области, будут включать в себя множество специальных показателей, таких как коэффициенты и формулы. и т. д. Мы увидим примеры этого в примере ниже. Пример тематического исследования: данные о кассовых сборах фильмов Теперь, когда мы изучили несколько методов проектирования функций, давайте применим их! Для нашего тематического исследования мы будем работать с данными о кассовых сборах фильмов. Более подробную информацию о наборе данных можно найти, нажав здесь . Обычно нашим первым шагом будет проведение исследовательского анализа набора данных, но поскольку эта статья посвящена разработке функций, мы сосредоточимся на этом. Обратите внимание: многие идеи по разработке функций, представленные ниже, были вдохновлены ядром Kaggle, ссылка на которое приведена здесь .
Вне:
5 строк x 23 столбца Заполнение пропущенных значений Сначала давайте обработаем пропущенные значения. Мы визуализируем их с помощью Seaborn, а затем заполняем числовые недостающие значения медианой и категориальные недостающие значения с помощью режима.
РЕЗУЛЬТАТ: Мы заполним недостающие числовые переменные медианой и категориальный столбец модой. Мы займемся категориальными пропущенными значениями после того, как завершим разработку функций других столбцов (в самом конце). Выбор метода вменения пропущенных значений не является сложной наукой. Большинство практиков тестируют несколько методов вменения пропущенных значений и выбирают тот, который получает лучший оценочный балл. Разложение даты И теперь мы можем разложить столбец даты по его атрибутам. Обратите внимание, что мы кодируем месяц и день как строковые переменные, поскольку внутри них нет числовых связей. Дни и месяцы имеют фиксированные границы (месяц не превышает 12, день не превышает 31). День 10 и 31 — это просто разные дни (считайте их категориями). Давайте поместим год, месяц и день в отдельные столбцы в кадре данных:
Вне:
Корректировка бюджета Поскольку бюджет сильно искажен вправо, мы берем логарифм бюджета, чтобы скорректировать его. Обратите внимание, что мы берем логарифм,
РЕЗУЛЬТАТ: Кодирование инфляции Мы знаем, что бюджет ежегодно увеличивается в некоторой степени из-за инфляции. Мы можем закодировать это, используя простую формулу инфляции следующим образом: Гдекаждая строка и — максимальный год набора данных (в нашем случае 2018 год). Вот его создание для нашего фрейма данных:
РЕЗУЛЬТАТ: Другие интересные особенности Основываясь на знаниях предметной области, мы можем создать несколько полезных переменных соотношения, как показано ниже.
Индикаторные переменные Мы кодируем индикаторную переменную, указывающую, есть ли у фильма домашняя страница или нет, и был ли фильм на английском языке:
И теперь мы можем заполнить недостающие значения категориального столбца.
Мы подустанавливаем фрейм данных, чтобы включить только те переменные, которые нам нужны.
Мы оперативно кодируем категориальные столбцы. В нашем случае у нас есть только один категориальный столбец — месяц.
Наш новый фрейм данных выглядит так
Вне:
5 строк x 23 столбца Теперь, когда наш набор данных готов, мы можем пройти процесс выбора полезных функций (выбора функций) и сделать прогнозы. Прогноз Чтобы доказать, что разработка функций работает и повышает производительность модели, мы можем построить простую регрессионную модель для прогнозирования доходов от фильмов. Обычно мы выбираем, какие функции использовать, с помощью процесса, называемого выбором функций, однако, поскольку эта статья посвящена разработке функций, мы будем использовать простой процесс выбора функций: корреляционный анализ . Построив корреляционную матрицу (ниже), мы видим, что большинство созданных нами функций не позволяют прогнозировать доход. Именно это происходит в большинстве случаев: вы создаете массу функций, но лишь немногие из них оказываются полезными, но те функции, которые полезны, имеют значение. На графике ниже мы будем использовать
РЕЗУЛЬТАТ: Мы будем использовать примерно 80% набора данных для обучения базовых и функциональных моделей и сравнивать их производительность на скрытом тестовом наборе.
Вне:
Разница весьма существенная! Прогнозы базовой модели, которая использует только и в качестве функций, в среднем на 909 146,83 доллара хуже, чем у модели, в которой мы использовали наши построенные функции Используя разработку функций, мы позволили нашей модели лучше понять наш набор данных и, следовательно, сделать более точные прогнозы. Заключение Подводные камни при проектировании функций Некоторые из распространенных ошибок при разработке функций:
Мышление разработки функций Подход к разработке функций очень экспериментальный. Обычно количество ценится выше качества. Качество играет важную роль, когда мы имеем дело с выбором функций, который происходит после разработки функций. У нас может быть какое-то указание относительно того, какие функции могут быть полезны, но мы не должны позволять нашей предвзятости вступать в игру — создайте как можно больше подходящих функций на основе ваших данных (конечно, если позволяют вычисления и время) и дополните их с помощью надежной функции. процесс отбора, чтобы отсеять плохие черты.
Дальнейшее обучение: Многие курсы по науке о данных и машинному обучению содержат разделы, посвященные разработке функций. Вот отличный курс, который стоит попробовать: Источник: www.learndatasci.com Комментарии: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||