我留下了这个示例来创建使用 scikit-learn 的分类器图像。
虽然每个图像都属于单一类别且一切正常,但每个图像可能属于多个类别,例如:白天的狗的照片,夜晚的猫的图片,夜晚的猫和狗的图片等…我编写了:
target=[[0,1],[0,2],[1,2],[0,2,3]]target = MultiLabelBinarizer().fit_transform(target)classifier = svm.SVC(gamma=0.001)classifier.fit(data, target)
但我得到了这个错误:
Traceback (most recent call last): File "test.py", line 49, in <module> classifier.fit(data, target) File "/home/mezzo/.local/lib/python2.7/site-packages/sklearn/svm/base.py", line 151, in fit y = self._validate_targets(y) File "/home/mezzo/.local/lib/python2.7/site-packages/sklearn/svm/base.py", line 514, in _validate_targets y_ = column_or_1d(y, warn=True) File "/home/mezzo/.local/lib/python2.7/site-packages/sklearn/utils/validation.py", line 551, in column_or_1d raise ValueError("bad input shape {0}".format(shape))ValueError: bad input shape (4, 4)
完整代码
回答:
Scikit-learn 的 SVM 实现原生不支持多标签分类,尽管它有其他各种支持的分类器:
使用 SVM 进行多标签分类也是可能的,通过将每个标签的唯一组合视为一个单独的类。你可以简单地将 target
矩阵中的每一行替换为一个单独的整数标签,这可以通过使用 np.unique
高效完成:
d = np.dtype((np.void, target.dtype.itemsize * target.shape[1]))_, ulabels = np.unique(np.ascontiguousarray(target).view(d), return_inverse=True)
然后你可以像单标签分类问题一样训练 SVM:
clf = svm.SVC()clf.fit(data, ulabels)
一个潜在的注意事项是,如果你没有大量的训练样本,分类器对稀有标签组合的表现可能较差。