当我有高度不平衡的数据时,我应该平衡测试集吗?
Should I balance the test set when i have highly unbalanced data?
我正在使用 Sklearn GridSearchCv
寻找随机森林的最佳参数,当应用于具有 4 classes(建筑物、植被、水和道路)的遥感数据时,问题是我的 "vegetation" class 比其他人多很多(很多我的意思是从几千到几百万)。我应该平衡我的测试数据集以获得指标吗?
我在分成训练和测试之前已经平衡了整个数据集,这意味着两个数据集以相同的方式具有相同的 classes 分布。恐怕这并不代表算法在真实数据上的性能,但它让我对每个 class 的性能有所了解。如果我使用不平衡数据,"vegetation" class 可能最终会与其他平均值混淆。
这是我做的平衡的例子,你可以看到我直接在 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))
我想最好地了解模型在真实数据上的表现,但我还没有找到决定性的答案!
处理不平衡数据的经验法则是"Never ever balance the test data"。
处理不平衡数据的流水线:
- 进行预处理
- 应用训练测试拆分(分层)。
- 平衡训练数据(通常 SMOTE 效果更好)
- 火车model/models
- 不平衡测试数据测试(显然使用f-score, Precision, Recall之类的指标)
让您得到真正的表现。
这里出现的问题是为什么不在训练测试拆分之前平衡数据?
当你在现实世界中部署时,你不能指望现实世界的数据是平衡的......
更好的方法是在第 2 步使用 K 折,并为每个折做 3、4、5 个步骤
有关详细信息,请参阅 this 文章。
我正在使用 Sklearn GridSearchCv
寻找随机森林的最佳参数,当应用于具有 4 classes(建筑物、植被、水和道路)的遥感数据时,问题是我的 "vegetation" class 比其他人多很多(很多我的意思是从几千到几百万)。我应该平衡我的测试数据集以获得指标吗?
我在分成训练和测试之前已经平衡了整个数据集,这意味着两个数据集以相同的方式具有相同的 classes 分布。恐怕这并不代表算法在真实数据上的性能,但它让我对每个 class 的性能有所了解。如果我使用不平衡数据,"vegetation" class 可能最终会与其他平均值混淆。
这是我做的平衡的例子,你可以看到我直接在 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))
我想最好地了解模型在真实数据上的表现,但我还没有找到决定性的答案!
处理不平衡数据的经验法则是"Never ever balance the test data"。 处理不平衡数据的流水线:
- 进行预处理
- 应用训练测试拆分(分层)。
- 平衡训练数据(通常 SMOTE 效果更好)
- 火车model/models
- 不平衡测试数据测试(显然使用f-score, Precision, Recall之类的指标)
让您得到真正的表现。
这里出现的问题是为什么不在训练测试拆分之前平衡数据?
当你在现实世界中部署时,你不能指望现实世界的数据是平衡的......
更好的方法是在第 2 步使用 K 折,并为每个折做 3、4、5 个步骤
有关详细信息,请参阅 this 文章。