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

标签 python machine-learning scikit-learn random-forest

我正在使用 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))

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

最佳答案

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

  1. 进行预处理
  2. 应用训练测试拆分(分层)。
  3. 平衡训练数据(通常 SMOTE 效果更好)
  4. 火车模型
  5. 对不平衡测试数据进行测试(显然使用 f-scorePrecision, Recall 等指标)

以便您获得实际性能。

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

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

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

引用this文章了解更多信息。

关于python - 当我有高度不平衡的数据时,我应该平衡测试集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55921286/

相关文章:

python - 将 Python 列表转换为多列 Pandas Dataframe

python - 如何在 python 中为 t-SNE 添加标签

python - 使用 pandas 的 Silhouette_score 的正确数据格式

python - 导入 scikit-learn 时出错

python - sql查询不返回任何内容

python - 如何限制 djangoamba 查询中的响应大小

javascript - DropzoneJS XHR 发送选项请求

python - 输入层在分层注意网络中代表什么

machine-learning - 在Weka中使用utf-8 arff文件时无法确定结构为arff

python - LabelEncoder() 对于相同的输入返回不同的值?