КНИГА « МЕТОДЫ АНАЛИЗА ДАННЫХ ДЛЯ ВЫИГРЫША KAGGLE »

Каталог преобразований переменных, чтобы ваша модель работала лучше

10+ преобразований числовых переменных и 7 преобразований категориальных переменных

Преобразование переменных - это способ улучшить работу данных в вашей модели. Переменные данных могут иметь два типа формы: числовая переменная и категориальная переменная, и их преобразование должно иметь разные подходы.

- Преобразование числовой переменной: преобразует числовую переменную в другую числовую переменную. Обычно это означает изменение шкалы значений и / или корректировку распределения искаженных данных до гауссовского распределения посредством некоторого «монотонного преобразования».

Модели на основе дерева решений менее чувствительны к масштабированию и перекосу, чем эти методы могут не вносить большого вклада, но для других моделей (например, нейронной сети, SVM, линейной модели и т. д.) они могут изменить правила игры или в некоторых случаях даже обязательны, например, если вы используете условия штрафов с нормой L1 / L2.

- Преобразование категориальной переменной: превращает категориальную переменную в числовую. Преобразование категориальных переменных является обязательным для большинства моделей машинного обучения, поскольку они могут обрабатывать только числовые значения.

Это также называется кодированием, или интеллектуальным анализом текста, встраивание также предназначено для обработки аналогичной ситуации, но встраивание обычно предполагает возвращение числовых значений, содержащих семантику исходных данных. .

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

В этом посте я расскажу об основных и продвинутых методах преобразования числовой переменной и категориальной переменной.

Оглавление

1. Общее внимание к преобразованию переменных

2. Преобразование числовой переменной

  • 2.1. Стандартизация
  • 2.2. Мин-макс масштабирование
  • 2.3. Логарифмическое преобразование
  • 2.4. Преобразование Бокса-Кокса
  • 2.5. Преобразование Йео-Джонсона
  • 2.6. Вырезка
  • 2.7. Биннинг
  • 2.8. Классифицировать
  • 2.9. Ранг
  • 2.10. Другие нелинейные преобразования

3. Преобразования категориальных переменных

  • 3.1. Быстрое кодирование
  • 3.2. Кодировка метки
  • 3.3. Хеширование функций
  • 3.4. Двоичное кодирование и кодирование BaseN
  • 3.5. Частотное кодирование
  • 3.6. Целевая кодировка
  • 3.7. Специальное лечение, когда уровни включены только в набор тестов
  • 3.8. Более категориальные преобразования переменных

4. Заключение

Это еще один пост, в котором собраны советы, представленные в новой книге Методы анализа данных для победы в Kaggle, автором которой являются три высокопоставленных Kagglers (не считая меня, поэтому это не личная реклама! :))

Полное содержание самой книги смотрите в моем другом посте.

1. Общее внимание к преобразованию переменных

Существует множество методов преобразования для использования моделирования, и многие из них реализованы в scikit-learn и categorical_encoders.

Среди них многие используют параметры, такие как среднее и стандартное отклонение стандартизации или таблицы преобразования в кодировке меток. Распространенной ошибкой при использовании преобразования переменных является преобразование обучающего набора и тестового набора отдельно с использованием разных параметров. Преобразование обучающих данных и тестовых данных должно выполняться с использованием одних и тех же параметров, и они обычно получаются только из обучающего набора; в противном случае мы не сможем сравнивать результаты яблочно-яблочного базиса. scikit-learn классы преобразователей могут справиться с этим с помощью функций fit и transform.

Некоторые будут более строго утверждать, что при работе с перекрестной проверкой параметры преобразования будут выводиться только из обучающей свертки, тогда данные свертки проверки будут преобразованы этими параметрами вместо преобразования всех обучающих данных перед перекрестной проверкой. Такой подход может быть необходим, когда вы ожидаете огромных различий в распределении данных между свертками. Наличие выбросов - одна из возможных причин для указания разных параметров, особенно в методах преобразования, чувствительных к выбросам, таких как масштабирование минимум-максимум.

Или некоторые другие могут утверждать, что до тех пор, пока распределение данных не сильно отличается, преобразование всех обучающих данных перед перекрестной проверкой достаточно хорошо, и это может избежать путаницы с конвейерной обработкой данных. Кроме того, наша окончательная модель будет основана на всех обучающих данных, поэтому может иметь смысл использовать все обучающие данные для преобразования данных.

