Python 为多标签SVM分配权重以平衡类

Python 为多标签SVM分配权重以平衡类,python,machine-learning,scikit-learn,svm,Python,Machine Learning,Scikit Learn,Svm,这是怎么做到的?我正在使用SKL学习训练SVM。我的课不均衡。请注意,我的问题是多类、多标签,因此我使用OneVsRestClassifier: mlb = MultiLabelBinarizer() y = mlb.fit_transform(y_train) clf = OneVsRestClassifier(svm.SVC(kernel='rbf')) clf = clf.fit(x, y) pred = clf.predict(x_test) 我可以在某个地方添加一个“sample

这是怎么做到的?我正在使用SKL学习训练SVM。我的课不均衡。请注意,我的问题是多类、多标签,因此我使用OneVsRestClassifier:

mlb = MultiLabelBinarizer()
y = mlb.fit_transform(y_train)

clf = OneVsRestClassifier(svm.SVC(kernel='rbf'))
clf = clf.fit(x, y) 
pred = clf.predict(x_test)
我可以在某个地方添加一个“sample_weight”参数来解释不平衡的类吗


当我向svm添加一个类权重dict时,我得到了错误:

ValueError: Class label 2 not present
ValueError: You appear to be using a legacy multi-label data representation. Sequence of sequences are no longer supported; use a binary array or sparse matrix instead.
TypeError: no supported conversion for types: (dtype('O'),)
这是因为我已使用mlb将标签转换为二进制。但是,如果我不转换标签,我会得到:

ValueError: You appear to be using a legacy multi-label data representation. Sequence of sequences are no longer supported; use a binary array or sparse matrix instead. 
class_weight是一个dict,将类标签映射到权重:{1:1,2:1,3:3…}

以下是x和y的详细信息:

print(X[0])  
[ 0.76625633  0.63062721  0.01954162 ...,  1.1767817   0.249034    0.23544988]
print(type(X))
<type 'numpy.ndarray'>

print(y[0])
print(type(y))
[1, 2, 3, 4, 5, 6, 7]
<type 'numpy.ndarray'>
因此,问题归结为将标签(np.数组)转换为稀疏矩阵。

from scipy import sparse
y_sp = sparse.csr_matrix(y) 
这将产生以下错误:

ValueError: Class label 2 not present
ValueError: You appear to be using a legacy multi-label data representation. Sequence of sequences are no longer supported; use a binary array or sparse matrix instead.
TypeError: no supported conversion for types: (dtype('O'),)
我将为此打开一个新查询

您可以使用:

类权重:{dict,'balanced'},可选

将SVC的i级参数C设置为
i级权重[i]*C
。如果没有给出,所有类都应该有权重1。“平衡”模式使用y值自动调整权重,与输入数据中的类别频率成反比,如
n_样本/(n_类别*np.bincount(y))


此代码适用于class\u weight属性的“balanced”值

>>> from sklearn.preprocessing import MultiLabelBinarizer
>>> from sklearn.svm import SVC
>>> from sklearn.multiclass import OneVsRestClassifier

>>> mlb = MultiLabelBinarizer()
>>> x = [[0,1,1,1],[1,0,0,1]]
>>> y = mlb.fit_transform([['sci-fi', 'thriller'], ['comedy']])

>>> print y
>>> print mlb.classes_
[[0 1 1]
 [1 0 0]]
['comedy' 'sci-fi' 'thriller']

>>> OneVsRestClassifier(SVC(random_state=0, class_weight='balanced')).fit(x, y).predict(x)
array([[0, 1, 1],
   [1, 0, 0]])

谢谢,你能给出一个代码示例吗?当我尝试此操作时,我得到错误:ValueError:Class label 2不存在,因为我已将标签转换为二进制。但是,如果我不转换标签,我会得到:valueError:您似乎正在使用传统的多标签数据表示。序列序列不再受支持;改用二进制数组或稀疏矩阵。你能告诉我错误信息吗?这是一个与属性
class\u weight
相关的错误?你以前有过这个错误吗?顺便说一句,这个错误似乎表明你的训练集中只有一门课。这可能吗?对于我来说,这比不使用
class\u weight='balanced'
的运行时间要长得多。为什么会这样,有可能改变吗?我使用了
max\u iter
来限制迭代次数,但是精度比不使用平衡类还要差。你能提供x和y元素吗<代码>打印类型(x[0])打印x[0]和
打印类型(y[0])打印y[0]
此处y不是二进制的。查看
mlb.classes\uu
是否为您提供了一个值为2的数组。我已尝试将标签转换为二进制。它会产生上面列出的错误:ValueError:Class label 2不存在(因为所有标签都是二进制格式)。如果不转换为二进制,则会出现错误:ValueError:您似乎正在使用传统的多标签数据表示。序列序列不再受支持;使用二进制数组或稀疏矩阵代替。我一直在使用平衡矩阵,但希望指定自定义权重。