Почему разные реализации случайных лесов в R дают разные результаты? - PullRequest
0 голосов
/ 10 сентября 2018

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

Три методаречь идет о пакете randomForest, методе «rf» в каретке и пакете ranger.Код приведен ниже.

Данные являются одним из примеров;Я вижу похожие вещи в других спецификациях похожих данных.

Переменная LHS: идентификация партии (Dem, Rep, Indep.).Предикторы с правой стороны - это демография.Чтобы попытаться выяснить, что, черт возьми, происходит с некоторыми странными результатами в пакете randomForest , я попытался реализовать ту же модель в двух других методах.Я обнаружил, что они НЕ воспроизводят эту конкретную аномалию;это особенно странно, потому что, насколько я могу судить, метод rf в карете является просто косвенным использованием пакета randomForest.

Три спецификации, которые я запускаю в каждой реализации, это (1) классификация трех категорий,(2) удаление независимой категории, и (3) то же самое, что и 2, но скремблирование одного наблюдения в «Независимое», чтобы сохранить три категории в модели, что должно дать результаты, аналогичные 2. Насколько я могу судить, вВ случаях, когда для отбора результатов может быть какое-либо превышение или недополнение выборки.

Я также замечаю следующие тенденции:

  1. Пакет randomForest - единственный пакет, который полностью работает только с двумяКатегории.
  2. Пакет рейнджера последовательно идентифицирует (как правильно, так и неправильно) больше наблюдений как независимые.
  3. Пакет рейнджера всегда немного хуже с точки зрения общей точности прогнозирования.
  4. Пакет каретки по общей точности похож на randomForest (sliнемного выше), но последовательно лучше в более общем классе и хуже в менее общем классе.Это странно, потому что, насколько я могу судить, я не использую избыточную или недостаточную выборку в обоих случаях, и потому что я думаю, что Caret полагается на пакет randomForest.

Ниже я включил обакод и матрицы путаницы, показывающие различия в вопросе.Повторный запуск кода приводит к аналогичным тенденциям в матрицах путаницы каждый раз;это не проблема «хорошо, что любой отдельный запуск может привести к странным результатам».

Есть ли у кого-нибудь какие-либо идеи, почему эти пакеты будут последовательно выдавать немного разные (а в случае связанной проблемы в randomForest, ОЧЕНЬ разные) результаты в целом, или даже лучше, почему они будут отличаться в этом конкретном случае?Например, есть ли в пакете этих пакетов какое-то взвешивание / стратификация образца, о которых мне следует знать?

Код:

num_trees=1001
var_split=3

load("three_cat.Rda")
rf_three_cat  <-randomForest(party_id_3_cat~{RHS Vars},
                         data=three_cat,
                         ntree=num_trees,
                         mtry=var_split,
                         type="classification",
                         importance=TRUE,confusion=TRUE)

two_cat<-subset(three_cat,party_id_3_cat!="2. Independents")    
two_cat$party_id_3_cat<-droplevels(two_cat$party_id_3_cat)
rf_two_cat    <-randomForest(party_id_3_cat~{RHS Vars},
                         data=two_cat,
                         ntree=num_trees,
                         mtry=var_split,
                         type="classification",
                         importance=TRUE,confusion=TRUE)
scramble_independent<-subset(three_cat,party_id_3_cat!="2. Independents")
scramble_independent[1,19]<-"2. Independents"
scramble_independent<- data.frame(lapply(scramble_independent, as.factor), stringsAsFactors=TRUE)
rf_scramble<-randomForest(party_id_3_cat~{RHS Vars},
                      data=scramble_independent,
                      ntree=num_trees,
                      mtry=var_split,
                      type="classification",
                      importance=TRUE,confusion=TRUE)

ranger_2<-ranger(formula=party_id_3_cat~{RHS Vars},
             data=two_cat,
             num.trees=num_trees,mtry=var_split)
ranger_3<-ranger(formula=party_id_3_cat~{RHS Vars},
             data=three_cat,
             num.trees=num_trees,mtry=var_split)
ranger_scram<-ranger(formula=party_id_3_cat~{RHS Vars},
                 data=scramble_independent,
                 num.trees=num_trees,mtry=var_split)

