'SMOTE within a recipe versus SMOTE in trainControl

I am trying to understand where exactly SMOTE-ing should occur when training a model with cross-validation. I understand that all pre-processing steps should occur for each fold of cross-validation. So does that mean the following two set ups are identical and theoretically correct?

SET UP 1: Use recipes to pre-process, smote within trainControl

set.seed(888, sample.kind = "Rounding")
tr_ctrl <- trainControl(summaryFunction = twoClassSummary, 
                        verboseIter = TRUE, 
                        savePredictions =  TRUE, 
                        sampling = "smote", 
                        method = "repeatedCV", 
                        number= 2, 
                        repeats = 0,
                        classProbs = TRUE, 
                        allowParallel = TRUE, 
                        )
cw_smote_recipe <- recipe(husb_beat ~ ., data = nfhs_train) %>%
  step_nzv(all_predictors()) %>%               
  step_naomit(all_predictors()) %>%
  step_dummy(all_nominal(), -husb_beat) %>%
  step_interact(~starts_with("State"):starts_with("wave"))%>%
  step_interact(~starts_with("husb_drink"):starts_with("husb_legal"))
  

cw_logit1 <- train(cw_smote_recipe, data = nfhs_train,
                            method = "glm",
                            family = 'binomial',
                            metric = "ROC",
                            trControl = tr_ctrl)

SET UP 2: Use recipes to pre-process AND smote : DOES THIS SMOTE WITHIN EACH CV FOLD??

set.seed(888, sample.kind = "Rounding")
tr_ctrl <- trainControl(summaryFunction = twoClassSummary, 
                        verboseIter = TRUE, 
                        savePredictions =  TRUE, 
                        #sampling = "smote", ## NO LONGER WITHIN TRAINCONTROL
                        method = "repeatedCV", 
                        number= 2, 
                        repeats = 0,
                        classProbs = TRUE, 
                        allowParallel = TRUE, 
                        )
smote_recipe <- recipe(husb_beat ~ ., data = nfhs_train) %>%
  step_nzv(all_predictors()) %>%               
  step_naomit(all_predictors()) %>%
  step_dummy(all_nominal(), -husb_beat) %>%
  step_interact(~starts_with("State"):starts_with("wave"))%>%
  step_interact(~starts_with("husb_drink"):starts_with("husb_legal"))%>%
  step_smote(husb_beat) ## NEW STEP TO RECIPE

  

cw_logit2 <- train(smote_recipe, data = nfhs_train,
                            method = "glm",
                            family = 'binomial',
                            metric = "ROC",
                            trControl = tr_ctrl)

TIA!



Solution 1:[1]

Class imbalanced data should be treated with precautions, we proved that many SMOTE variants methods provide fake examples to increase the performance of the system on paper, but in reality, it is a different story because most of these synthesized examples are majority examples and forced to be minority due to their similarities, please find our new study at: https://ieeexplore.ieee.org/document/9761871

Oversampling in its current forms and methodologies is unreliable for learning from class imbalanced data and should be avoided in real-world applications.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Ahmad Hassanat