R для обучения работе с факторами с большим количеством уровней

Я пытаюсь сделать некоторые машинные учебные материалы, которые включают в себя множество переменных факторного типа (слова, описания, времена, в основном нечисловые данные). Обычно я полагаюсь на randomForest, но он не работает с факторами, которые имеют > 32 уровня.

Кто-нибудь может предложить хорошие альтернативы?

Ответ 1

Методы дерева не будут работать, потому что число возможных расщеплений экспоненциально увеличивается с количеством уровней. Однако со словами это обычно решается путем создания переменных индикатора для каждого слова (описания и т.д.). Таким образом, разрывы могут использовать слово за раз (да/нет) вместо того, чтобы выбирать все возможные комбинации. В общем, вы всегда можете расширить уровни в индикаторы (и некоторые модели делают это неявно, например, glm). То же самое верно в ML для обработки текста другими методами, такими как SVM и т.д. Таким образом, ответ может заключаться в том, что вам нужно подумать о структуре входных данных, а не о методах. В качестве альтернативы, если у вас есть какой-то порядок на уровнях, вы можете линеаризовать его (так что есть только c-1 расщепления).

Ответ 2

В общем, лучший пакет, который я нашел для ситуаций, где есть много факторов, заключается в использовании пакета gbm.

Он может обрабатывать до 1024 уровней факторов.

Если уровней более 1024, я обычно изменяю данные, сохраняя 1023 наиболее часто встречающихся уровня факторов, а затем кодирую оставшиеся уровни как один уровень.

Ответ 3

В теории нет ничего плохого с использованием метода randomForest для переменных класса, которые имеют более 32 классов - это вычислительно дорого, но не невозможно обрабатывать любое количество классов с использованием методологии randomForest. Обычный случайный класс R-пакетов устанавливает 32 как максимальное количество классов для данной переменной класса и, таким образом, запрещает пользователю запускать randomForest на чем-либо s > 32 классами для любой переменной класса.

Линеаризация переменной - очень хорошее предложение - я использовал метод ранжирования классов, а затем разбил их равномерно на 32 метакласса. Поэтому, если на самом деле существует 64 разных класса, метакласс 1 состоит из всех вещей в классах 1 и 2 и т.д. Единственная проблема здесь заключается в том, чтобы определить разумный способ сделать рейтинг - и если вы работаете, скажем, слова очень трудно понять, как каждое слово должно быть оценено по отношению к любому другому слову.

Способ вокруг этого состоит в том, чтобы сделать n различных наборов предсказаний, где каждый набор содержит все экземпляры с любым определенным подмножеством из 31 классов в каждой переменной класса с более чем 32 классами. Вы можете сделать прогноз с использованием всех наборов, а затем использовать переменные значения мер, которые прилагаются к пакету, найти реализацию, где используемые классы были наиболее прогностическими. После того как вы раскрыли 31 наиболее интеллектуальный класс, внедрите новую версию RF, используя все данные, которые обозначают эти наиболее интеллектуальные классы как от 1 до 31, так и все остальное в "другом" классе, предоставляя вам максимум 32 класса для категориальная переменная, но, надеюсь, сохраняющая значительную часть прогностической способности.

Удачи!