Кодирование категорий
Модели машинного обучения работают с числами. Но в таблицах часто встречаются строковые признаки: отдел, город, пол, категория товара, тип ремонта.
Такие признаки называют категориальными: в них есть ограниченный набор вариантов, а не произвольный текст. Перед обучением модели категории нужно преобразовать в числовой вид.
OrdinalEncoder
Заголовок раздела «OrdinalEncoder»OrdinalEncoder заменяет каждую категорию числом. Кодировщик запоминает, какие категории встретились в столбце, и использует один и тот же числовой код при преобразовании таблицы.
Ниже показан пример со столбцом Отдел: именно он затем приводится в полном коде.
В этом примере категории получают коды:
IT -> 0Продажи -> 1HR -> 2Пример:
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Отдел,Возраст Анна,IT,28 Борис,Продажи,35 Вера,HR,31 Глеб,IT,29 ''', categoricalColumns := ['Отдел']);
var encoder := new OrdinalEncoder('Отдел'); var encoded := encoder.FitTransform(df);
encoded.Print;end.Вывод:
Имя Отдел Возраст Анна 0 28Борис 1 35 Вера 2 31 Глеб 0 29Такое кодирование простое и компактное. Но у него есть важный недостаток: некоторые модели могут воспринять числа как порядок, хотя между категориями IT, Продажи и HR настоящего порядка нет.
OneHotEncoder
Заголовок раздела «OneHotEncoder»OneHotEncoder работает иначе: он создаёт отдельный столбец для каждой категории.
Например, столбец Отдел превращается в несколько признаков:
Отдел_IT Отдел_Продажи Отдел_HR1 0 00 1 00 0 1Каждый новый столбец отвечает на вопрос: “строка относится к этой категории или нет?” Поэтому здесь нет ложного порядка между категориями.
uses MLABC;
begin var df := DataFrame.FromCsvText(''' Имя,Отдел,Возраст Анна,IT,28 Борис,Продажи,35 Вера,HR,31 Глеб,IT,29 ''', categoricalColumns := ['Отдел']);
var encoder := new OneHotEncoder('Отдел'); var encoded := encoder.FitTransform(df);
encoded.Print;end.OneHotEncoder обычно лучше подходит для категорий без естественного порядка. Минус в том, что столбцов становится больше.
Fit и Transform
Заголовок раздела «Fit и Transform»Кодировщик сначала запоминает, какие категории встречаются в данных, а потом применяет это правило к таблице.
Короткая запись:
var encoded := encoder.FitTransform(df);То же самое в два шага:
encoder.Fit(df);var encoded := encoder.Transform(df);Разделение на Fit и Transform важно, когда одно и то же правило нужно применить к нескольким таблицам.
Что выбрать
Заголовок раздела «Что выбрать»OrdinalEncoderсоздаёт один числовой столбец вместо строкового.OneHotEncoderсоздаёт несколько столбцов с признаками “да/нет”.- Если категорий мало и между ними нет естественного порядка, чаще лучше
OneHotEncoder. - Если категорий много,
OneHotEncoderможет сильно увеличить число столбцов. В таких случаях используютOrdinalEncoderили заранее укрупняют редкие категории. - Если у категорий есть естественный порядок, обычно подходит
OrdinalEncoder. - Для деревьев решений часто допустим
OrdinalEncoder. - Для линейных моделей и методов, основанных на расстояниях, чаще лучше
OneHotEncoder.
Примеры:
Пол,Тип оплаты,Отдел— категорий мало, порядка нет; обычно подходитOneHotEncoder.Город,Товар,Артикул— категорий может быть много;OneHotEncoderсоздаст слишком много столбцов.Низкий,Средний,Высокий— есть естественный порядок; можно использоватьOrdinalEncoder.
Целевой столбец
Заголовок раздела «Целевой столбец»OrdinalEncoder и OneHotEncoder используются для признаков, то есть столбцов, по которым модель делает предсказание.
Целевой столбец — правильные ответы для обучения модели — кодируется отдельно с помощью метода EncodeLabels. Например, это используется в разделе Быстрый старт, где модель учится определять вид ириса.