В любом случае аналитикам всегда приходится спрашивать себя, каков наиболее разумный подход к данным, с которыми они сталкиваются. scikit-learn поддерживает преобразование внутри перекрестной проверки, назначая функцию масштабирования в Pipeline. Сравните подход 1 и подход 2 в примере кода ниже.

2. Преобразования числовых переменных

2.1. Стандартизация

Наиболее типичное преобразование числовой переменной - это преобразование значений столбца в другой набор значений с mean = 0 и стандартным отклонением = 1 с использованием вычитания и деления таким образом, чтобы:

Стандартизация широко используется во многих методах машинного обучения, например линейная регрессия, SVM, нейронная сеть и т. д., а также некоторые модели машинного обучения в некотором роде предписывают это. Многие аналитические инструменты даже делают это автоматически по умолчанию. Если это так, вам даже не нужно писать код для преобразования. Нам нужно позаботиться о том, что является преобразованием по умолчанию и соответствует ли оно выбранному вами подходу.

scikit-learn preprocessing модуль StandardScaler может выполнять стандартизацию.

2.2. Мин-макс масштабирование

Масштабирование от минимума до максимума - еще один подозреваемый в простом преобразовании числовых переменных. При масштабировании min-max значения должны быть преобразованы в значения от 0 до 1.

Это преобразование сильно зависит от максимального числа и минимального числа и поэтому особенно чувствительно к выбросам. Если значения могут быть очень большими, а многие - нет, стандартизация более распространена. Масштабирование от минимума до максимума чаще применяется в том случае, если значения находятся в фиксированном интервале и данные с меньшей вероятностью будут скапливаться в определенном поддиапазоне в этом интервале; чаще всего в данных изображения где один элемент обычно имеет значение от 0 до 255 для своего цвета RGB.

scikit-learn preprocessing модуль MinMaxScaler может обрабатывать минимальное и максимальное масштабирование.

2.3. Логарифмическое преобразование

Когда распределение значений имеет длиннохвостое распределение (например, индивидуальные доходы, индивидуальные медицинские расходы и т. Д.), логарифмические преобразования могут скорректировать распределение данных до менее асимметричного - надеюсь, гауссовского распределения .

numpy имеет встроенную функцию для вычисления log (x + 1) asnp.log1p(x).

Предполагается, что преобразование обобщенного журнала позволяет настроить параметр лямбда для распределения данных, чтобы приблизиться к нормальному распределению. Теперь вы помните, что вам не следует изменять параметры для обучающего набора и тестового теста, как я обсуждал в «1. Общее внимание к преобразованию переменных » выше.

2.4. Преобразование Бокса-Кокса

Преобразование Бокса-Кокса - это преобразование между преобразованием log (x) и преобразованием x-1 в зависимости от значения лямбда. PowerTransformer в модуле scikit-learn preprocessing может обрабатывать это преобразование и автоматически выбирать лямбда, чтобы данные были максимально похожи на гауссовские.

2.5. Преобразование Йео-Джонсона

Преобразование Йео-Джонсона - это преобразование, которое допускает отрицательное значение в качестве исходного значения, в отличие от преобразования Бокса-Кокса. При лямбда = 1 преобразование является почти тождественным преобразованием. Изменение лямбда влияет на преобразованное значение, как показано на графике ниже.

Так же, как преобразование Бокса-Кокса, PowerTransformer в модуле scikit-learn preprocessing может обрабатывать это преобразование и автоматически выбирать лямбда, чтобы сделать данные наиболее похожими на гауссовские.

2.6. Вырезка

Отсечение - это подход к ограничению или минимизации значений в определенных точках. Это может удалить выбросы за счет возможной потери информации о необработанных данных.

Отсечение можно легко выполнить с помощью функции pandas или numpy clip. Следующий код обрезает значения в точке плитки 1% и точке плитки 99%.

2.7. Биннинг

В Биннинг вы группируете значения по разным интервалам и используете групповой индекс как категориальную переменную. Вы можете использовать его как порядковую категориальную переменную или числовую переменную как ранг. В качестве категориальной переменной вы также можете преобразовать ее с помощью однократного кодирования или других преобразований категориальных переменных (см. Следующую главу!)

Определение интервалов разбиения - это выбор параметра, который может осуществляться с помощью регулярных интервалов, точек процентиля или вручную на основе знания предметной области о данных.

Биннинг может выполняться функцией pandas cut или numpy digitize.

2.8. Классифицировать

Превращение необработанных числовых значений в ряды значений. Ранги также могут быть преобразованы в значения от 0 до 1 с делением на количество записей, что делает преобразованные суммы несущественными для количества записей.

