2013-11-23 5 views
0

Я хочу использовать класс GradientBoostingRegressor Sklearn для прогнозирования значений целевой переменной в задаче регрессии. Функции, которые у меня есть, имеют смешанный тип: некоторые из них являются непрерывными числовыми, некоторые являются логическими, два являются категориальными, а один - вектором непрерывных чисел. Я выбираю градиент, повышающий деревья, потому что данные имеют смешанные типы данных. Примером вектор-функции будет:Gradient Boosting with Sklearn

['Категория1', 41.93655, -87.642079, 0, 0, < 1x822 разреженная матрица типа '' с 4 сохраненными элементами в формате сжатого разреженного диапазона>, 'mobile_app', «NA»]

Однако, когда я пытаюсь обучить GradientBoostingRegressor с нужным(), я получаю сообщение об ошибке сказав:

ValueError: не удалось преобразовать строку плавать: category1

значение этой функции являются реализован с перечислением. У меня есть только метод:

def enum(self, **enums): 
    return type('Enum',(), enums) 

Тогда, когда я создаю свои категории, я делаю это так:

categories = self.enum(Category1='Category1', Category2='Category2', ...) 

Я думаю, проблема в том, что она по-прежнему возвращается фактическое значение в виде строки. Но если я изменю значения на 0, 1, 2 и т. Д., Это сделает некоторые категории «ближе» к другим, когда они должны быть равноудалены от всех других категорий.

Значит, этот объект фактически обрабатывает данные смешанного типа или все это нужно делать численно? Если он должен быть все числовым, имеет ли кто-нибудь, кто обрабатывал категориальные данные с этим объектом, проливает свет на лучший способ представления категорий? Любая помощь оценивается

ответ

1

Каждая функция должна быть численной. Поскольку повышение градиента основано на деревьях решений, а деревья решений работают на основе расщепления объектов, а не расстояний, «0, 1, 2 и т. Д.», представление должно работать просто отлично, если вы правильно установили параметр max_depth (поиск по сетке обязательно).

0

Как писал Фред Фу, каждая функция должна быть численной, потому что алгоритм GradientBoosting выполняет сортировку для каждого атрибута при поиске лучшего разделения.

Вы можете преобразовать категориальные атрибуты в двоичное представление или в число. Для этого есть готовые реализации sklearn: sklearn.preprocessing.LabelEncoder и sklearn.preprocessing.LabelBinarizer

Смежные вопросы