Почему случайный лес занимает больше времени, чтобы заполнить фрейм данных фиктивными переменными? - PullRequest
4 голосов
/ 21 марта 2019

Я беру быстрый Введение в машинное обучение , и в Уроке 1 он использует Случайный Лес в наборе Синей книги для бульдозеров из Kaggle ,

При любопытном поступке ко мне инструктор не использовал pd.get_dummies() или OneHotEncoder из SKlearn для обработки категориальных данных. Вместо этого он назвал pd.Series.cat.codes во всех категориальных столбцах.

Я заметил, что когда был вызван метод fit(), он вычислялся намного быстрее (около 1 минуты) для набора данных с использованием pd.Series.cat.codes, тогда как набор данных с фиктивными переменными падал на виртуальном сервере, который я запускал и использовал 60 ГБ ОЗУ.

Память каждого занятого кадра данных была примерно одинаковой ........ 54 МБ. Мне любопытно, почему один фрейм данных намного быстрее, чем другой?

Не потому ли, что с одним столбцом целых чисел случайный лес рассматривает только среднее значение этого столбца в качестве точки вырезания, что облегчает его вычисление? Или что-то еще?

Ответы [ 2 ]

1 голос
/ 22 марта 2019

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

Если мы рассмотрим непрерывный числовой признак для расщепления, то будет несколько комбинаций, в которых дерево можетТрещина.Категориальные особенности находятся в невыгодном положении и имеют только несколько вариантов разделения, что приводит к очень редким деревьям решений.Это становится хуже для категории с двумя уровнями.

Также создаются фиктивные переменные, чтобы модель не могла выучить ложную ординальность.Поскольку древовидная модель работает по принципу разбиения, это не проблема, и нет необходимости создавать фиктивные переменные.

0 голосов
/ 21 марта 2019

pd.get_dummies добавит k (или k-1, если drop_first = True) столбцы в ваш DataFrame.В случае очень большого K алгоритм RandomForest делает больший выбор при выборе элементов, тем самым увеличивая продолжительность обучения каждого дерева.

Вы можете использовать параметры max_features, чтобы ограничить количество функций, используемых во время каждого обучения дерева, но реализация алгоритма scikit-learn не учитывает, что переменная-пустышка на самом деле является одной функцией, то естьможет выбрать только подмножество манекенов из вашей категориальной переменной

Это может привести к снижению производительности вашей модели.Я предполагаю, что именно поэтому fastai использует pd.Series.cat.codes.

...