Подтвердить что ты не робот

Как использовать classwt в randomForest of R?

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

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

При копании в архивах я натолкнулся на еще две функции randomForest() - это strata и classwt, которые используются для компенсации проблемы дисбаланса классов.

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

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

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

4b9b3361

Ответ 1

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 этот ответ может помочь: fooobar.com/questions/292150/...

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

Ответ 2

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

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

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

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

Ответ 3

Вы можете передать именованный вектор в classwt. Но как рассчитать вес очень сложно.

Например, если ваша целевая переменная y имеет два класса "Y" и "N", и вы хотите установить сбалансированный вес, вы должны сделать:

wn = sum(y="N")/length(y)
wy = 1

Затем установите classwt = c("N"=wn, "Y"=wy)

Кроме того, вы можете использовать пакет ranger. Этот пакет предлагает гибкие сборки случайных лесов, и легко определить вес класса/выборки. ranger также поддерживается с помощью пакета caret.