【问题标题】:How to understand sample_weight in sklearn.metrics?如何理解 sklearn.metrics 中的 sample_weight?
【发布时间】:2019-01-08 13:45:57
【问题描述】:

我们在评估模型时需要设置 sample_weight 吗?现在我已经训练了一个关于分类的模型,但是数据集是不平衡的。当我用 compute_sample_weight('balanced') 设置 sample_weight 时,分数非常好。精度:0.88,召回率:0.86 对于“1”类。 但是如果我不设置sample_weight,分数会很差。精度:0.85,召回率:0.21。 sample_weight 会破坏原始数据分布吗?

【问题讨论】:

    标签: machine-learning scikit-learn


    【解决方案1】:

    样本权重参数仅在训练期间使用。

    假设您有一个数据集,其中 16 个点属于“0”类,4 个点属于“1”类。

    如果没有这个参数,在优化过程中,它们的损失计算权重为 1:它们对模型最小化的损失的贡献相同。这意味着 80% 的损失是由于“0”类点造成的,20% 是由于“1”类点造成的。

    通过将其设置为“平衡”,scikit-learn 将自动计算分配给“0”类和“1”类的权重,这样 50% 的损失来自“0”类,50% 来自“1”类”。

    此参数会影响您需要用来将“0”类预测与“1”类预测分开的“最佳阈值”,并且还会影响模型的性能。

    【讨论】:

    • 所以我们只需要设置 sample_weight 或使用不平衡学习方法来训练我们的模型?那为什么sklearn在metrics中设置这个参数呢?我认为当我们想要检查我们的分数时设置它不是一个好主意。我们会被这些“虚假”分数误导。
    • 在训练期间使用这个参数会给你一个不同的模型(就像大多数超参数一样)。在评估期间,某些函数确实接受“样本权重”或“类权重”参数(例如 f1-score),这将改变它们计算性能的方式。由您来选择最适合您的目标的指标(您打算对模型做什么)(准确度 vs F1 分数 vs auc ...)这些不是“错误”分数,它们因不同而不同意义
    • 采样权重不仅用于训练,还用于验证/测试。尤其是当我们将不同测试集上的多个模型与 pr AUC 等指标进行比较时,通常需要平衡测试集。
    【解决方案2】:

    这是我的理解:sample_weight 本身与平衡或不平衡无关,它只是反映样本数据分布的一种方式。所以基本上下面两种表达方式是等价的,而表达1在空间复杂度上肯定更高效。这个“sample_weight”与任何语言的任何其他统计包一样,并且与随机抽样无关

    表达式 1

    X = [[1,1],[2,2]]
    y = [0,1]
    sample_weight = [1000,2000]  # total 3000
    

    表达式 2

    X = [[1,1],[2,2],[2,2],...,[1,1],[2,2],[2,2]] # total 300 rows
    y = [0,1,1,...,0,1,1]
    sample_weight = [1,1,1,...,1,1,1]  # or just set as None
    

    【讨论】:

      猜你喜欢
      • 2019-10-09
      • 2019-09-18
      • 2018-05-04
      • 1970-01-01
      • 2023-01-24
      • 2012-10-14
      • 1970-01-01
      • 2017-05-07
      • 2020-08-03
      相关资源
      最近更新 更多