2012-01-02 6 views
15

Я использую случайный лес в большой проблеме данных, которая имеет очень несбалансированную класс ответа, так что я прочитал документацию, и я нашел следующие параметры:Random Forest с классами, которые очень неуравновешенным

strata 

sampsize 

The документация по этим параметрам разрежена (или мне не повезло найти ее), и я действительно не понимаю, как ее реализовать. Я использую следующий код:

randomForest(x=predictors, 
      y=response, 
      data=train.data, 
      mtry=lista.params[1], 
      ntree=lista.params[2], 
      na.action=na.omit, 
      nodesize=lista.params[3], 
      maxnodes=lista.params[4], 
      sampsize=c(250000,2000), 
      do.trace=100, 
      importance=TRUE) 

Ответ является классом с двумя возможными значениями, первым появляется чаще, чем вторые (10000: 1 или более)

list.params представляет собой список с разные параметры (я знаю ...)

Ну, вопрос (опять же): как я могу использовать параметр «strata»? Я правильно использую sampsize?

И, наконец, иногда я получаю следующее сообщение об ошибке:

Error in randomForest.default(x = predictors, y = response, data = train.data, : 
    Still have fewer than two classes in the in-bag sample after 10 attempts. 

Извините, если я делаю так много (и, возможно, глупый) вопрос ...

+1

Следуя совет Двины, я буду стараться сделать описание данных. Рамка данных имеет размер 1 миллиметр или, может быть, немного больше (2 или 3 броска), она имеет почти 33 столбца, которые являются факторами, за исключением двух, которые имеют тип числовой, и один дополнительный столбец, который является ответом, фактором с двумя возможными значениями. Надеюсь, это поможет. – nanounanue

+7

После того, как вы описали свое сообщение об ошибке, я просмотрел исходный код на CRAN и связался с автором пакета. Оказывается, на самом деле была небольшая ошибка в коде, которая порождает эту ошибку, которая _may_ дает вам проблемы. Попробуйте проверить CRAN на исправленную версию в течение следующих нескольких дней и посмотреть, поможет ли это. – joran

+0

@joran Ничего себе, кто бы знал! Позвольте мне попробовать еще раз с оригинальным кодом. Благодаря! – nanounanue

ответ

6

Вы должны попытаться использовать методы отбора проб, которые снижают степень дисбаланса от 1: 10 000 до 1: 100 или 1:10. Вы также должны уменьшить размер генерируемых деревьев. (На данный момент это рекомендации, которые я повторяю только из памяти, но я увижу, могу ли я отслеживать больше полномочий, чем моя губчатая кора.)

Одним из способов уменьшения размера деревьев является установка «nodeize» «больше. При такой степени дисбаланса вам может потребоваться большой размер узла, скажем, 5-10 000. Вот нить в rhelp: https://stat.ethz.ch/pipermail/r-help/2011-September/289288.html

В текущем состоянии вопроса у вас есть sampsize=c(250000,2000), тогда я бы подумал, что что-то вроде sampsize = с (8000,2000), была больше в соответствии с моими предложениями. Я думаю, что вы создаете образцы, в которых у вас нет какой-либо группы, которая была отобранной только с 2000.

+0

Спасибо, DWin, не могли бы вы предоставить мне пример кода? Спасибо заранее (опять же) – nanounanue

+0

Обычно я делаю попытку кода только при предоставлении данных или достаточно четкого описания, которое поддерживает построение примера, соответствующего этой проблеме. –

+0

Хорошо, это здорово ... :) – nanounanue

3

Есть несколько вариантов.

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

Вы также можете увеличить данные в классе меньшинства. Алгоритм SMOTE может помочь (см. Ссылку ниже и пакет DMwR для функции).

Вы также можете использовать другие методы. rpart() и несколько других функций могут позволить разные затраты на ошибки, поэтому вы можете больше относиться к классу меньшинства. Вы можете суммировать этот тип модели rpart(), чтобы приблизиться к тому, что делает случайный лес.

ksvm() в пакете kernlab также могут использовать несбалансированные затраты (но оценки вероятности более не хороши, когда вы это делаете). У многих других пакетов есть аргументы для настройки приоритетов. Вы также можете настроить это, чтобы уделять больше внимания классу меньшинства.

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

+0

Вы правы, я думаю, что я использую слово «точность» слишком свободно .. – nanounanue

3

К сожалению, я не знаю, как опубликовать комментарий к более раннему ответу, поэтому я создам отдельный ответ.

Я полагаю, что проблема вызвана высоким дисбалансом набора данных (имеется слишком мало случаев одного из классов). Для каждого дерева в РФ алгоритм создает образец бутстрапа, который является обучающим набором для этого дерева. И если у вас слишком мало примеров одного из классов в вашем наборе данных, тогда выборка бутстрапов будет выбирать примеры только одного класса (основного класса). И, таким образом, дерево нельзя выращивать только на примерах одного класса. Кажется, что существует предел 10 неудачных попыток выборки. Таким образом, предложение DWin уменьшить степень дисбаланса до более низких значений (1: 100 или 1:10) является наиболее разумным.

+0

Спасибо DrDom (одно письмо больше и было бы большим прозвищем, кстати, я своего рода поклонник доктора Дума). Но где сделать сокращение дисбаланса? Во время получения данных из базы данных или атрибута sampsize?Я попробовал второй (я хочу оставить строку 1M или что-то в этом роде) и балансировать sampsize, и ошибка появляется снова, но если я уменьшу с 1Mrows до разрешения сказанного 250K, все будет работать, но я обеспокоен ударом по предсказуемости или, возможно, ... Каково твое мнение? – nanounanue

+1

@nanounanue, я могу предложить взять все объекты второстепенного класса и добавить к ним в 100 раз больше объектов из основного класса (выбор объекта основного класса может выполняться произвольно или контролироваться) и разработать модель. Затем повторите этот шаг так много раз, чтобы использовать все объекты из основного класса хотя бы один раз. Таким образом, у вас будет пакет моделей. И все они должны использоваться для прогнозирования. Окончательное предсказание, которое вы делаете по схеме большинства голосов, в классе которого больше голосов, которые он выигрывает. Другая возможность - уменьшить количество объектов основного класса. Это можно сделать в соответствии с кластерным анализом, например. – DrDom

+0

Все ваши предложения, где правильно! Спасибо огромное! – nanounanue