在处理不平衡数据集时,我的理解是可能的解决方案是对训练集进行二次采样或过采样。然而,测试集应该反映原始数据集的不平衡性。
问题是使用交叉验证时会发生什么。
假设我们使用 5 倍交叉验证并且使用过采样。我的理解是,例如在第一次迭代中,应该进行过采样来平衡训练集(折叠 1-4),而测试集(折叠 5)应该保持不平衡。
tidymodels 是否会自行解决这个问题?尽管我阅读了以下资源,但我仍然不清楚:
https://www.tidymodels.org/learn/models/sub-sampling/
取自第二个链接的示例
imbal_data <-
readr::read_csv("https://tidymodels.org/learn/models/sub-sampling/imbal_data.csv") %>%
mutate(Class = factor(Class))
dim(imbal_data)
table(imbal_data$Class)
library(tidymodels)
library(themis)
imbal_rec <-
recipe(Class ~ ., data = imbal_data) %>%
step_rose(Class)
library(discrim)
qda_mod <-
discrim_regularized(frac_common_cov = 0, frac_identity = 0) %>%
set_engine("klaR")
qda_rose_wflw <-
workflow() %>%
add_model(qda_mod) %>%
add_recipe(imbal_rec)
qda_rose_wflw
set.seed(5732)
cv_folds <- vfold_cv(imbal_data, strata = "Class", repeats = 5)
cls_metrics <- metric_set(roc_auc, j_index)
set.seed(2180)
qda_rose_res <- fit_resamples(
qda_rose_wflw,
resamples = cv_folds,
metrics = cls_metrics
)
collect_metrics(qda_rose_res)
tidymodels 是否会自行解决这个问题?
确实如此。 Themis 中的子采样工具设置为跳过正在预测的数据的计算。
假设事件率为 10%,n = 1000,并使用下采样。用于构建模型的数据将具有每类 100 个样本的相同类频率 (n = 200),而预测的数据将具有该折叠中的完整 100 个样本(未受影响)。