Может ли склеарн случайный лес напрямую обрабатывать категориальные особенности?
Скажем, у меня есть категорическая особенность, цвет, который принимает значения
['красный', 'синий', 'зеленый', 'оранжевый'],
и я хочу использовать это, чтобы предсказать что-то в случайном лесу. Если я закодирую его одним нажатием (т.е. я изменяю его на четыре фиктивные переменные), как мне сказать sklearn, что четыре фиктивные переменные действительно являются одной переменной? В частности, когда sklearn случайным образом выбирает объекты для использования в разных узлах, он должен либо включать в себя красный, синий, зеленый и оранжевый манекены, либо не включать ни один из них.
Я слышал, что нет никакого способа сделать это, но я думаю, что должен быть способ иметь дело с категориальными переменными без произвольного кодирования их в виде чисел или чего-то в этом роде.
6 ответов
Нет, нет Кто-то работает над этим, и патч может когда-нибудь слиться с основной строкой, но сейчас нет поддержки категориальных переменных в scikit-learn, кроме фиктивного (горячего) кодирования.
Большинство реализаций случайного леса (и многих других алгоритмов машинного обучения), которые принимают категориальные входные данные, либо просто автоматизируют кодирование категориальных функций для вас, либо используют метод, который становится вычислительно сложным для большого числа категорий.
Заметным исключением является H2O. H2O имеет очень эффективный метод для прямой обработки категориальных данных, который часто дает ему преимущество перед методами на основе дерева, которые требуют горячего кодирования.
В этой статье Уилла Макгинниса очень хорошо обсуждается одно горячее кодирование и альтернативы.
Вы должны превратить категориальную переменную в серию фиктивных переменных. Да, я знаю, это раздражает и кажется ненужным, но именно так работает sklearn. если вы используете панды. используйте pd.get_dummies, это работает очень хорошо.
Нет. Существует 2 типа категориальных признаков:
- Порядковый номер: используйте OrdinalEncoder
- Кардинал: используйте LabelEncoder или OnehotEncoder
Примечание. Различия между LabelEncoder и OnehotEncoder:
- Метка: только для одного столбца => обычно мы используем его для кодирования столбца метки (т.е. целевого столбца)
- Onehot: для нескольких столбцов => может обрабатывать больше функций одновременно
Возможно, вы можете использовать 1~4 для замены этих четырех цветов, то есть это номер, а не название цвета в этом столбце. И тогда столбец с номером можно использовать в моделях.
Вы можете напрямую передавать категориальные переменные в случайный лес, используя следующий подход:
- Сначала преобразуйте категории функций в числа, используя кодировщик меток sklearn.
- Во-вторых, преобразовать тип объекта с кодировкой метки в строку (объект)
le=LabelEncoder()
df[col]=le.fit_transform(df[col]).astype('str')
приведенный выше код решит вашу проблему