Випадковий час лісових обчислень в R


49

Я використовую пакет партії в R з 10000 рядків і 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. Про фактори; РФ (і всі методи дерева) намагаються знайти оптимальний підмножина рівнів, скануючи таким чином можливості; для цього досить наївно цей фактор може дати вам так багато інформації - не кажучи вже про те, що randomForest не їсть факторів з більш ніж 32 рівнями. Можливо, ви можете просто розглянути його як упорядкований (і, таким чином, еквівалентний звичайній числовій змінній для РФ) або кластеризувати його в деяких групах, розділивши цей один атрибут на кілька?2(# of levels-1)
  5. Перевірте, чи на вашому комп’ютері не вистачає оперативної пам’яті, і чи використовує він місця для заміни. Якщо так, придбайте більший комп’ютер.
  6. Нарешті, ви можете витягти якусь випадкову підмножину об’єктів і зробити деякі початкові експерименти з цього питання.

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

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

1
Чому виклик randomForest (предиктори, рішення) скорочує час роботи?
JenSCDC

Що ? mtry
jkabrg

1
Інтерпретація формули @AndyBlankertz у випадковому випадку Forest, схоже, призводить до копіювання всього вводу.

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. Це виглядає як дуже приємний внесок (хоча я насправді не знаю занадто багато про радіочастоти та нічого про паралельні обчислення). Одне зауваження, впорядкованість відповідей може коливатися з часом, тому краще не посилатися на "відповідь вище", а "відповідь на \ @ так-то-так".
gung - Відновіть Моніку

Вибачте за відповідь, що пізно. Я прочитав ваш блог, чудова робота
Ченгхао Лю

3

Я б запропонував декілька посилань:

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

Ідея для цього виникла звідси: 2009 KDD Cup Slow Challenge . Дані цього змагання мали безліч факторів з великою кількістю рівнів, і в ньому обговорюються деякі методи, якими вони використовувались для скріплення даних з 50 000 рядків на 15 000 стовпців для роботи на 2-ядерному / 2 ГБ оперативної пам’яті.

Моєю останньою пропозицією було б розглянути проблему запуску, як було запропоновано вище, паралельно на екземплярі Hi-CPU Amazon EC2.


Немає 2) . Ви повинні надати важливу частину сторінки, а не покладатися повністю на посилання.
AL

Мені подобається, як працюють ці екземпляри ЄК. Ух, вони приємні. Я думаю, що віртуалізоване обладнання краще, ніж реальне.
EngrStudent

2

Я не можу говорити зі швидкістю конкретних алгоритмів в R, але повинно бути очевидним, що викликає тривалий час обчислень. Для кожного дерева на кожній гілці CART шукає форму найкращого двійкового розколу. Отже, для кожної з 34 особливостей вона найбільше дивиться на розбиття, задані кожним із рівнів змінних. Помножте час виконання кожного розщеплення на дереві на кількість гілок на дереві, а потім помножте на кількість дерев у лісі, і у вас тривалий час. Хто знає? Може, навіть за допомогою швидкого комп’ютера це може зайняти роки?

Найкращий спосіб прискорити роботу, я думаю, було б зібрати деякі рівні разом, щоб кожна змінна знизилася до, можливо, від 3 до 5 рівнів замість цілих 300. Звичайно, це залежить від можливості зробити це, не втрачаючи важливого інформація у ваших даних.

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


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