在scikit-learn中处理不平衡测试集的最佳方法

时间:2014-03-24 03:56:08

标签: machine-learning scikit-learn

在scikit-learn中处理不平衡测试集的最佳方法是什么?

我的训练数据在两个班级之间分成70/30,因为样本外的数据可能更像是90/10。我使用随机森林,逻辑回归和梯度增强来分类和关注概率输出。

4 个答案:

答案 0 :(得分:4)

如果您使用逻辑回归,则可以尝试以下操作:

  1. 通过将class_weight="auto"传递给LogisticRegression构造函数来对少数类进行过采样。您可能还想设置intercept_scaling=1e3(或其他一些大值)。有关详细信息,请参阅docstring。
  2. 编辑:根据sklearn版本0.17'class_weight =“balanced”'。

    1. 更改模型的截距。 class_weight应该确保您获得50/50分割的截距(对数之前的分数),可以通过

      分成90/10分割的截距
      prior = .9
      lr.intercept_ += np.log(prior / (1 - prior)) - np.log((1 - prior) / prior)
      
    2. 这种数学技巧在流行病学中很常见(或者我被告知),通常你会有一组n_positive病例和一个非常小的疾病概率,但是得到一个实际大小的对照组prior / (1 - prior) * n_positive非常昂贵。

      类似的技巧可以通过将先验乘以其输出而与其他概率模型一起使用,而不是直接将其折叠到模型中。 Naive Bayes(不是一个好的概率模型,但无论如何我都会提到它)实际上是一个可选的class_prior参数。

答案 1 :(得分:2)

Hastie的书,The Elements of Statistical Learning(免费PDF!),描述渐变增强是这项工作的一个很好的参考,如果这是获得概率输出的方法。与几乎任何ML方法一样,您应该查看适当的正则化和收缩以纠正overfitting and bias

此处提到的逻辑回归提供了一些纠正样本类大小的技术。关于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)

scikit-learn包在武器库中有一些可以解决类失衡的问题。 例如,默认情况下,sklearn.model_selection.GridSearchCV具有以下拆分机制:“对于整数/无输入,如果估计器是分类器,y是二进制或多类,则使用StratifiedKFold”。 “折叠是通过保留每个类别的样本百分比来实现的。” 因此,当您通过GridSearchCV交叉验证时,每个折叠中的类总是与所有数据中的相同比例。 可能这会以某种方式帮助你。