【问题标题】:How to use sample_weight parameter for algorithms in sklearn如何在 sklearn 中为算法使用 sample_weight 参数
【发布时间】:2019-08-12 18:08:45
【问题描述】:

我有一个非常不平衡的数据集,我正在执行分类任务。因此,我尝试了所有算法,即(决策树、朴素贝叶斯、逻辑回归),对于每个算法,我都在 scikit learn 中遇到了一个名为 sample_weights 的参数。

假设我的数据集中有大约 10 万个正数据点和 2 万个负数据点。
即正标签的0.83 % 和负标签的0.16 %

从文档中,我假设此参数用于通过为具有较少数据点的类(即不平衡数据集)赋予更多权重来解决此类问题。

class_weight : dict 或‘balanced’,默认值:无

与 {class_label: weight} 形式的类关联的权重。如果 没有给出,所有的类都应该有一个权重。为了 多输出问题,可以在同一个中提供一个dicts列表 顺序为 y 的列。

我的问题是,对于上述不平衡数据集示例,我的理想 class_weights 应该是什么,这样我才能避免过采样或欠采样等技术?

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    权重应设置为balanced,以便对类进行训练,就好像它们是平衡的一样。

    类权重相当于随机过采样。在我看来,像SMOTE这样的智能过采样技术是比在训练过程中给样本添加权重的方法更有效的方法。

    但是,过采样技术会增加计算成本,因为模型需要在更大的数据集上进行训练(由于过采样)。另一方面,类加权对模型没有额外的计算成本。除非训练一个非常计算成本很高的模型,否则我通常更喜欢 SMOTE。

    【讨论】:

    • 我必须在整个数据集(未拆分)上使用 SMOTE 还是仅在 X_train 上使用?
    • 您应该在训练集上使用 SMOTE。执行的任何评估都应在尚未重新采样的集合上进行,否则您的结果将不可靠!
    • 您提到像sample_weight 这样的技术计算成本很高。 SMOTE 不是也在做同样的事情,即过采样吗?
    • 抱歉我写错了,我的意思是过采样的计算成本更高,因为它在更大的数据集上训练模型。样本权重不会增加计算成本,但通常它们的性能不如 SMOTE 等过采样技术。如果您的模型的计算成本不是很高,我建议您进行过采样。
    猜你喜欢
    • 2018-09-09
    • 1970-01-01
    • 2019-02-05
    • 2020-01-16
    • 2017-11-10
    • 2012-10-14
    • 2014-05-11
    • 2016-03-27
    • 2021-06-01
    相关资源
    最近更新 更多