sklearn tree обрабатывает категориальные переменные как float во время разбиений, как мне решить эту проблему? - PullRequest
1 голос
/ 24 апреля 2019

У меня проблемы с моим деревом регрессии, использующим пакет sklearn.Речь идет о наборе данных книги, в котором дерево регрессии можно увидеть ниже:

sklearn tree

Проблема в переменной STORY_LANGUAGE.Это категориальная переменная со значениями 0, 1, 2 и 3, которые соответствуют другому языку книги.Перед запуском модели я убедился, что STORY_LANGUAGE является категориальной переменной, но дерево все еще разделяет ее и обрабатывает как float (1.5).

Как мне решить эту проблему?Любая помощь приветствуется!

Ответы [ 2 ]

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

Передавая список целых чисел в качестве функций в scikit-learn, вы говорите, что между функциями есть какая-то зависимость.Например, 0 ближе к 1, чем к 2.Чтобы обойти это, вам нужно будет выполнить горячее кодирование со встроенным OneHotEncoder .Если у вас есть три категории, 0, 1 и 2, 0 будет преобразовано в [1,0,0], а 1 будет преобразовано в [0,1,0].По сути, ваш единственный объект заменен вектором, равным 1 в позиции, соответствующей классу, к которому он относится, и 0 в противном случае.

import numpy as np
from sklearn.preprocessing import OneHotEncoder

# Generate random integers between 0 and 2
x = np.random.randint(0,3, size=(100,1))
# Create the one-hot encoder object, specifying not to use sparse arrays.
m = OneHotEncoder(sparse=False)
# Transform your features
x_one_hot = m.fit_transform(x)
0 голосов
/ 24 апреля 2019

Если вы используете DecisionTreeRegressor от sklearn, ваши закодированные объекты будут просто обрабатываться как числовые. Если вы хотите, чтобы они рассматривались как категории, вы можете выполнить горячее кодирование (например, используя OneHotEncoder ) или использовать алгоритм, который поддерживает категориальные функции из коробки (например, lightGBM).

...