Регрессия с новыми уровнями факторов в тестовом наборе — как изящно игнорировать ошибку

Может ли R каким-либо образом «изящно» игнорировать ошибки, которые обычно приводят к полному сбою прогноза, когда в тестовом наборе появляются новые уровни факторов? Обычно, если есть только одно неверное значение, вся операция не работает.

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

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

  library(randomForest)
  df=mtcars
  df$vs=99
  df[1,8]=0  # vs column
  df$vs=factor(df$vs)
  mtcars$vs=factor(mtcars$vs)

  fit=lm(mpg~., data=mtcars)
   # fit above works with explanation given below, but fit2 fails with randomforest?  why?
  fit2 = randomForest(mpg~., data=mtcars)
   df$help=predict(fit, df)   #  first row should work others should error gracefully maybe with a NA?

Первый ответ, который я получил, был отличным. Тем не менее, это все еще не работает для менее упрощенного примера с randomForest выше.


person runningbirds    schedule 16.02.2016    source источник


Ответы (1)


Вы можете использовать tryCatch, чтобы вернуть NA при прогнозировании.

Для одной строки:

tryCatch(predict(fit, bad_df[1,]), 
                           error=function(e) NA))

Для всех рядов:

sapply(1:nrow(bad_df), 
           function(i) 
               tryCatch(predict(fit, bad_df[i,]), 
                           error=function(e) NA))

Альтернативой является изменение набора данных. По сути, факторы в вашем наборе данных, которые не соответствуют вашему объекту fit, устанавливаются равными NA:

for(i in 1:length(fit$xlevels)) {
  bad_values = which(!(bad_df[,names(fit$xlevels)[i]] %in% fit$xlevels[[i]]))
  bad_df[, bad_values] = NA
}
person csgillespie    schedule 16.02.2016