Прибыль:
- Способность создавать значимые производные функции на основе знаний предметной области и кодировать категориальные категории с помощью соответствующих методов (горячий, меточный, целевой).
- Возможность масштабировать числовые переменные в соответствии с типом модели (стандартизация, нормализация) и избегать ненужного или неполного масштабирования.
- Возможность избежать утечки функций, изучая все преобразования после разделения обучения/тестирования и только в ходе обучения.
В машинном обучении есть старая поговорка: «Прикладное машинное обучение — это, по сути, разработка функций». Потому что успех модели часто зависит от того, какие входные данные вы вкладываете в модель, а не от того, какой алгоритм вы выбираете. Разработка функций — это искусство создания значимых сигналов из необработанных данных, на которых модель может учиться. Искусственный интеллект на этом этапе является богатым источником идей: когда вы спрашиваете, «какие функции можно получить из этих данных», он выдает десятки предложений. Но некоторые из этих предложений могут быть ценными, некоторые — бесполезными, а некоторые — опасными (утечка). Ваша задача разобраться во всем.
Зачем нужна инженерия
Необработанные данные редко поступают в модель в лучшем виде. Хотя столбец «дата рождения» сам по себе не имеет смысла, значение «возраста», полученное из него, является сильным сигналом. Из «метки времени заказа» можно извлечь такие атрибуты, как «день недели», «день/ночь», «сейчас праздник». Вы можете объединить два столбца для получения коэффициента («соотношение долга/дохода»). Здесь разработка функций переводит знания предметной области в математический сигнал; И именно поэтому именно эта сцена требует наибольшего человеческого интеллекта.
Преобразование категориальных переменных в числа: кодирование
Модели обычно работают с числами, а не с текстом. Преобразование категориальных переменных (таких как город, цвет, тип продукта) в числа называется кодированием. Три распространенных метода:
Горячее кодирование: открывает отдельный столбец со значением 0/1 для каждой категории. Для «города» формируются колонны «Стамбул», «Анкара», «Измир»; Если клиент из Стамбула, только в этом столбце будет 1. Идеально, когда количество категорий небольшое; Если категорий слишком много, создаются сотни столбцов (это называется «взрыв размера»).
Кодировка метки: присваивает номер каждой категории (Стамбул=0, Анкара=1). Это просто, но может случайно научить модель последовательности (например, Анкара > Стамбул); поэтому его следует использовать с осторожностью в неупорядоченных категориях.
Целевое кодирование: заменяет каждую категорию средним значением целевой переменной в этой категории. Это очень мощный, но самый опасный источник утечек: если принять во внимание целевые тестовые данные, модель видит будущее. Его следует рассчитывать только на основе обучающих данных и тщательно (в рамках перекрестной проверки).
Масштабирование: большие числа не перегружают модель.
Некоторые модели (расстоянные, линейные, нейронные сети) чувствительны к масштабу переменных. Если «доход» (0–500 000) и «возраст» (0–100) попадают в одну и ту же закономерность, доход может доминировать просто потому, что он больше. Масштабирование это исправляет. Два распространенных метода: стандартизация (преобразует каждое значение в «на сколько стандартных отклонений от среднего») и нормализация (нормализация min-max — сжимает значения в диапазон 0–1). Древовидные модели (деревья решений, случайный лес) нечувствительны к масштабу и не требуют масштабирования.
Внимание: параметры масштабирования и кодирования (среднее значение, стандартное отклонение, сопоставление среднего значения категории) следует рассчитывать только на основе обучающих данных, затем то же самое следует применять к тестовым данным. Включение тестовых данных является утечкой и делает вашу модель лучше, чем она есть на самом деле.
Сердце утечки в разработке функций
Генерация признаков — это то место, где чаще всего возникает утечка данных. Две типичные ошибки: Утечка времени — создание функции, включающей информацию о будущем (включая дни после прогнозируемого дня при расчете «среднего значения за последние 30 дней»). Утечка статистики — вычисление признака (среднего масштабирования, целевого значения кодировки) на основе всех данных перед разделением обучения/тестирования. Правило: изучайте каждое преобразование после разделения поезда и теста и только на основе обучающих данных. Самый безопасный способ делать это регулярно — использовать конвейер — структуру, которая собирает все преобразования в одну цепочку и применяет их после разделения.
Метод
для чего
Риск утечки
Примечание
Горячее кодирование
Переменная с несколькими категориями
низкий
Увеличивает размер в нескольких категориях
Кодирование этикеток
Сортированная категория
низкий
Не в порядке учит неправильному порядку
целевая кодировка
Многокатегорийный, сильный сигнал
очень высокий
Только по образованию, в резюме
стандартизация
Линейные/дистанционные модели
средний
Параметр зависит только от образования
Функция временного окна
временной ряд
высокий
Добавьте будущее
три мини-кейса
Случай 1 — Ценное имущество. Кредитная группа сгенерировала функцию «отношение долга к доходу» на основе необработанных столбцов «ежемесячный доход» и «ежемесячный платеж по долгу». Эта единственная производная функция увеличила точность модели с 71% до 79%; потому что именно ставка, а не абсолютный доход, действительно определяет риск. Урок: коэффициенты, полученные на основе знаний предметной области, являются сильными сигналами.
Случай 2 — Утечка целевого кодирования. Одна команда преобразовала «почтовый индекс» в число с целевой кодировкой (средняя скорость оттока в этой области), но сделала это на основе всех данных перед разделением. Модель дала 94% на тестовом наборе, снизившись до 68% на производстве. 6 недель усилий потрачены зря. Урок: целевое кодирование делается аккуратно, только в рамках обучения.
Случай 3 — Забывание масштабирования. Один аналитик указал доход (0–400 000) и возраст клиентов (18–75) в модель дистанционного управления без масштабирования. Модель учитывала почти исключительно доход, подавляя эффект возраста. Когда было добавлено масштабирование, сегментация стала значимой. Урок: масштабированием не пренебрегают в дистанционных/линейных моделях.
Четыре копируемых шаблона
1) Генерация идеи фичи (отмена на ваше усмотрение):
Ваша роль: помощник инженера по функциям. Мои столбцы df: дата рождения, время заказа (метка времени), доход_tl, долг_tl, город, категория_продукта. Цель: «будет ли кредит погашен» (0/1). Предложите 15 функций, которые можно получить из этих столбцов; укажите риск утечки (низкий/средний/высокий) для каждого. Четко отметьте те, которые содержат будущую информацию.
2) Безопасное кодирование (после разделения):
Напишите код, который мгновенно кодирует «город» и «категория_продукта». ВАЖНО: подгоните кодировку только к обучающим данным, затем преобразуйте тестовые данные (с помощью sklearn OneHotEncoder). Объясните, как вы справляетесь с невидимой категорией (handle_unknown) в образовании.
3) Преобразование без утечек с использованием трубопровода:
Настройте sklearn Pipeline: примените StandardScaler к числовым столбцам, OneHotEncoder к категориальным столбцам, добавьте классификатор в конце. Гарантируйте, что все преобразования будут изучены ПОСЛЕ разделения обучения и тестирования и только в ходе обучения. Объясните код и почему он не содержит утечек.
4) Функция временного окна (контроль утечек):
Создавайте атрибут «количество заказов за последние 30 дней» для каждого клиента, но НИКОГДА не включайте данные после прогнозируемого дня. Объясните построчно, что код не заглядывает в будущее. Я предоставлю столбец ссылочной даты.
Слабая подсказка / Сильная подсказка
Слабая подсказка:
Добавьте к этим данным хорошие свойства.
«Хорошо» не определено, цель неясна, контроль утечек отсутствует. ИИ генерирует случайные, возможно, ненадежные функции.
Мощная подсказка:
Ваша роль: инженер-функционер. Цель: «отток через 30 дней» (0/1), расчетная базовая дата: save_date. В df.Task есть история транзакций: сгенерировать 8 функций, ответить на вопрос «Есть ли у меня эта информация на момент прогнозирования» для КАЖДОЙ. Добавление даты после контрольной даты в функциях временного окна. Напишите код, совместимый с конвейером, чтобы он выполнялся после раздела обучения/тестирования.
Здесь с самого начала определяются цель, опорное время и контроль утечки.
Распространенные ошибки
- Изучение преобразования всех данных перед разделением. Если параметр масштабирования/кодирования видит тестовые данные, происходит утечка.
- Неосторожное использование целевого кодирования. Это самый мощный, но и самый дырявый метод; только что после тренировки, при перекрестной проверке.
- Добавление будущего с помощью функции временного окна. Если расчет «последние 30 дней» вводится после прогнозируемого дня, модель видит будущее.
- Ненужное масштабирование в древовидной модели и неполное масштабирование в линейной модели. Решения по масштабированию принимаются в зависимости от типа модели.
- Добавление всех функций, предложенных ИИ, без вопросов. Предложения могут включать бесполезные и ненадежные функции.
Совет: запишите по одному вопросу для каждой создаваемой вами функции: «Могу ли я вычислить это значение, используя информацию, которая у меня есть на момент прогнозирования?» Если ответ не однозначный «да», не используйте эту функцию. Эта единая дисциплина устраняет большинство утечек, связанных с функциями.
В итоге
Разработка функций — это искусство генерации значимых сигналов из необработанных данных, которое часто определяет успех модели в большей степени, чем алгоритма. Основными инструментами являются категориальное кодирование (одно-горячее, метка, цель), числовое масштабирование (стандартизация, нормализация) и создание производных функций на основе знаний предметной области. Но этот этап также является сердцем утечки: все преобразования должны быть изучены после разделения обучения/тестирования и только на основе обучающих данных. ИИ генерирует множество идей; Именно человеческое суждение отличает ценное от опасного.
Задача приложения
Выберите целевую переменную и спроектируйте как минимум пять производных функций из имеющихся у вас столбцов. По каждому из них письменно ответьте на вопрос «доступен ли я в момент прогноза» и исключите хотя бы один как «высокий риск утечки». Затем запрограммируйте функции безопасности в конвейере, который будет реализован после разделения.
контрольный список
- [ ] Применил ли я все преобразования после разделения поезда и теста?
- [ ] Изучил ли я параметры масштабирования/кодирования только во время обучения?
- [ ] Ответил ли я на вопрос «есть ли он у меня на момент прогнозирования» для каждой функции?
- [ ] Проявлял ли я особую осторожность при использовании методов высокого риска, таких как целевое кодирование?
- [ ] Решил ли я масштабировать модель в соответствии с типом модели (дерево/линейная)?