Время вычисления случайного леса в R


49

Я использую пакет party в R с 10 000 строк и 34 функциями, а некоторые факторные функции имеют более 300 уровней. Время вычислений слишком велико. (Это заняло 3 часа и еще не закончено.)

Я хочу знать, какие элементы оказывают большое влияние на время вычислений случайного леса. Есть ли факторы со слишком большим количеством уровней? Существуют ли какие-либо оптимизированные методы для улучшения ВЧ вычислительного времени?

Ответы:


65

Общая сложность РФ что - то вроде ; если вы хотите ускорить вычисления, попробуйте следующее:ntreemtry(# objects)log(# objects)

  1. Используйте randomForestвместо party, или, еще лучше, rangerили Rborist(хотя оба еще не проверены в бою).
  2. Не используйте формулу, т.е. звоните randomForest(predictors,decision)вместо randomForest(decision~.,data=input).
  3. Используйте do.traceаргумент, чтобы увидеть ошибку OOB в режиме реального времени; таким образом, вы можете обнаружить, что можете понизить ntree.
  4. О факторах; RF (и все методы дерева) пытаются найти оптимальное подмножество уровней, таким образом сканируя возможностей; с этой целью довольно наивно, что этот фактор может дать вам столько информации - не говоря уже о том, что randomForest не будет поглощать факторы с более чем 32 уровнями. Может быть, вы можете просто рассматривать его как упорядоченный (и, следовательно, эквивалентный обычной числовой переменной для RF) или кластеризовать его в несколько групп, разделив этот один атрибут на несколько?2(# of levels-1)
  5. Проверьте, не исчерпан ли на вашем компьютере ОЗУ и используется ли пространство подкачки. Если так, купите большой компьютер.
  6. Наконец, вы можете извлечь некоторые случайные подмножества объектов и провести некоторые первоначальные эксперименты на этом.

2
Спасибо, я многому научился из вашего ответа и сделал тест, как вы сказали, кроме того, почему второе предложение работает?
Ченгхао Лю

4
@ChenghaoLiu Формулы были разработаны для небольших, но сложных рамок модели лайнера, и поэтому они неэффективны, когда копирование набора становится дорогим.

1
Почему вызов randomForest (предикторы, решения) сокращает время выполнения?
JenSCDC

mtry

1
@AndyBlankertz Интерпретация формулы в randomForest, кажется, приводит к копированию всего ввода.

12

Так как randomForest - это набор независимых тележек, обученных случайному подмножеству функций и записей, он пригоден для распараллеливания. combine()Функция в RandomForest пакет будет склеивать самостоятельно подготовленные леса. Вот игрушечный пример. Как говорится в ответе @mpq, вы не должны использовать формульную нотацию, а передавать данные / матрицу переменных и вектор результатов. Я бесстыдно снял их с документов.

library("doMC")
library("randomForest")
data(iris)

registerDoMC(4) #number of cores on the machine
darkAndScaryForest <- foreach(y=seq(10), .combine=combine ) %dopar% {
   set.seed(y) # not really needed
   rf <- randomForest(Species ~ ., iris, ntree=50, norm.votes=FALSE)
}

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

Редактировать:

Перечитав пост, я понимаю, что ничего не говорю о проблеме 34+. Весьма не продуманный ответ мог бы представлять их как двоичные переменные. Это каждый фактор столбец, который закодирован с коэффициентом 0/1 относительно его наличия / отсутствия. Сделав некоторый выбор переменных для неважных факторов и удалив их, вы можете не допустить, чтобы пространство объектов стало слишком большим.


Добро пожаловать на сайт, @jdennison. Это похоже на действительно хороший вклад (хотя я действительно не знаю слишком много о RF и ничего о параллельных вычислениях). Одно замечание: порядок ответов может меняться с течением времени, поэтому лучше не ссылаться на «ответ выше», а вместо этого «ответ от \ @ такой-то».
gung - Восстановить Монику

Извините за поздний ответ. Я читаю ваш блог, отличная работа
Chenghao Liu

3

Я бы предложил пару ссылок:

1) Сокращение количества уровней факторной переменной - это ссылка на вопрос о том, stackoverflowкак решить аналогичную проблему при использовании randomForestпакета. В частности, речь идет об использовании только наиболее часто встречающихся уровней и назначении нового уровня всем другим, менее часто встречающимся уровням.

Идея для этого пришла отсюда: Кубок KDD 2009 Slow Challenge . Данные для этого конкурса имели множество факторов с множеством уровней, и в нем обсуждаются некоторые методы, которые они использовали для сокращения данных с 50000 строк на 15000 столбцов для работы на 2-ядерном / 2 ГБ ОЗУ.

Последним моим предложением было бы посмотреть на параллельное выполнение проблемы, как предложено выше, на экземпляре Amazon EC2 с высоким процессором.


Там нет 2) . Вы должны предоставить важную часть страницы, а не полагаться исключительно на ссылку.
AL

Мне нравится, как работают эти инстансы ЕС. Вау, они милые Я думаю, что виртуализированное оборудование лучше, чем реальное.
EngrStudent - Восстановить Монику

2

Я не могу говорить о скорости конкретных алгоритмов в R, но должно быть очевидно, что вызывает длительное время вычислений. Для каждого дерева в каждой ветви CART ищет форму наилучшего двоичного разбиения. Таким образом, для каждой из 34 функций наиболее подробно рассматриваются расщепления, заданные каждым из уровней переменных. Умножьте время выполнения каждого разбиения в дереве на количество веток в дереве, а затем умножьте его на количество деревьев в лесу, и у вас будет длительное время выполнения. Кто знает? Может быть, даже с быстрым компьютером это может занять годы, чтобы закончить?

Я думаю, что лучший способ ускорить процесс состоит в том, чтобы объединить некоторые уровни вместе, чтобы каждая переменная снизилась до 3–5 уровней, а не до 300. Конечно, это зависит от возможности сделать это без потери важных информация в ваших данных.

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


Еще раз спасибо, я полностью согласен с вами. И я пытаюсь уменьшить количество уровней с помощью метода фиктивного манекена. Например, я заменяю предиктор на 600 уровней на 4 предиктора (как 600 <5 ^ 4). После этого преобразования я Можно запустить алгоритм случайного леса. Однако, результат RMSE является странным, я открою два других вопроса о том, как уменьшить уровень факторной характеристики и какова взаимосвязь между 10-кратным среднеквадратичным среднеквадратичным средним и тестовым набором RMSE?
Ченгхао Лю
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.