В книге представлен интересный пример: при анализе количества покупателей в магазине количество покупателей в праздничные дни, вероятно, будет намного больше, чем в будние дни. Тогда использование необработанного числа клиентов может слишком сильно повлиять на праздники. Превращение цифр в ранги может нейтрализовать влияние абсолютного количества клиентов.

pandas rank функция или numpy argsort функция могут обрабатывать это преобразование.

2.9. Ранг

RankGauss - это подход, позволяющий превратить значения в ранги первыми и превратить ранги в другое значение в соответствии с распределением Гаусса (см. график ниже). Это использовалось в Прогнозе безопасного водителя Porto Segro, первое место. решение для своей модели нейронной сети. Майкл Джарер, занявший первое место, заявил, что это сработало лучше, чем стандартизация или минимальное и максимальное масштабирование для их модели нейронной сети.

QuantileTransformer в sklearn.preprocessing может обрабатывать это преобразование, задав параметры n-quantiles large и output_distribution = ‘normal’.

2.10. Другие нелинейные преобразования

В книге также введены следующие нелинейные преобразования:

  • Возьмите абсолютное значение
  • Извлеките квадратный корень
  • Квадрат или возьмем n-ю степень
  • Создайте двоичную переменную, представляющую свойство исходного значения, такое как положительное или отрицательное, нулевое или нет и т. Д.
  • Возьмите дробную часть исходного значения, например десятичную часть.
  • Округление, округление, усечение

3. Преобразования категориальных переменных

Модели машинного обучения могут обрабатывать только числовые переменные. Следовательно, если столбец имеет категориальную переменную, модели будут работать только тогда, когда он закодирован в числовую переменную. Способ кодирования - один из ключевых факторов производительности при моделировании.

3.1. Быстрое кодирование

Быстрое кодирование - это подход к преобразованию одного категориального столбца в несколько двоичных (0 или 1) столбцов, количество которых равно количеству различных уровней в исходном столбце. Если в категориальной переменной четыре уровня, горячая кодировка создаст четыре новых столбца, каждый из которых имеет 0 или 1 и указывает, имеет ли уровень исходный столбец.

Очевидный недостаток «горячего» кодирования заключается в том, что количество столбцов легко увеличивается за счет большого количества отдельных уровней. Одно из возможных решений - сгруппировать несколько уровней на основе знания предметной области или сгруппировать нечастые уровни на «другом» уровне.

Вы можете выполнить быстрое кодирование с помощью функции pandas get_dummies или scikit-learn preprocessing модуля OneHotEncoder. Последний может возвращать разреженную матрицу с параметром sparse=True, что может сэкономить потребление памяти, когда исходный столбец имеет много уровней.

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

  • Переменных гораздо больше, чем статистическое моделирование, и влияние одной переменной ослаблено.
  • Многие алгоритмы машинного обучения не заботятся о линейной зависимости по разным причинам, например, они используют термин регуляризации или выбирают часть переменных для обучения модели, и линейная зависимость теряется.

3.2. Кодировка метки

Кодирование меток - это подход к преобразованию уровней в целые числа, например уровни: [‘A’, ‘B’, ‘C’,…] до целых чисел: [0, 1, 2,…].

Этот подход не подходит для большинства алгоритмов машинного обучения, поскольку количество преобразованного значения фактически не имеет ничего общего с целевой переменной, кроме моделей на основе дерева решений, которые могут для разделения преобразованного числового столбца несколько раз с разделением слоев дерева. Кроме того, в случае, если категориальная переменная имеет "порядковый" характер, например В старом ‹Warm‹ Hot ‹Very Hot кодирование меток потенциально может работать лучше, чем другие методы кодирования.

Вы можете реализовать кодирование меток с помощью scikit-learn preprocessing модуля LabelEncoder.

3.3. Хеширование функций

Хеширование функций - это подход к преобразованию одного категориального столбца в несколько столбцов с использованием уловок хеширования. Вы можете определить количество новых столбцов, в которые вы конвертируете, которое может быть меньше количества уровней в категориальных столбцах. Вместо присвоения 0 или 1, как при однократном кодировании, хеширование функций использует более двух значений (-1, 0 или 1 в приведенном ниже случае).

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

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

Вы можете кодировать хеширование функций с помощью scikit-learn.feature_extraction модуля FeatureHasher или category_encoders.hashing модуля HashingEncoder.

3.4. Двоичное кодирование и кодирование BaseN

Двоичное кодирование - это подход, позволяющий преобразовать категориальный столбец в несколько двоичных столбцов при минимальном количестве новых столбцов.

