在 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
中使用了 formula
与 data.frame
的组合,而不是一对 x
y
。第 6 行是为了确保返回适当的格式 trainControl
.
并且,为了回答您最后一个问题:是,您可以按照您的建议将附加参数设置为 SMOTE
。
我有一个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
中使用了 formula
与 data.frame
的组合,而不是一对 x
y
。第 6 行是为了确保返回适当的格式 trainControl
.
并且,为了回答您最后一个问题:是,您可以按照您的建议将附加参数设置为 SMOTE
。