Scikit learn 如何在scikit learn中为OneVsRestClassifier设置类权重?

Scikit learn 如何在scikit learn中为OneVsRestClassifier设置类权重?,scikit-learn,Scikit Learn,我需要一个SVM作为多标签分类器,所以我决定使用OneVsRestClassifier包装器。然而,问题出现了,训练集变得非常不平衡:对于一个给定的班级,负面的例子比正面的多得多。这可以通过class_weight参数来解决,但如果我在OneVsRestClassifier包装的分类器中使用它,我会得到一个错误: from sklearn.svm import LinearSVC from sklearn.multiclass import OneVsRestClassifier weight

我需要一个SVM作为多标签分类器,所以我决定使用OneVsRestClassifier包装器。然而,问题出现了,训练集变得非常不平衡:对于一个给定的班级,负面的例子比正面的多得多。这可以通过class_weight参数来解决,但如果我在OneVsRestClassifier包装的分类器中使用它,我会得到一个错误:

from sklearn.svm import LinearSVC
from sklearn.multiclass import OneVsRestClassifier

weights = {'ham': 1, 'eggs': 2}
svm = OneVsRestClassifier(LinearSVC(class_weight=weights))

X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
Y = [['ham'], [], ['eggs', 'spam'], ['spam'], ['eggs']]

svm.fit(X, Y)

问题是LinearSVC需要二进制类[0,1]。因此,为非二进制类(“ham”、“egg”甚至[0,1,2])指定权重是失败的。 但是您可以使用“自动”权重,它通过选择适当的权重自动“平衡”您的类。然后,它也将适用于您的多类OneVsRest分类器

svm = OneVsRestClassifier(LinearSVC(class_weight='auto'))

X = [[1, 2], [3, 4], [5, 4]]
Y = [0,1,2]

svm.fit(X, Y)

那很有效,谢谢你!我不知道有一个“自动”选项。有没有办法在一个VSRESTClassifier中分别为每个标签指定样本重量?由于GradientBoostingClassifier没有class_权重选项,因此需要为不平衡数据指定样本权重。
svm = OneVsRestClassifier(LinearSVC(class_weight='auto'))

X = [[1, 2], [3, 4], [5, 4]]
Y = [0,1,2]

svm.fit(X, Y)