在 CARET k 折交叉验证分类中更改 SMOTE 参数

Change SMOTE parameters inside CARET k-fold cross-validation classification

我有一个class化问题,有一个非常偏斜的 class 来预测(例如 90% / 10% 不平衡的二元变量来预测)。

为了解决这个问题,我想使用 SMOTE 方法对这个 class 变量进行过采样。但是,正如我在此处阅读的那样 (http://www.marcoaltini.com/blog/dealing-with-imbalanced-data-undersampling-oversampling-and-proper-cross-validation),最佳做法是在 k 折循环内使用 SMOTE 以避免过度拟合。

因为我正在使用 caret 包来执行我的分析,所以我指的是这个 link (http://topepo.github.io/caret/sampling.html)。除了最后一部分解释如何更改 SMOTE 参数外,我完全理解所有内容:

smotest <- list(name = "SMOTE with more neighbors!",
            func = function (x, y) {
              library(DMwR)
              dat <- if (is.data.frame(x)) x else as.data.frame(x)
              dat$.y <- y
              dat <- SMOTE(.y ~ ., data = dat, k = 10)
              list(x = dat[, !grepl(".y", colnames(dat), fixed = TRUE)],
                   y = dat$.y)
              },
            first = TRUE)

我根本不明白这一点。有人关心解释吗?假设我想包含 SMOTE 参数 perc.over、k 和 perc.under,我该怎么做?

非常感谢。

编辑:

实际上我意识到我可能只是在上面函数的 "SMOTE" 表达式中添加这些参数,例如这会给出类似的东西:

smotest <- list(name = "SMOTE with more neighbors!",
            func = function (x, y) {
              library(DMwR)
              dat <- if (is.data.frame(x)) x else as.data.frame(x)
              dat$.y <- y
              dat <- SMOTE(.y ~ ., data = dat, k = 10, perc.over = 1200, perc.under = 100)
              list(x = dat[, !grepl(".y", colnames(dat), fixed = TRUE)],
                   y = dat$.y)
              },
            first = TRUE)

我不确定您是否理解了您不理解的内容,但这里试图阐明这段代码中完成的内容。

smotest 对象被创建为列表,因为它是 trainControl 函数的参数 sampling 必须表示的方式。此列表的第一个元素是仅用于显示目的的 name。第二个 func 是实际的采样函数。第三个,first,是一个逻辑值,表示samplin是否必须在预处理步骤之前或之后进行。

元素func在这里只是SMOTE函数的包装。在这个包装器中,第 3 行在这里是因为只能将 data.frame 传递给 SMOTE 函数。添加第 4 行是因为在 SMOTE 中使用了 formuladata.frame 的组合,而不是一对 x y。第 6 行是为了确保返回适当的格式 trainControl.

并且,为了回答您最后一个问题:,您可以按照您的建议将附加参数设置为 SMOTE