当我有高度不平衡的数据时,我应该平衡测试集吗?

Posted

技术标签:

【中文标题】当我有高度不平衡的数据时,我应该平衡测试集吗?【英文标题】:Should I balance the test set when i have highly unbalanced data? 【发布时间】:2019-09-19 03:16:06 【问题描述】:

我正在使用 Sklearn GridSearchCv 来寻找随机森林的最佳参数,当应用于具有 4 类(建筑物、植被、水和道路)的遥感数据时,问题是我有更多的“植被”类比其他的(我的意思是从几千到几百万的差异)。我应该平衡我的测试数据集以获得指标吗?

在我分成训练和测试之前,我已经平衡了整个数据集,这意味着两个数据集以相同的方式具有相同的类分布。恐怕这并不代表算法在真实数据上的表现,但它让我了解了每个类的表现。如果我使用不平衡的数据,“植被”类最终可能会与其他平均值混淆。

这是我做的平衡的例子,你可以看到我直接在 X 和 y 上做。哪些是完整的数据和标签。

if balance:
    smt = RandomUnderSampler(sampling_strategy='auto')
    X, y = smt.fit_sample(X, y)
    print("Features array shape after balance: " + str(X.shape))

我想对模型在真实数据上的表现有最好的了解,但我还没有找到确切的答案!

【问题讨论】:

您好!一般来说,训练集应该是平衡的,否则你的准确性会大幅下降。关于测试/验证集,这不是必需的,但在拆分为训练/验证/测试之前平衡该集可能更容易。我明白您关于不切实际数据的观点,但是如果您使用混淆矩阵研究准确性,您会立即看到较小类别的准确性在数据集不平衡时显着下降 @nickthefreak 没错!我最终可能会尝试平衡和不平衡测试/验证这两种方法,看看效果。 【参考方案1】:

处理不平衡数据的经验法则是“永远不要平衡测试数据”。 处理不平衡数据的管道:

    进行预处理 应用训练测试拆分(分层)。 平衡训练数据(通常 SMOTE 效果更好) 训练模型/模型 对不平衡测试数据进行测试(显然使用f-score、Precision, Recall等指标)

这样你才能得到实际的表现。

这里出现的问题是为什么不在训练测试拆分之前平衡数据?

当你在现实世界中进行部署时,你不能期望现实世界的数据是平衡的……

更好的方法是在第 2 步使用 K-fold 并为每个折叠做 3,4,5 步

请参阅this 文章了解更多信息。

【讨论】:

正如我所说,我使用 GridSearchCV 超过 5 折,使用平衡版本的训练集,我是否应该担心测试折也是平衡的? 我在训练集中进行了 5 倍拆分 (80:20)。我对“内部”训练集进行 SMOTE 并保持 20% 的验证集不变,以便在进行超参数调整(hyperopt 或 gridsearch)时表示测试集。然后我在测试集上进行测试。

以上是关于当我有高度不平衡的数据时,我应该平衡测试集吗?的主要内容,如果未能解决你的问题,请参考以下文章

我应该平衡测试集以评估模型吗? [关闭]

这个代码应该改变啥才能正确识别平衡树?

在使用 5 折交叉验证时,在高度不平衡的数据中混淆 F1 分数和 AUC 分数

具有高度不平衡的多标签分类中的损失曲线

如何评估高度不平衡数据的准确性(使用朴素贝叶斯模型)?

在 sklearn 中使用样本和类权重