Как обрабатывать категориальные независимые переменные в деревьях решений sklearn - PullRequest
1 голос
/ 04 февраля 2020

Я преобразовал все свои категориальные независимые переменные из строк в числа c (двоичные числа 1 и 0), используя onehotencoder, но когда я запускаю дерево решений, алгоритм рассматривает двоичную категориальную переменную как непрерывную.

для например, если пол - это одна из моих независимых переменных, конвертируем мужской в ​​1, а женский в 0. Когда я использую это в дереве решений, узел разделяется на 0,5, что не имеет смысла.

как преобразовать это число c непрерывно в цифру c категорично?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Есть в основном 2 способа справиться с этим. Вы можете использовать

  1. Целочисленное кодирование (если категориальная переменная имеет порядковый характер, например size et c)
  2. Однократное кодирование (если категориальная переменная имеет порядковый характер, например пол et c)

Похоже, вы неправильно внедрили кодирование в одно касание для этой проблемы. То, что вы используете, это простая целочисленная кодировка (или двоичная кодировка, если быть более точным c). Правильно реализованное однократное кодирование обеспечивает отсутствие смещения в преобразованных значениях, а результаты выполнения алгоритма машинного обучения не отклоняются в пользу переменной только из-за ее абсолютного значения. Подробнее об этом можно прочитать здесь .

0 голосов
/ 04 февраля 2020

как преобразовать эту цифру c непрерывную в цифру c категориальную?

Если результат будет таким же, понадобится ли вам это?

например, если пол является одной из моих независимых переменных, конвертируется мужчина в 1, а женщина в 0. Когда я использую это в дереве решений, узел разделяется на 0,5, что не имеет смысла.

Возможно, я ошибаюсь, но для меня это разделение имеет смысл.

Допустим, у нас есть дерево решений с категоричным правилом разделения. Делением будет двоичное деление, означающее «0» слева и «1» справа (в данном случае).

Теперь, как мы можем оптимизировать это правило деления? Вместо поиска, если значение равно «0» или «1», мы можем использовать одно действие для замены этих двух проверок. «0» осталось, а все остальное верно. Теперь мы можем заменить эту же проверку из категории на число с плавающей запятой, <0,5 слева, в противном случае - справа. </p>

В коде это будет так просто:

Случай 1:

if value == "0":
    tree.left()
elif value == "1":
    tree.right()
else:
    pass # if you work with binary, this will never happen, so its useless

Дело 2:

 if value == "0":
     tree.left()
 else:
     tree.right()

Дело 3:

if value < 0.5:
    tree.left()
else:
    tree.right()
...