Как использовать 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
и что он представляет?
Я предполагаю, что слово вес, которое я не упомянул явно в вопросе, должно играть главную роль в ответе.
Ответы
Ответ 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
.