我有一个类别不平衡的问题,想使用成本敏感学习来解决。
- 欠采样和过采样
- 为类别分配权重,使用修改后的损失函数
这是类似的概念,但是使用sample_weights可以强制评估器更多地关注一些样本,而使用class_weights可以强制评估器学习并关注某个特定类别。当sample_weight=0或class_weight=0时,评估器基本上不需要考虑这些样本/类别在学习过程中的影响。因此,分类器(例如)将永远不会预测某个类别,如果该类别的class_weight = 0。如果某些sample_weight/class_weight比其他样本/类别的sample_weight/class_weight大,评估器将首先尝试在那些样本/类别上最小化误差。您可以同时使用用户定义的sample_weights和class_weights。
如果您想使用简单的克隆/删除来对训练集进行欠采样/过采样-这将等同于增加/减少相应的sample_weights/class_weights。
在更复杂的情况下,您还可以尝试使用像SMOTE这样的技术人工生成样本。
clf.fit(X, y, sample_weight=None)[source]
和scikit文档说:每个样本的权重。每个样本重新缩放C。更高的权重会迫使分类器更加强调这些点。
我不明白在这段代码中应该写入哪些值:sample_weight = {0:.01, 1:.90}
或者它必须是一个向量吗?如果是,怎么做? - Chucksample_weight
和class_weight
有类似的功能,即使你的估算器更加关注某些样本。
实际样本权重将为sample_weight * class_weight中的权重
。
这与欠采样/过采样具有相同的目的,但行为可能不同:假设您有一个随机选择样本的算法(如随机森林),则是否进行过采样或欠采样很重要。
总之:
class_weight
和sample_weight
都执行2)的功能,选项2)是处理类别不平衡的一种方法。 我不知道普遍推荐的方法,我会尝试在您特定的问题上尝试1)、2)和1)+2),以查看哪种方法最有效。
clf.fit(X, y, sample_weight=None)[source]
和scikit文档说:每个样本的权重。每个样本重新缩放C。更高的权重会迫使分类器更加强调这些点。
我不明白在这段代码中应该写什么值:sample_weight = {0:.01, 1:.90}
或者它必须是一个向量吗?如果是,怎么做? - Chucksklearn
中并不是所有的函数或指标都提供两个参数。如果你有一个二元分类器,并且真的需要通过sample_weight
来平衡类别,因为该指标不接受class_weight
(不确定是否存在这种情况,但以防万一...),那么你可以使用compute_sample_weight(class_weight='balanced', y=y_true)
从sklearn.utils.class_weight
中获取平衡类别的样本权重。compute_sample_weight
方法可以实现这一功能。