2013-11-27 2 views
19

У меня очень несбалансированный набор данных с экземплярами целевого класса в следующем соотношении (изменить :) 60000: 1000: 1000: 100060000:1000:1000:50 (т. Е. Всего 4 класса). Я хочу использовать randomForest для создания прогнозов для целевого класса.Как использовать classwt в randomForest of R?

Таким образом, чтобы уменьшить дисбаланс класса, я играл с sampsize параметра, установив его на (редактировать :)c(5000, 1000, 1000, 1000)c(5000, 1000, 1000, 50) и некоторые другие ценности, но не было много пользы от него. Фактически, точность 1-го класса уменьшилась, когда я играл с sampsize, хотя улучшение прогнозов других классов было очень незначительным.

Хотя копаться в архивах, я наткнулся еще на два особенностей randomForest(), которые strata и classwt, которые используются, чтобы компенсировать проблему дисбаланса класса.

Все документы на classwt были старые (как правило, принадлежащие к 2007, 2008 годы), все из которых предложил не Применять classwt особенность randomForest пакета в R, поскольку она не полностью реализовать свою полную функциональность, как это делает в fortran , Итак, первый вопрос:
Действительно ли classwt полностью реализован сейчас в randomForest пакете R? Если да, то что передает c(1, 10, 10, 10) аргументу classwt? (Предполагая, что приведенный выше случай из 4 классов в целевой переменной)

Еще один аргумент, который, как говорят, касается проблемы дисбаланса класса, - это стратифицированная выборка, которая всегда используется в сочетании с sampsize. Я понимаю, что sampsize из документации, но недостаточно документации или примеров, которые дали четкое представление об использовании strata для преодоления проблемы дисбаланса класса. Итак, второй вопрос:
Какие аргументы должны быть переданы strata в randomForest и что он представляет?

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

+1

Я бы запустил лес только на трех меньших классах. Это даст вам представление о том, насколько хорошо rf-модель может отличить эти три класса без доминирующего класса. Если точность все еще довольно низкая, то дисбаланс класса, вероятно, не является вашей реальной проблемой, а эти три класса просто нелегко отличить от особенностей, которые у вас есть. – joran

+0

Спасибо @joran. Извините за небольшую путаницу, вот фактическое отношение экземпляра класса, которое я также изменил в вопросе: 60000: 1000: 1000: 50. Вы думаете, что отказ от первого класса в этом случае поможет? Потому что, когда я запускаю RF со всеми 4 классами, я получаю точность в следующем порядке для каждого класса: c (90%, 70%, 70%, менее 10%). Меня больше беспокоит улучшение точности 4-го класса, который составляет менее 10%. И еще одна вещь: «classwt» правильно реализован в «randomForest» R на данный момент? – StrikeR

+4

Что касается реализации 'classwt' - я полагаю, это не реализовано, потому что http://cran.r-project.org/web/packages/randomForest/NEWS вы можете прочитать, что« * Внедрить новую схему обработки classwt в классификации ". находится в списке желаний. – BartekCh

ответ

0

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

Когда у меня есть неуравновешенная проблема, я обычно разбираюсь с ней, используя sampsize, как вы пробовали. Однако я делаю все слои равными по размеру, и я использую выборку без замены. Выборка без замены важна здесь, так как в противном случае образцы из меньших классов будут содержать гораздо больше повторений, и класс будет по-прежнему недопредставлен. Может возникнуть необходимость в увеличении mtry, если этот подход приводит к небольшим выборкам, а иногда даже к общему числу функций.

Это хорошо работает, когда в наименьшем классе достаточно предметов. Однако у вашего самого маленького класса всего 50 предметов. Я сомневаюсь, что вы получите полезные результаты с sampsize=c(50,50,50,50).

Также classwt никогда не работал для меня.

2

classwt правильно передан randomForest, проверить этот пример:

library(randomForest) 
rf = randomForest(Species~., data = iris, classwt = c(1E-5,1E-5,1E5)) 
rf 

#Call: 
# randomForest(formula = Species ~ ., data = iris, classwt = c(1e-05, 1e-05, 1e+05)) 
#    Type of random forest: classification 
#      Number of trees: 500 
#No. of variables tried at each split: 2 
# 
#  OOB estimate of error rate: 66.67% 
#Confusion matrix: 
#   setosa versicolor virginica class.error 
#setosa   0   0  50   1 
#versicolor  0   0  50   1 
#virginica  0   0  50   0 

веса класса априорные по результатам. Вам нужно сбалансировать их для достижения желаемых результатов.


На strata и sampsize этого ответа может быть помощь: https://stackoverflow.com/a/20151341/2874779

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