Вернуть каретку предварительной обработки преобразования

Я преобразовал данные, чтобы удовлетворить требования линейной модели (нормально распределенной):

d.reg1 = d.reg %>% preProcess("YeoJohnson") %>% predict(d.reg) 

Скорректированная модель:

fit = lm(log10(Qmld)~log10(Peq750), data = d.reg1) #potential regression

Прогнозируемые данные:

a=10^fit$coefficients[1]
b=fit$coefficients[2]

d.reg1$Qmld_predita=a*d.reg1$Peq750^b 

Как я мог отменить преобразование d.reg1$Qmld_predita, если модель была приспособлена к преобразованным данным, и это не имеет для меня физического значения?


person Arthur Calegario    schedule 07.07.2017    source источник
comment
Я не понимаю, что вы спрашиваете. Вы спрашиваете, что является обратной функцией log10()? Я также не уверен, почему вы не используете predict() со своей скорректированной моделью. Возможно, было бы полезно, если бы вы включили правильный воспроизводимый пример с образец входных данных, чтобы мы могли запустить код и протестировать его.   -  person MrFlick    schedule 07.07.2017
comment
Также имейте в виду, что предположение о нормальном распределении обычно основано на члене ошибки (которое мы проверяем с помощью остатков), поэтому вам действительно не следует проверять это до тех пор, пока вы не подберете модель.   -  person Dason    schedule 07.07.2017


Ответы (2)


Вот модель функции, которую можно изменить на основе выбранных начальных преобразований (например, здесь начальными преобразованиями были c("scale", "center").

library(tidyverse)

revPredict <- function(preproc, data, digits=0) {
  data %>%
    select(one_of(preproc$mean %>% names)) %>%
    map2_df(preproc$std, ., function(sig, dat) dat * sig) %>%
    map2_df(preproc$mean, ., function(mu, dat) dat + mu)
}

revPredict(preprocess_params, df_needing_reverse_transformation)

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


Чтобы округлить значения, направьте вывод второго map2_df на это:

    mutate_if(is.numeric,funs(round(.,digits = digits)))
person saladi    schedule 25.01.2018
comment
Значит, каре не применяет предварительную обработку к каждому тренировочному набору независимо? Я думал, что это необходимо, чтобы избежать утечки информации, но из вашего поста кажется, что все данные масштабируются и центрируются вместе. Я предполагал, что будет одно среднее значение и одно стандартное отклонение для каждой переменной И каждого тренировочного/тестового набора. - person Giovanni Colitti; 24.07.2019
comment
Не уверен, как это будет работать, если вы предварительно обработаете свое обучение и тестирование отдельно, но в этом примере SO параметры предварительной обработки вычисляются один раз для d.reg, а затем могут использоваться. - person saladi; 25.07.2019

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

revPredict <- function(preproc, data,digits=0,range = F) {
   if (range == T){
     data<-data %>%
       select(one_of(dimnames(preproc$ranges)[[2]])) %>%
       map2_df(preproc$ranges[2,]-preproc$ranges[1,], ., function(min_max, dat) min_max* dat)  %>%
       map2_df(preproc$ranges[1,], ., function(min, dat) min + dat) %>%
      mutate_if(is.numeric,funs(round(.,digits = digits)))
    return(data)
    }
  data<- data %>%
    select(one_of(names(preproc$mean))) %>%
    map2_df(preproc$std, ., function(sig, dat) dat * sig)  %>%
    map2_df(preproc$mean, ., function(mu, dat) dat + mu) %>%
    mutate_if(is.numeric,funs(round(.,digits = digits)))
  return(data)
}
person Andrew Troiano    schedule 05.05.2018