rfControl <- trainControl(method = "none", number = 1, repeats = 1)
rfGrid <- expand.grid(mtry = c(3))
rf_caret_3        <- train(party_id_3_cat~{RHS Vars},
                      data=three_cat,
                      method="rf", ntree=num_trees,
                      type="classification",
                      importance=TRUE,confusion=TRUE,
                      trControl = rfControl, tuneGrid = rfGrid)
rf_caret_2        <- train(party_id_3_cat~{RHS Vars},
                data = two_cat,
                method = "rf",ntree=num_trees,
                type="classification",
                importance=TRUE,confusion=TRUE,
                trControl = rfControl, tuneGrid = rfGrid)
rf_caret_scramble <- train(party_id_3_cat~{RHS Vars},
                      data = scramble_independent,
                      method = "rf",ntree=num_trees,
                      type="classification",
                      importance=TRUE,confusion=TRUE,
                      trControl = rfControl, tuneGrid = rfGrid)

rf_three_cat$confusion
ranger_3$confusion.matrix
rf_caret_3$finalModel["confusion"]

rf_two_cat$confusion
ranger_2$confusion.matrix
rf_caret_2$finalModel["confusion"]

rf_scramble$confusion
ranger_scram$confusion.matrix
rf_caret_scramble$finalModel["confusion"]

Результаты (форматирование слегка изменено длясопоставимость):

> rf_three_cat$confusion
                                     1. Democrats (including leaners) 2. Independents 3. Republicans (including leaners) class.error
1. Democrats (including leaners)                                 1121               3                                697   0.3844042
2. Independents                                                   263               7                                261   0.9868173
3. Republicans (including leaners)                                509               9                               1096   0.3209418                        

> ranger_3$confusion.matrix
                                   1. Democrats (including leaners) 2. Independents 3. Republicans (including leaners) class.error
1. Democrats (including leaners)                               1128              46                                647   0.3805601
2. Independents                                                 263              23                                245   0.9566855
3. Republicans (including leaners)                              572              31                               1011   0.3736059

> rf_caret_3$finalModel["confusion"]
                                     1. Democrats (including leaners) 2. Independents 3. Republicans (including leaners) class.error
1. Democrats (including leaners)                                 1268               0                                553   0.3036793
2. Independents                                                   304               0                                227   1.0000000
3. Republicans (including leaners)                                606               0                               1008   0.3754647

> rf_two_cat$confusion
                                     1. Democrats (including leaners) 3. Republicans (including leaners) class.error
1. Democrats (including leaners)                                 1775                                 46   0.0252608
3. Republicans (including leaners)                               1581                                 33   0.9795539

> ranger_2$confusion.matrix
                                   1. Democrats (including leaners) 3. Republicans (including leaners) class.error
1. Democrats (including leaners)                               1154                                667   0.3662823
3. Republicans (including leaners)                              590                               1024   0.3655514

> rf_caret_2$finalModel["confusion"]
                                   1. Democrats (including leaners) 3. Republicans (including leaners) class.error
1. Democrats (including leaners)                               1315                                  506   0.2778693
3. Republicans (including leaners)                              666                                  948   0.4126394

> rf_scramble$confusion
                                     1. Democrats (including leaners) 2. Independents 3. Republicans (including leaners) class.error
1. Democrats (including leaners)                               1104               0                                717   0.3937397
2. Independents                                                   0               0                                  1   1.0000000
3. Republicans (including leaners)                              501               0                               1112   0.3106014

> ranger_scram$confusion.matrix
                                   1. Democrats (including leaners) 2. Independents 3. Republicans (including leaners)
1. Democrats (including leaners)                               1159               0                               662  0.3635365
2. Independents                                                   0               0                                 1  1.0000000
3. Republicans (including leaners)                              577               0                              1036  0.3577185

> rf_caret_scramble$finalModel["confusion"]
                                   1. Democrats (including leaners) 2. Independents 3. Republicans (including leaners) class.error
1. Democrats (including leaners)                               1315               0                                506   0.2778693
2. Independents                                                   0               0                                  1   1.0000000
3. Republicans (including leaners)                              666               0                                947   0.4128952

1 Ответ

0 голосов
/ 11 сентября 2018

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

Вам следует взглянуть на то, как они выполняют разбиения (какой критерий: джини, дополнительные и т. Д.) И, если они случайные (чрезвычайно рандомизированные деревья), как они выбирают начальные выборки (с заменой или без нее) и в какой пропорции , mtry или сколько переменных выбрано при каждом разделении, максимальная глубина или максимальное количество случаев в узлах и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...