R Случайный лес: частота ошибок OOB изменяется при изменении последовательности столбцов в таблице объектов - PullRequest
1 голос
/ 27 апреля 2020

Я озадачен следующим «поведением» RandomForest и удивляюсь, испытал ли это другие пользователи - и что я могу сделать, чтобы избежать этого: при прочих равных условиях (и с использованием того же значения set.seed), результаты модели randomForest (например, оценки вероятности появления ошибок в OOB) изменяются только путем изменения последовательности признаков (= столбцов) таблицы данных. В следующем коде I 1) запустите randomForest () один раз: OOB = 23,06% 2) случайным образом измените последовательность таблицы данных 3) снова запустите randomForest () с таблицей данных изменений: OOB = 22,53%

R.version.string
library(randomForest)
library(dplyr)

df <- readRDS("df_feature_list.rds")
head(df)

set.seed(1) 
RF <-  randomForest(Class ~ . , data = df)
RF # OOB error: 23.06%

# randomly swap field order in feature table
df <- df[, sample(names(df))]
head(df)

set.seed(1) 
RF <-  randomForest(Class ~ . , data = df)
RF # OOB error: 22.53%

1 Ответ

0 голосов
/ 27 апреля 2020

Это связано с тем, что randomForest использует случайное начальное число. Он использует начальное значение для выбора предикторов в формуле во время выполнения, основываясь на положении предикторов, а не на имени. Поскольку вы используете оператор . для выбора всех столбцов в вашем фрейме данных, порядок предикторов в вызове формулы различается (в зависимости от упорядочения фрейма данных), и хотя модель выбирает одну и ту же позицию на каждой итерации, они фактически различны столбцы.

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

library(randomForest)

set.seed(123)
df <- data.frame(class = c(sample(c("a", "b", "c"), size = 100, replace = T)),
                 x = runif(100),
                 y = runif(100))

set.seed(1)
randomForest(class ~ ., data = df)
#> OOB estimate of  error rate: 75%

# Changing order of columns changes results

set.seed(1)
randomForest(class ~ ., data = df[,c(1,3,2)])
#> OOB estimate of  error rate: 70%

# But if we specify the formula, get the same result as original

set.seed(1)
randomForest(class ~ x + y, data = df[,c(1,3,2)])
#> OOB estimate of  error rate: 75%

# Keeping ordering of data frame but renaming columns doesn't change results

names(df) <- c("class", "y", "x")
set.seed(1)
randomForest(class ~ ., data = df)
#> OOB estimate of  error rate: 75%

Чтобы получить то же самое поведение каждый раз, вам нужно либо укажите формулу явно или сохраняйте тот же порядок столбцов фрейма данных.

...