Machine learning scikit学习中处理不平衡测试集的最佳方法

Machine learning scikit学习中处理不平衡测试集的最佳方法,machine-learning,scikit-learn,Machine Learning,Scikit Learn,在scikit learn中处理不平衡测试集的最佳方法是什么 我的训练数据在两个类之间划分为70/30,样本外数据可能更接近90/10。我使用随机森林、逻辑回归和梯度推进进行分类,并关注概率输出。对于不平衡数据集,应使用ROC曲线下的面积进行模型评估。可以使用metrics.roc\u AUC\u score()找到sklearn中的AUC分数。AUC有时不能对模型进行适当的评价,因此也应考虑AUC评分(如果需要)的校准曲线。 < P>不平衡数据集,模型评价应使用ROC曲线下的面积来完成。可以使

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


我的训练数据在两个类之间划分为70/30,样本外数据可能更接近90/10。我使用随机森林、逻辑回归和梯度推进进行分类,并关注概率输出。

对于不平衡数据集,应使用ROC曲线下的面积进行模型评估。可以使用
metrics.roc\u AUC\u score()
找到sklearn中的AUC分数。AUC有时不能对模型进行适当的评价,因此也应考虑AUC评分(如果需要)的校准曲线。<不/P> < P>不平衡数据集,模型评价应使用ROC曲线下的面积来完成。可以使用
metrics.roc\u AUC\u score()
找到sklearn中的AUC分数。AUC有时不能对模型进行适当的评价,因此你也应该考虑AUC分数(如果需要的话)的校准曲线。

< P>如果使用Logistic回归,你可以尝试如下:

  • 通过将
    class\u weight=“auto”
    传递给
    LogisticRegression
    构造函数,对少数类进行过采样。您可能还需要设置
    截距\u scaling=1e3
    (或其他一些较大的值)。有关详细信息,请参阅docstring
  • 编辑:根据sklearn版本0.17“class_weight=“balanced””

  • 更改模型的截距。
    class_权重
    应确保您获得50/50分割的截距(之前的对数赔率),该截距可通过

    prior = .9
    lr.intercept_ += np.log(prior / (1 - prior)) - np.log((1 - prior) / prior)
    
  • 这一数学技巧在流行病学中很常见(或者我听说过),在流行病学中,通常有一组
    n_阳性
    病例和一个非常小的既往发病概率,但获得一个实际规模
    previor/(1-previor)*n_阳性
    的对照组的成本太高了


    其他概率模型也可以使用类似的技巧,方法是将先验知识乘以它们的输出,而不是直接将其折叠到模型中。NaiveBayes(不是一个好的概率模型,但我还是要提到它)实际上使用了一个可选的
    class\u prior
    参数。

    如果使用逻辑回归,可以尝试以下方法:

  • 通过将
    class\u weight=“auto”
    传递给
    LogisticRegression
    构造函数,对少数类进行过采样。您可能还需要设置
    截距\u scaling=1e3
    (或其他一些较大的值)。有关详细信息,请参阅docstring
  • 编辑:根据sklearn版本0.17“class_weight=“balanced””

  • 更改模型的截距。
    class_权重
    应确保您获得50/50分割的截距(之前的对数赔率),该截距可通过

    prior = .9
    lr.intercept_ += np.log(prior / (1 - prior)) - np.log((1 - prior) / prior)
    
  • 这一数学技巧在流行病学中很常见(或者我听说过),在流行病学中,通常有一组
    n_阳性
    病例和一个非常小的既往发病概率,但获得一个实际规模
    previor/(1-previor)*n_阳性
    的对照组的成本太高了

    其他概率模型也可以使用类似的技巧,方法是将先验知识乘以它们的输出,而不是直接将其折叠到模型中。NaiveBayes(不是一个好的概率模型,但我还是要提到它)实际上使用了一个可选的
    class\u prior
    参数。

    Trevor Hastine的书(免费PDF!),描述了梯度增强,如果这是你获得概率输出的方法,那么它是这项工作的一个很好的参考。与几乎所有的ML方法一样,您应该查看适当的正则化和收缩以进行纠正

    这里提到的逻辑回归提供了一些校正样本类大小的技术。LR的一个优点是,它在班级规模不平衡的情况下表现相对良好。如果你正在处理大量的数据,那么对数线性随机梯度就非常有效。我的一条经验法则是,如果可能的话,我喜欢将我的想法与老式的LR进行对比,或者--LR是关于你可以拥有的最简单的马尔可夫模型,NB是关于你可以拥有的简单贝叶斯网。通常情况下,正确调整的LR模型可以很好地缩放,并可以提供您真正想要的

    至于指标,ROC曲线给了你排名的能力,它不会告诉你你的概率被校准得有多好。有一篇叫做ICML的论文,可以给你关于ROC曲线的信息,以及关于你的概率是如何被校准的有意义的数据。或者,如果你想保持简单的图表,比如根据预测分数平衡准确度,看看事情是如何映射的,再加上ROC图表,你可能对数据指标的工作方式有了很好的了解

    当然,所有这些的关键问题是数据保持验证集和建模集分开,等等。良好的数据卫生非常重要,我认为这是你问题的核心所在。70/30对90/10。我遇到了一个类似的问题,我们的内部语料库是高度偏见的。事实上,这可以追溯到你使用专家意见,研究系统在放置真实数据时是否过度拟合,或者你是否需要修正数据以使其更加真实。您是否更关心FPs或覆盖范围?真正回答你的第一个问题可以归结为你正在尝试做什么的商业背景:预测、分类、赚钱、做家庭作业

    如果您使用prob,您可能需要重新校准您的概率。输出到另一个ML系统,我不必担心太多的重新校准,但如果它被用于某个你真的希望出现问题的地方。输出看看可能是某种贝塔曲线修正或类似等渗回归的东西

    我写了很多,但回答得很少。我老生常谈的回答是工作