如何理解sklearn.metrics中的sample_weight?

5
我们在评估模型时需要设置样本权重吗?现在我训练了一个分类模型,但数据集是不平衡的。当我使用compute_sample_weight('balanced')设置样本权重时,得分非常好。'1'类的精度为0.88,召回率为0.86。 如果我不设置样本权重,得分会很差。精度为0.85,召回率为0.21。 样本权重会破坏原始数据分布吗?
2个回答

0
这是我的理解: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

0

样本权重参数仅在训练过程中使用。

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

如果没有此参数,在优化过程中,它们的损失计算权重为1:它们对模型正在最小化的损失的贡献相等。这意味着80%的损失归因于类别“0”的点,20%的损失归因于类别“1”的点。

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

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


那么我们只需要设置sample_weight或使用imbalanced-learn方法来训练我们的模型吗?那么为什么sklearn在度量中设置了这个参数呢?我认为在我们想要检查分数时设置它不是一个好主意。我们会被这些“虚假”的分数误导。 - cao xiangyu
1
使用这个参数进行训练会得到一个不同的模型(大多数超参数也是如此)。在评估过程中,确实有一些函数接受“样本权重”或“类别权重”参数(例如f1-score),这将改变它们计算性能的方式。由你选择最适合你目标(你打算用这个模型做什么)的度量标准(准确率vs F1分数vs auc…) 这些不是“错误”的分数,它们有不同的含义。 - Florian Mutel
5
采样权重不仅在训练过程中使用,而且在验证/测试中也同样适用。特别是当我们使用pr AUC等指标在不同的测试集上比较多个模型时,平衡测试集通常是必要的。 - Random Certainty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接