2013-05-28 1 views
4

Набор данных для обучения чрезвычайно широк (около 200 тыс. Функций) и очень короткий (сотен). Очевидно, что набор данных занимает много памяти, но R читает его без проблем.Эффективные кластеры памяти в R для чрезвычайно широкого и не слишком длинного набора для обучения

Затем я обучил классификатору случайного леса, и на нем закончилась память. Поэтому я переключился на более простой классификатор, такой как Naive Bayes. NB привел к нехватке памяти.

Как правило, что такое наиболее эффективные по цене классификаторы? Я подозреваю, что логистическая регрессия и Наивные байесовский должны составить список ...

UPD:

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

сокращение Feature используется:

  • порог дисперсии фильтра (удалены особенности с дисперсией ниже порога);
  • корреляция между характеристиками и прогнозируемыми значениями: удаленные объекты с низкой корреляцией;
  • Функция парных корреляций: устранение высоких парных функций корреляции.
+1

Как вы пытались получить случайный лес, чтобы эффективно работать в R? Не все настройки по умолчанию рекомендуется с такими данными, как ваши. – joran

+1

Чтобы добавить к сказанному joran, я бы рекомендовал использовать следующие варианты в вашей формуле 'randomForest (x, y, ...)': 'ntree',' mtry', 'nodesize',' maxnodes'. Все они будут влиять на скорость сборки вашего случайного леса. Судя по вашему краткому описанию набора данных, я бы сказал, что вы можете попытаться уменьшить «mtry» и увеличивать «nodeize» и «maxnodes». – zap2008

+0

Я действительно ценю помощь в случайном лесу, но я все еще надеюсь увидеть другие предложения классификатора. – topchef

ответ

1

Наиболее эффективные алгоритмы памяти основаны на online learning (которые не загружают весь набор данных в память, но учатся по одному экземпляру за раз) и feature hashing, также называемый хеширующим трюком (который может превращать произвольно большую функцию векторы к предопределенному/фиксированному размеру, используя хеширование). Логистическая регрессия и линейный SVM имеют интерактивные обучающие и функциональные хеширующие реализации (что сводится к оптимизации для потери логистики или потери на петлях, соответственно).

Я не знаю о реализации в R (может быть, просто не знаю R-библиотеки хорошо engouh), но очень прочный и широко используемый ученик, использующий эти методы, - это Vowpal Wabbit. Они также реализованы в Scikit-Learn.

1

Here is a paper из отдела Cornell CS, который сравнивает эффективность различных классификаторов. Он не достигает скорости, но он превосходит прогностическую способность почти всех алгоритмов классификации, широко используемых сегодня. Самые быстрые из них будут алгоритмами, которые являются не ансамблевыми классификаторами обучения. Любой алгоритм, который строит несколько моделей и усредняет результаты, по своей сути займет больше времени. Однако, как можно видеть в таблице 2 на стр. 5, наиболее эффективными классификаторами являются ансамблевые методы. Если вы хотите построить модель как можно быстрее, то вам, вероятно, следует использовать только одно дерево решений или логистическую регрессию. В противном случае вам нужно потратить некоторое время на изучение техники обучения ансамбля и выяснить, как оптимизировать скорость этого конкретного алгоритма. Я получил хорошие результаты, распараллеливая свои случайные леса, используя технику, подобную this.

Редактировать более внимательно рассмотреть ваши проблемы памяти: Использование памяти меньше о , который алгоритм вы выбираете, чем о том, как использовать этот алгоритм. Предполагая, что вы использовали случайный левый вызов по умолчанию для вашей исходной модели, вы бы построили 500 деревьев решений, каждый из которых имеет ~ 450 предикторных переменных и столько терминальных узлов, сколько у вас есть точек данных в выборке. Это займет целую кучу памяти. То, что я пытаюсь сделать, это то, что вы можете настроить любую из этих классификационных моделей, чтобы уменьшить количество памяти и работать более эффективно в R. Как уже упоминалось ранее, методы без ансамбля (логистическая регрессия, наивные заливы, CHAID/CART/etc) будут использовать по меньшей мере память по умолчанию.

+0

Я никогда не спрашивал ни об общей эффективности классификаторов, ни о скорости - только об эффективности памяти в R. У меня есть достойное представление о классификаторах ансамблей и другие. Спасибо за указатель. – topchef

+0

Я неправильно сформулировал свой ответ, но по моему опыту вопросы скорости сводятся к проблемам памяти при построении модели. Когда вы построили свой случайный лес на 200+ переменных-предикторах без изменения каких-либо параметров по умолчанию, вы построили по-умолчанию 500 моделей (это число деревьев по умолчанию, как видно [на стр. 17 документации] (http://cran.r-project.org/web/packages/randomForest/randomForest.pdf)). Все эти модели были сохранены в памяти, а затем усреднены, чтобы дать вам окончательный результат. Любой из этих методов может быть ядром памяти, если вы не будете осторожны с вашими параметрами ... – zap2008

+0

делают это «переменные предиктора 200k +», – zap2008

1

Пакет glmnet может обрабатывать разреженные матрицы и будет обладать большей памятью, чем ансамбль, но все же предлагает выбор переменных (через сетку лассо/эластичную сетку). Код может выглядеть так:

library(glmnet) 
df <- read.csv() #data 
X <- sparse.model.matrix(~ . - y, df) #Matrix with all variables in df except the y variable. 
y <- df$y 
model <- cv.glmnet(X, y, nfolds = 10, family='binomial') 
Смежные вопросы