在scikit-learn中处理不平衡测试集的最佳方法是什么?
我的训练数据在两个班级之间分成70/30,因为样本外的数据可能更像是90/10。我使用随机森林,逻辑回归和梯度增强来分类和关注概率输出。
答案 0 :(得分:4)
如果您使用逻辑回归,则可以尝试以下操作:
class_weight="auto"
传递给LogisticRegression
构造函数来对少数类进行过采样。您可能还想设置intercept_scaling=1e3
(或其他一些大值)。有关详细信息,请参阅docstring。编辑:根据sklearn版本0.17'class_weight =“balanced”'。
更改模型的截距。 class_weight
应该确保您获得50/50分割的截距(对数之前的分数),可以通过
prior = .9
lr.intercept_ += np.log(prior / (1 - prior)) - np.log((1 - prior) / prior)
这种数学技巧在流行病学中很常见(或者我被告知),通常你会有一组n_positive
病例和一个非常小的疾病概率,但是得到一个实际大小的对照组prior / (1 - prior) * n_positive
非常昂贵。
类似的技巧可以通过将先验乘以其输出而与其他概率模型一起使用,而不是直接将其折叠到模型中。 Naive Bayes(不是一个好的概率模型,但无论如何我都会提到它)实际上是一个可选的class_prior
参数。
答案 1 :(得分:2)
此处提到的逻辑回归提供了一些纠正样本类大小的技术。关于LR的一个好处是它具有相对良好的表现,具有不平衡的类大小。如果您正在处理大量数据,那么对数线性随机梯度法则可以很好地工作。我的经验法则是,在可能的情况下,我喜欢对我的想法进行检查并对照老式的LR或Naive Bayes - LR是关于你可以拥有的最简单的马尔可夫模型而NB是关于你可以拥有的简单贝叶斯网络。通常情况下,正确调整的LR模型可以很好地扩展,并且可以为您提供您真正想要的东西。
对于指标,ROC曲线为您提供排名能力,但不能告诉您校准概率的程度。有一篇名为Bier Curves的ICML论文可以为您提供有关ROC曲线的信息,以及有关如何校准概率的有意义的数据。或者,如果你想保持简单的图表,比如你的预测分数的平衡准确度,看看事物的映射方式,以及ROC图表,你可能很清楚你的数据指标如何运作。
当然,所有这些的关键问题是数据保持您的验证集和建模集分离等。良好的数据卫生真的是核心,我认为比任何东西都更重要的是核心你的问题是。 70/30 vs 90/10。我遇到了类似的问题,我们的内部语料库非常偏向。实际上,这可以追溯到你使用专家意见和研究系统是否过度拟合,如果放置真实数据或者你需要修复数据以使其更加真实。您是否更关注FP或覆盖范围?真正回答你的第一个问题归结为你要做的事情的商业背景:预测,分类,赚钱,做作业。
如果您使用的是prob,您可能需要重新校准概率。输出到另一个ML系统我不必担心重新校准,但如果它用在你真正期望的概率。输出可能会看到某种类型的Beta曲线校正或类似等渗回归。
我写了很多,但答案很少。我的陈词滥调将是从一些优秀的例子开始,并针对梯度下降(对数线性)示例或LogisticRegression类来解决您的解决方案。对于您的验证,您需要一个包含概率校准和排名的度量标准...我会说生成AUC和类似于样本概率的偏差。这至少是一个开始。研究你的数据,看看你是否满意,你是否正确的方向。
我希望这有帮助。
答案 2 :(得分:0)
对于不平衡数据集,应使用ROC曲线下的区域进行模型评估。可以使用metrics.roc_auc_score()
找到sklearn中的AUC分数。 AUC有时无法对模型进行适当的评估,因此您还应该考虑校准曲线以及auc分数(如果需要)。
答案 3 :(得分:0)