[Python, Big Data, Машинное обучение] Мульти-классовое целе-вероятностное кодирование (Multi-Class Target Encoding) (перевод)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Что не так с TargetEncoder из библиотеки category_encoders?Эта статья является продолжением предыдущей статьи, в которой объяснялось, как на самом деле работает целе-вероятностное кодирование. В этой статье мы посмотрим в каких случаях стандартное решение библиотеки category_encoders дает неверный результат, а кроме того, изучим теорию и пример кода для корректного мульти-классового целе-вероятностного кодирования. Поехали!1. Когда ошибается TargetEncoder?Посмотрите на эти данные. Цвет - это особенность, а цель - это… цель. Наша цель - кодировать цвет на основе Target.
Давайте сделаем для этого обычную целе-вероятностную кодировку.
import category_encoders as ce
ce.TargetEncoder(smoothing=0).fit_transform(df.Color,df.Target)
Хмм… выглядит не очень, не так ли? Все цвета были заменены на 1. Почему? Так происходит потому, что TargetEncoder принимает среднее значение всех целевых значений для каждого цвета, а не вероятность.Хотя TargetEncoder корректно работает в случае, когда у вас есть двоичная цель, имеющая 0 и 1, он будет давать сбой в двух случаях:
- Когда цель двоичная, но не 0/1 (хотя бы, например 1 и 2).
- Когда цель - мультикласс, как в приведенном выше примере.
Так что же делать?!
ТеорияВ оригинальном документеDaniele Micci-Barreca, который вводит средне-целевую кодировку говориться про мульти-классовые целевые переменные.Допустим, мы имеем n классов. Теория гласит, что первым делом нужно закодировать значения класса в бинарные переменные. Это даст n двоичных столбцов, по одному на каждый класс цели. Однако только n-1 двоичных столбцов будут линейно независимы, так что в принципе, любой из них можно отбросить. После чего применим обычное целе-вероятностное кодирование для наших новых категорий, используя каждую из двоичных меток, по одной за раз.Давайте разберемся на примере.ПримерПродолжим с предыдущими данными.Шаг 1: Бинарное кодирование мульти-классовой категории.
enc=ce.OneHotEncoder().fit(df.Target.astype(str))
y_onehot=enc.transform(df.Target.astype(str))
y_onehot
Обратите внимание, что столбец Target_1 показывает наличие либо отсутствие значения 0 в исходном столбце Target. Он принимает значение 1 если в Target есть 0, либо 0 в противном случае. Точно так же столбец Target_2 показывает наличие или отсутствие 1 в Target.Шаг 2: Кодируем цвет, используя каждую из бинарных категорий.
class_names = y_onehot.columns
for class_ in class_names:
enc = ce.TargetEncoder(smoothing = 0)
print(enc.fit_transform(X,y_onehot[class_]))
Для класса 0
Для класса 1
Для класса 2Шаг 3: Если есть другие категории, кроме цвета, повторяем шаги 1 и 2 для них.Готово!Таким образом, на выходе получаем такой набор данных:
Обратите внимание, что для ясности я закодировал здесь все три столбца Color_Target. Если вы знаете бинарное кодирование, то слышали, что один из столбцов можно удалить без потери информации. Следовательно, здесь мы можем безопасно удалить, например, столбец Color_Target_3 (либо какой-то другой) без потери информации.ПрактикаВы здесь за кодом, не так ли?!Ниже представлена функция, которая принимает на вход таблицу данных и объект целевой метки типа Series. Функция df может иметь как числовые, так и категориальные переменные.
def target_encode_multiclass(X,y): #X,y are pandas df and series
y=y.astype(str) #convert to string to onehot encode
enc=ce.OneHotEncoder().fit(y)
y_onehot=enc.transform(y)
class_names=y_onehot.columns #names of onehot encoded columns
X_obj=X.select_dtypes('object') #separate categorical columns
X=X.select_dtypes(exclude='object')
for class_ in class_names:
enc=ce.TargetEncoder()
enc.fit(X_obj,y_onehot[class_]) #convert all categorical
temp=enc.transform(X_obj) #columns for class_
temp.columns=[str(x)+'_'+str(class_) for x in temp.columns]
X=pd.concat([X,temp],axis=1) #add to original dataset
return X
РезюмеВ этой статье я показал, что не так с TargetEncoder из библиотеки category_encoder, объяснил, что говорится в оригинальной статье о целевом кодировании мультиклассовых переменных, продемонстрировал всё это на примере и предоставил рабочий модульный код, который вы можете подключить к своему приложению.
===========
Источник:
habr.com
===========
===========
Автор оригинала: Nishant Mohan
===========Похожие новости:
- [Машинное обучение, Конференции, Производство и разработка электроники, Искусственный интеллект, Социальные сети и сообщества] Promwad и Bridgio проведут онлайн-митап по AI и граничным вычислениям для разработчиков и менеджеров
- [Программирование микроконтроллеров, Умный дом, DIY или Сделай сам, Электроника для начинающих] Micropyserver. Реализуем Basic Auth для IoT устройств
- [Машинное обучение, Исследования и прогнозы в IT, Робототехника, Биотехнологии] Научно-исследовательские инициативы JetBrains
- [Сжатие данных, Машинное обучение, Звук] Машинные технологии в звуке. Новый аудиокодек сжимает речь в 3 Кбит/с
- [Тестирование IT-систем, Python, Тестирование веб-сервисов] Тестирование скриншотами
- [Big Data, Машинное обучение, Hadoop, Видеокарты] Стриминг Edge2AI на NVIDIA JETSON Nano 2Гб с использованием агентов MiNiFi в приложениях FLaNK (перевод)
- [Open source, Разработка игр, ООП, Развитие стартапа] Idewavecore. Ретроспектива
- [Python, Гаджеты, Искусственный интеллект, DIY или Сделай сам] Как за 60$ создать систему распознавания лиц с помощью Python и Nvidia Jetson Nano 2GB (перевод)
- [Big Data, Веб-аналитика, Growth Hacking, Интернет-маркетинг, Поисковая оптимизация] Как аналитика помогает нашей IT компании получать крупные контракты из SEO
- [Алгоритмы, Обработка изображений, Машинное обучение] Генетический алгоритм для сегментаций строк в рукописном документе
Теги для поиска: #_python, #_big_data, #_mashinnoe_obuchenie (Машинное обучение), #_target_encoding, #_targetencoder, #_category_encoders, #_mean_target_encoding, #_generatsija_priznakov (генерация признаков), #_tseleverojatnostnoe_kodirovanie (целе-вероятностное кодирование), #_multiklassovoe_kodirovanie (мульти-классовое кодирование), #_multiklassovaja_klassifikatsija (мультиклассовая классификация), #_feature, #_features, #_python, #_big_data, #_mashinnoe_obuchenie (
Машинное обучение
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 15:35
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Что не так с TargetEncoder из библиотеки category_encoders?Эта статья является продолжением предыдущей статьи, в которой объяснялось, как на самом деле работает целе-вероятностное кодирование. В этой статье мы посмотрим в каких случаях стандартное решение библиотеки category_encoders дает неверный результат, а кроме того, изучим теорию и пример кода для корректного мульти-классового целе-вероятностного кодирования. Поехали!1. Когда ошибается TargetEncoder?Посмотрите на эти данные. Цвет - это особенность, а цель - это… цель. Наша цель - кодировать цвет на основе Target. Давайте сделаем для этого обычную целе-вероятностную кодировку. import category_encoders as ce
ce.TargetEncoder(smoothing=0).fit_transform(df.Color,df.Target) Хмм… выглядит не очень, не так ли? Все цвета были заменены на 1. Почему? Так происходит потому, что TargetEncoder принимает среднее значение всех целевых значений для каждого цвета, а не вероятность.Хотя TargetEncoder корректно работает в случае, когда у вас есть двоичная цель, имеющая 0 и 1, он будет давать сбой в двух случаях:
ТеорияВ оригинальном документеDaniele Micci-Barreca, который вводит средне-целевую кодировку говориться про мульти-классовые целевые переменные.Допустим, мы имеем n классов. Теория гласит, что первым делом нужно закодировать значения класса в бинарные переменные. Это даст n двоичных столбцов, по одному на каждый класс цели. Однако только n-1 двоичных столбцов будут линейно независимы, так что в принципе, любой из них можно отбросить. После чего применим обычное целе-вероятностное кодирование для наших новых категорий, используя каждую из двоичных меток, по одной за раз.Давайте разберемся на примере.ПримерПродолжим с предыдущими данными.Шаг 1: Бинарное кодирование мульти-классовой категории. enc=ce.OneHotEncoder().fit(df.Target.astype(str))
y_onehot=enc.transform(df.Target.astype(str)) y_onehot Обратите внимание, что столбец Target_1 показывает наличие либо отсутствие значения 0 в исходном столбце Target. Он принимает значение 1 если в Target есть 0, либо 0 в противном случае. Точно так же столбец Target_2 показывает наличие или отсутствие 1 в Target.Шаг 2: Кодируем цвет, используя каждую из бинарных категорий. class_names = y_onehot.columns
for class_ in class_names: enc = ce.TargetEncoder(smoothing = 0) print(enc.fit_transform(X,y_onehot[class_])) Для класса 0 Для класса 1 Для класса 2Шаг 3: Если есть другие категории, кроме цвета, повторяем шаги 1 и 2 для них.Готово!Таким образом, на выходе получаем такой набор данных: Обратите внимание, что для ясности я закодировал здесь все три столбца Color_Target. Если вы знаете бинарное кодирование, то слышали, что один из столбцов можно удалить без потери информации. Следовательно, здесь мы можем безопасно удалить, например, столбец Color_Target_3 (либо какой-то другой) без потери информации.ПрактикаВы здесь за кодом, не так ли?!Ниже представлена функция, которая принимает на вход таблицу данных и объект целевой метки типа Series. Функция df может иметь как числовые, так и категориальные переменные. def target_encode_multiclass(X,y): #X,y are pandas df and series
y=y.astype(str) #convert to string to onehot encode enc=ce.OneHotEncoder().fit(y) y_onehot=enc.transform(y) class_names=y_onehot.columns #names of onehot encoded columns X_obj=X.select_dtypes('object') #separate categorical columns X=X.select_dtypes(exclude='object') for class_ in class_names: enc=ce.TargetEncoder() enc.fit(X_obj,y_onehot[class_]) #convert all categorical temp=enc.transform(X_obj) #columns for class_ temp.columns=[str(x)+'_'+str(class_) for x in temp.columns] X=pd.concat([X,temp],axis=1) #add to original dataset return X =========== Источник: habr.com =========== =========== Автор оригинала: Nishant Mohan ===========Похожие новости:
Машинное обучение ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 15:35
Часовой пояс: UTC + 5