Сначала преобразуйте категориальное значение в целые числа в некотором порядке (например, в алфавитном порядке или в порядке появления в верхней строке). Затем превратите его в двоичную цифру так, чтобы от 1 до 1, от 2 до 10, от 5 до 101 и т. Д. Наконец, разделите двоичную цифру на отдельные столбцы, каждый из которых имеет одну цифру.

Двоичное кодирование может уменьшить количество новых столбцов до порядка log_2 (количество уровней). Как вы можете видеть в приведенном выше примере, один из новых столбцов имеет 1 на другом исходном уровне, что не очень хорошо, потому что уровни, имеющие 1 в том же столбце, будут рассматриваться как разделяющие какое-то свойство. по модели, хотя на самом деле они имеют 1 в том же столбце только по техническим причинам.

Модуль category_encoder BinaryEncoder может обрабатывать такое кодирование.

Кодировка BaseN - это обобщение двоичного кодирования в том смысле, что вместо использования базы 2 BaseN использует произвольное число в качестве основы.

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

Модуль category_encoder BaseNEncoder может обрабатывать такое кодирование.

3.5. Частотное кодирование

Кодирование частоты - это подход к преобразованию категориального столбца в новый столбец с целыми числами, представляющими частоты уровней в исходном столбце. Это может хорошо работать, когда частота уровней влияет на целевую переменную.

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

В Python нет библиотеки для поддержки этой кодировки, но это можно легко реализовать с помощью pandas.Series собственной функции value_counts().

3.6. Целевая кодировка

Целевая кодировка - это подход к преобразованию категориального столбца в новые числовые столбцы на основе значений целевой переменной.

Чаще всего для создания нового столбца требуется среднее целевых значений на уровне, но это может быть что угодно, что вы считаете разумным, например, медиана, когда есть выбросы, или среднее значение значений журнала, когда метрика оценки - RMSLE.

Целевое кодирование потенциально является мощным средством прогнозирования, но, как неоднократно предупреждает автор книги, оно легко вызывает утечку данных, если с ним не обращаться осторожно.

Поскольку целевая кодировка использует информацию из целевой переменной, мы должны избегать включения одной и той же строки для кодирования. Для этого мы должны k-сворачивание (с k = 4 ~ 10) данных: среднее целевых значений в обучающих свертках, которое должно быть присвоено как закодированные значения в нестандартных значениях. свернуть данные. Повторите это для каждой свертки, чтобы получить закодированные значения для всех обучающих данных. Тестовые данные обычно кодируются с использованием всех обучающих данных.

В модуле category_encoders есть обработчик целевой кодировки TargetEncoder, но даже при этом вам придется выполнить K-фолд самостоятельно.

Автор также утверждает, что вы НЕ должны использовать исключение по одному (LOO) для целевой кодировки, потому что это слишком вероятно вызовет утечку данных.

3.7. Специальное лечение, когда уровни включены только в набор тестов

Когда некоторые уровни включены только в тестовые данные, модель может возвращать ошибку, или даже если ошибки не возвращаются, прогноз может быть неверным.

Вот как поступить в этом случае:

  • Если проблема заключается только в точности прогноза, а не в возврате технической ошибки, проверьте, насколько плохой прогноз влияет на окончательный результат. если он достаточно незначителен, игнорировать его - жизнеспособная идея.
  • Замена другим уровнем, включенным в обучающие данные, например, использование наиболее частого уровня в обучающих данных.
  • Создание модели прогнозирования для прогнозирования уровня для замены неизвестного уровня на основе других переменных.
  • Вменяя его после кодирования категориальной переменной в числовую переменную, например вменять средним значением целевой закодированной переменной.

3.8. Более категориальные преобразования переменных

Этот пост Байджаянты Роя« Все о кодировании категориальных переменных » охватывает другие методы кодирования.

Кроме того, categorical_encoders module охватывает большую часть реализации техник, представленных в сообщении Байджаянты. Вы можете узнать больше, поигравшись с функциями в этом модуле.

4. Вывод

В этом посте мы обсудили 10+ методов преобразования числовых переменных и 7 категориальных переменных от базовых подходов до продвинутых подходов.

Хотя известно, что некоторые работают лучше, чем другие, например Целевое кодирование имеет отличные показатели по сравнению с другими методами кодирования, нет единого подхода, который всегда хорошо работал бы в каждой модели с любыми данными. Поэтому важно хорошо изучить, какая кодировка работает хорошо в каком случае, и когда вы сталкиваетесь с новой проблемой, вы используете столько подходов, которые представлены в этом посте, пока не выясните, какая из них работает лучше всего.