One-Hot Encoding – прямое кодирование, или быстрое кодирование или отображение, используется в подготовке признаков с помощью преобразования категориального признака в числовой.
Его смысл заключается в следующем: для каждого значения признака создается новый столбец, новые признаки получают значения 1 или 0, в зависимости от значения первоначального признака, новые признаки обычно называют дамми-признаками (фиктивными признаками). Довольно просто объясняется на примере.
Допустим, есть датафрейм с признаками: user_id, ‘gender’, где ‘gender’ представленное в значениях ‘M’, ‘F’, None
1 2 3 4 5 6 7 |
user_id gender 0 12 M 1 13 M 2 14 None 3 15 F 4 16 M 5 17 None |
После применения прямого кодирования, мы получим следующие признаки user_id, gender_F, gender_M
print(pd.get_dummies(user_df))
1 2 3 4 5 6 7 |
user_id gender_F gender_M 0 12 0 1 1 13 0 1 2 14 0 0 3 15 1 0 4 16 0 1 5 17 0 0 |
Прямое кодирование было выполнено средствами библиотеки pandas, метода get_dummies. Он принимает как DataFrame, так и Series, есть возможность добавлять префиксы к дамми-признакам, добавлять/не добавлять колонку с Nan, убирать первый столбец (k-1 из числа k дамми-признаков). Убирать первый столбец бывает полезно, когда новые (дамми) столбцы сильно связаны между собой и один из них можно восстановить по значениям из других (в случае выше это Nan), что бы избежать ловушки фиктивных признаков.
Полный пример кода
1 2 3 4 5 |
user_df = pd.DataFrame({'user_id': [12, 13, 14, 15, 16, 17], 'gender': ['M', 'M', None, 'F', 'M', None]}, columns=['user_id', 'gender']) print(user_df) print(pd.get_dummies(user_df)) |
Этот способ кодирования имеет место быть, но он резко увеличивает количество столбцов. Используя прямое кодирование работая, например, с признаком Питомец (кошка, собака, попугай) и вычислениях, например, среднего арифметического мы не получим закодированную собаку и не добавим неверную корреляцию, как в случае порядкового кодирования.