我有4个类别的数据,我正在尝试构建一个分类器。我有一个类的〜1000个 vector ,另一个类有〜10 ^ 4,第三类有〜10 ^ 5,第四类有〜10 ^ 6。我希望使用交叉验证,所以我看了看scikit-learn docs

我的第一个尝试是使用StratifiedShuffleSplit,但这为每个类提供了相同的百分比,从而使类之间仍然严重不平衡。



附带说明一下,我无法弄清StratifiedShuffleSplitStratifiedKFold之间的区别。描述看起来和我非常相似。

最佳答案


我感觉到您混淆了分层策略的作用,但是您需要显示代码和结果以确认发生了什么(与原始设置相同的百分比,或相同的百分比)。返还的火车/测试集中的百分比?第一个是应该的样子)。

其中之一绝对可以工作。第一个的描述肯定有点困惑,但是这就是它们的作用。
分层洗牌拆分

这意味着它将数据拆分为训练和测试集。分层部分意味着在此拆分的中将保留百分比。因此,如果数据的10%在1类中,而90%在2类中,则将确保火车组的10%在1类中,而90%在2类在中。测试集相同。
您的帖子听起来好像您想要测试集中每个类的50%。分层并非如此,分层保持原始百分比。您应该维护它们,因为否则您将对分类器的性能不了解:谁在乎它如何分类50/50拆分,而在实践中您会看到10/90拆分吗?
分层KFold

参见k-fold cross validation。没有分层,它只是将您的数据分成k折叠。然后,每个折叠1 <= i <= k一次用作测试集,而其他折叠用于训练。最后将结果平均。这类似于运行ShuffleSplit k时间。
分层将确保每个数据类别中每个类别在整个数据中所占的百分比相同(或非常接近)。

有很多关于类(class)不平衡的文献。一些简单易用的方法涉及使用类权重并分析ROC曲线。我建议以下资源作为起点:

  • A scikit-learn example of using class weights
  • A quora question about implementing neural networks for imbalanced data
  • This stats.stackexchange question with more in-depth answers
  • 关于python - 具有不平衡类的k倍分层交叉验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32615429/

    10-10 20:24