Почему onehotencoding преобразует двоичные данные в 2 взаимоисключающих функции? - PullRequest
0 голосов
/ 26 апреля 2019

Рассмотрим следующий код с сайта scikitlearn:

from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(handle_unknown='ignore') 
X = [['Male', 1], ['Female', 3], ['Female', 2]]
enc.fit(X)

Это позволит мне представить категориальную информацию в виде двоичного ввода.Вывод кода:

enc.get_feature_names()

равен

array(['x0_Female', 'x0_Male', 'x1_1', 'x1_2','x1_3'],dtype=object)

, который показывает новые функции в преобразованном пространстве.Однако почему он должен представлять женщину и мужчину отдельно?Это взаимоисключающая информация, которая должна быть представлена ​​в виде единой функции, например, 0 -> женщина и 1 -> мужчина.Запустив код,

enc.transform([['Female', 1], ['Male', 2]]).toarray()

, получим

array([[1., 0., 1., 0., 0.],
       [0., 1., 0., 1., 0.]])

Поскольку для этой категории есть только два возможных входа, то первые два элемента каждой строки будут либо 0-1для мужчин или 1-0 для женщин.Соотношение между ними будет -1.Эта информация может быть представлена ​​как одна особенность, почему она составляет 2?

1 Ответ

1 голос
/ 28 апреля 2019

OneHotEncoder не могу знать, что вы хотите и нужно. Но в любом случае он не должен вести себя по-разному для объектов, содержащих категории 2 и 100.

Представьте, что у вас есть 5 или 100 категорий внутри функции. Может быть, случайно он отбросит категорию X, которая имеет очень сильную корреляцию с целью. Тогда вашему алгоритму ML будет трудно хорошо обобщить (например, алгоритм на основе дерева должен был бы установить разбиения так, чтобы все остальные 4 или 99 двоичных столбцов были равны 0, что приводит к множеству разбиений)

Но действительно, есть избыточная информация. OneHotEncoder не позволяет настроить преобразование для отбрасывания одной из категорий (что может быть полезно, например, для линейных моделей). Если вам действительно нужна эта функциональность, вы можете использовать pandas.get_dummies . Он имеет аргумент drop_first и по умолчанию преобразует только категориальные функции вместо всех.

...