Кодирование категориальных переменных с использованием оценки вероятности

22

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

Любые предложения будут ценны.

маленький карлик
источник
Что делать во время предсказания, когда у нас нет метки цели?
Ранджит Сингх

Ответы:

24

Я тоже изучал эту тему, и вот что я нашел:

  • Этот тип кодирования называется вероятностным кодированием , ударным кодированием или целевым кодированием.

  • Идея заключается в кодировании вашей категориальной переменной с использованием целевой переменной (непрерывной или категориальной в зависимости от задачи). Например, если у вас есть задача регрессии, вы можете закодировать свою категориальную переменную с помощью среднего целевого значения. Для каждой категории вы вычисляете соответствующее среднее значение цели (среди этой категории) и заменяете значение категории этим средним значением.

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

  • С математической точки зрения эта кодировка означает вероятность вашей цели, зависящую от значения каждой категории.

  • Если вы сделаете это простым способом, как я описал выше, вы, вероятно, получите предвзятую оценку. Вот почему в сообществе Kaggle они обычно используют 2 уровня перекрестной проверки. Прочитайте этот комментарий Раддара здесь . Соответствующая записная книжка здесь .

Цитата:

Это принимает среднее значение у. Но не просто значит, а в перекрестной проверке в рамках перекрестной проверки;

Допустим, у нас есть 20-кратная перекрестная проверка. нам нужно каким-то образом рассчитать среднее значение признака для сгиба # 1, используя информацию только с сгибов # 2- # 20.

Итак, вы берете # 2- # 20 сгибов, создаете еще один набор перекрестной проверки (я сделал 10-кратный). Рассчитайте средства для каждой раздачи «один на один» (в итоге вы получите 10 средств). Вы усредняете эти 10 средних и применяете этот вектор для своего основного набора проверки # 1. Повторите это для оставшихся 19 сгибов.

Это сложно объяснить, трудно понять и освоить :) Но если все сделано правильно, это может принести много пользы :)

  • Другая реализация этой кодировки здесь .

  • В R библиотеки vtreat есть реализация ударного кодирования. Смотрите этот пост .

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

  • В sklearn такой кодировки еще нет.

Галина Альперович
источник
1
Целевое кодирование в кодировщиках категорий Sklearn-contrib
josh
Как бы вы реализовали взаимодействие функций в случае использования целевой кодировки? Например, вы нацелены на кодирование F1 и F2. Вы бы просто умножили закодированные значения F1 * F2?
Михаил Ларионов
Если вы вычисляете среднее значение для каждого сгиба LOO, то берете среднее из них, оно точно такое же, как вы берете среднее значение от # 2 до # 20, я не понимаю, почему это можно рассматривать как CV. Также я не понимаю, что он имеет в виду под «вектором», когда он усредняет эти 10 средних.
SiXUlm
Поздний комментарий; целевое кодирование в кодировщиках категорий - это простое среднее кодирование; он не выполняет регуляризацию сгибов внутри сгибов, описанную раддаром.
Дэн Скалли
7

Целевое кодирование теперь доступно в sklearn через пакет category_encoders.

Target Encoder

class category_encoders.target_encoder.TargetEncoder (verbose = 0, cols = None, drop_invariant = False, return_df = True, impute_missing = True, handle_unknown = 'impute', min_samples_leaf = 1, сглаживание = 1)

Target Encode для категориальных функций. На основе оставить один подход.

Как отметил Джош в комментарии выше.

jeffhale
источник
1

Кодирование правдоподобия по-прежнему недоступно в Scikit Learn. Вы можете сделать это, создав словарь, а затем выполнить функцию замены.

dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
    df.iloc[i] = dict1[df.iloc[i]] 
chrisckwong821
источник