R-пакет randomForest не может обрабатывать фактор с более чем 32 уровнями. Когда ему дается более 32 уровней, выдается сообщение об ошибке:
Не может обрабатывать категориальные предикторы с более чем 32 категориями.
Но у меня есть несколько факторов. Некоторые из них имеют более 1000 уровней, а некоторые - более 100. У этого даже есть 'государство' Соединенных Штатов, которое является 52.
Итак, вот мой вопрос.
Почему существует такое ограничение? randomForest отказывается работать даже для простого случая.
> d <- data.frame(x=factor(1:50), y=1:50) > randomForest(y ~ x, data=d) Error in randomForest.default(m, y, ...) : Can not handle categorical predictors with more than 32 categories.
Если это просто из-за ограничения памяти, как может SciKit Learn случайныйForeestRegressor работать с более чем 32 уровнями?
Каков наилучший способ справиться с этой проблемой? Предположим, что у меня есть независимые переменные X1, X2, ..., X50, а Y - зависимая переменная. И предположим, что X1, X2 и X3 имеет более 32 уровней. Что мне делать?
Я думаю о том, чтобы запустить алгоритм кластеризации для каждого из X1, X2 и X3, где расстояние определяется как разница в Y. Я проведу три кластеризации, так как есть три проблемные переменные. И в каждой кластеризации я бы хотел найти похожие уровни. И я объединю их.
Как это звучит?
источник
randomForest
может обрабатывать категориальные предикторы до 53 уровней. НовостиОтветы:
На самом деле это довольно разумное ограничение, потому что разделение на фактор с уровнями - это на самом деле выбор одной из 2 N - 2 возможных комбинаций. Так что даже с N, как 25, пространство комбинаций настолько велико, что такой вывод имеет незначительный смысл.N 2N- 2 N
Большинство других реализаций просто рассматривают фактор как порядковый (т. Е. Целые числа от 1 до ), и это один из вариантов, как вы можете решить эту проблему. На самом деле RF часто бывает достаточно мудрым, чтобы разделить это на произвольные группы с несколькими разбиениями.N
Другой вариант - изменить представление - возможно, ваш результат не зависит напрямую от государственной структуры, но, например, площадь, популяция, количество сосен на душу населения или другие атрибуты, которые вы можете подключить к своей информационной системе.
Также может быть так, что каждое состояние является настолько изолированным и некоррелированным объектом, что для него требуется отдельная модель.
Кластеризация на основе решения, вероятно, является плохой идеей, поскольку таким образом вы переправляете информацию из решения в атрибуты, что часто заканчивается переобучением.
источник
Основная причина в том, как реализован randomForest. Реализация из R во многом вытекает из оригинальных спецификаций Бреймана. Здесь важно отметить, что для факторных / категориальных переменных критерий разделения является двоичным с некоторыми значениями меток слева, а остальные значения меток справа.
Почему работает реализация от Weka и Python?
Реализация weka по умолчанию не использует деревья CART. Он использует деревья C45, у которых нет этой вычислительной проблемы, поскольку для категориальных входных данных он разделяется на несколько узлов, по одному на каждое значение уровня.
Реализация случайного леса Python не может использовать категориальные / факторные переменные. Вы должны закодировать эти переменные в фиктивные или числовые переменные.
источник
Вы можете попытаться представить этот столбец по-другому. Вы можете представить те же данные, что и разреженный фрейм данных.
Минимальный жизнеспособный код;
Обратите внимание, что каждое значение в исходном столбце теперь становится отдельным фиктивным столбцом.
Более обширный пример кода;
Несмотря на то, что этот фрагмент кода показывает, что вы действительно больше не получите ошибку, вы заметите, что алгоритму randomForest теперь требуется много времени, прежде чем он завершится. Это связано с ограничением ЦП, теперь вы можете сопоставить эту задачу с помощью выборки.
Для получения дополнительной информации, пожалуйста, проверьте этот блог пост:
https://blog.cloudera.com/blog/2013/02/how-to-resample-from-a-large-data-set-in-parallel-with-r-on-hadoop/
источник
Вместо этого вы можете использовать пакет extraTrees. Алгоритм крайне рандомизированных лесов не пробует какую-либо точку останова / разбиение, а только ограниченное случайное подмножество разбиений.
источник
Другой вариант: в зависимости от количества уровней и количества наблюдений в ваших данных, вы можете объединить несколько уровней. Помимо превышения предела, это может уменьшить дисперсию, если у вас много уровней с несколькими наблюдениями. Hadley «S forcats: fct_lump делает это.
источник