Как понять аргументы «данные» и «подмножество» в пакете randomForest R?

#r #random-forest

#r #случайный лес

Вопрос:

Аргументы

  • data : необязательный фрейм данных, содержащий переменные в модели. По умолчанию переменные берутся из среды, из которой вызывается randomForestis

  • subset : вектор индекса, указывающий, какие строки следует использовать. (ПРИМЕЧАНИЕ: Если задан, этот аргумент должен быть назван.)

Мои вопросы:

  1. Почему data аргумент «необязательный»? Если data это необязательно, откуда берутся обучающие данные? И что именно означает «По умолчанию переменные берутся из среды, из которой вызывается randomForestis»?

  2. Зачем нам нужен subset параметр? Допустим, у нас есть iris набор данных. Если я хочу использовать первые 100 строк в качестве обучающего набора данных, я просто выбираю training_data <- iris[1:100,] . Зачем беспокоиться? В чем преимущество использования subset ?

Ответ №1:

  1. Это не редкая методология, и, конечно, не уникальная для randomForests .

     mpg <- mtcars$mpg
    disp <- mtcars$disp
    lm(mpg~disp)
    # Call:
    # lm(formula = mpg ~ disp)
    # Coefficients:
    # (Intercept)         disp  
    #    29.59985     -0.04122  
      

    Итак, когда lm (в данном случае) пытается разрешить переменные, на которые ссылаются в формуле, mpg~disp , он просматривает, data если они предоставлены, то в вызывающей среде. Дополнительный пример:

     rm(mpg,disp)
    mpg2 <- mtcars$mpg
    lm(mpg2~disp)
    # Error in eval(predvars, data, env) : object 'disp' not found
    lm(mpg2~disp, data=mtcars)
    # Call:
    # lm(formula = mpg2 ~ disp, data = mtcars)
    # Coefficients:
    # (Intercept)         disp  
    #    29.59985     -0.04122  
      

    (Обратите внимание, что этого mpg2 нет в mtcars , поэтому для поиска данных использовались оба метода. Я не использую эту функциональность, предпочитая отказоустойчивый этап предоставления всех данных в вызове; нетрудно придумать примеры, когда воспроизводимость страдает, если это не так.

  2. Аналогичным образом, многие похожие функции (включая lm ) допускают этот subset= аргумент, поэтому тот факт, что randomForests он включает, является согласованным. Я считаю, что это просто аргумент удобства, поскольку следующие примерно эквивалентны:

     lm(mpg~disp, data=mtcars, subset= cyl==4)
    
    lm(mpg~disp, data=mtcars[mtcars$cyl == 4,])
    
    mt <- mtcars[ mtcars$cyl == 4, ]
    lm(mpg~disp, data=mt)
      

    Использование subset позволяет немного упростить обращение ( cyl по сравнению mtcars$cyl с), и его полезность усугубляется, когда увеличивается количество переменных, на которые ссылаются (т. Е. для целей «code golf»). Но это также можно было бы сделать с помощью других механизмов, таких как with , так что … в основном личные предпочтения.

Редактировать: как указал джоран, randomForest (и другие, но, в частности, не lm ) могут быть вызваны либо с помощью формулы, в которой вы обычно используете аргумент data, либо путем указания аргументов predictor / response отдельно с аргументами x и y , как в следующих примерах, взятых из ?randomForest (игнорируйте другие аргументы, которые несовместимы):

 iris.rf <- randomForest(Species ~ ., data=iris, importance=TRUE, proximity=TRUE)
iris.rrf <- randomForest(iris[-1], iris[[1]], ntree=101, proximity=TRUE, oob.prox=FALSE)
  

Комментарии:

1. Также может быть полезно подчеркнуть, что randomForsest может вызываться либо с помощью формулы, в которой вы обычно используете data аргумент, либо путем указания аргументов предиктора / ответа отдельно с аргументами x и y .

2. @r2evans Спасибо вам! Очень четкие ответы. Теперь я понимаю.