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

AMN*_*ves 4 python machine-learning random-forest scikit-learn

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

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

这是我做的平衡的例子,你可以看到我直接在 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))
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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

  1. 做预处理
  2. 应用列车测试拆分(分层)。
  3. 平衡训练数据(一般 SMOTE 效果更好)
  4. 训练模型
  5. 测试不平衡测试数据(显然使用f-scorePrecision、Recall 等指标

以便您获得实际性能。

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

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

更好的方法是在第 2 步使用 K 折叠,并为每个折叠执行 3、4、5 步

有关更多信息,请参阅这篇文章。