scikit-learn多标签分类中样本权重的使用方法咨询
在多标签分类中为OneVsRest+SGDClassifier设置样本权重
好问题!在多标签分类场景下,用OneVsRestClassifier包裹SGDClassifier时传递样本权重的方式,和二分类逻辑基本一致,只需要注意数据格式的匹配即可。
核心逻辑
OneVsRestClassifier的fit方法原生支持接收sample_weight参数,它会自动把这个权重传递给每个内部的SGDClassifier实例,让每个标签对应的二分类器都能使用样本权重进行训练。
完整代码示例
下面是一个完整的实操案例,包含多标签转换、模型定义和权重传递:
from sklearn.linear_model import SGDClassifier from sklearn.multiclass import OneVsRestClassifier from sklearn.preprocessing import MultiLabelBinarizer # 准备多标签样本数据 X = [[0.0, 0.0], [1.0, 1.0], [2.0, 2.0], [3.0, 3.0]] # 原始多标签格式:每个样本可对应多个标签 y = [[0], [1], [0, 1], [1]] # 把多标签转换为scikit-learn要求的二进制矩阵格式 mlb = MultiLabelBinarizer() y_binary = mlb.fit_transform(y) # 定义样本权重:每个样本对应一个权重值(一维数组,长度等于样本数) sample_weight = [1.0, 0.5, 2.0, 1.5] # 用OneVsRestClassifier包裹SGDClassifier multi_clf = OneVsRestClassifier(SGDClassifier(loss="hinge")) # 直接在fit时传入sample_weight参数即可 multi_clf.fit(X, y_binary, sample_weight=sample_weight)
细节说明
- 一维权重(常用场景):上面示例中的
sample_weight是一维数组,每个元素对应一个样本的权重。这种情况下,每个标签对应的二分类器都会使用同一组权重训练,适合你希望给整个样本赋予统一权重的场景。 - 二维权重(特殊场景):如果需要针对不同标签给同一个样本设置不同权重,可以传递一个形状为
(样本数, 标签数)的二维数组。此时每个标签的分类器会取对应列的权重进行训练,这种需求在实际业务中相对少见。
内容的提问来源于stack exchange,提问作者klamann
相关产品推荐
相关产品推荐

