del*_*onX 6 python svm scikit-learn text-classification multilabel-classification
我正在做多标签分类,我试图预测问题的正确标签:
(X = 问题,y = X 中每个问题的标签列表)。
我想知道,哪个decision_function_shape
forsklearn.svm.SVC
应该与OneVsRestClassifier
?
从文档中我们可以看到decision_function_shape
可以有两个值'ovo'
和'ovr'
:
decision_function_shape: '卵内', 'OVR'或无,默认=无
是否像所有其他分类器一样返回形状为 (n_samples, n_classes) 的一对一 ('ovr') 决策函数,或具有形状 (n_samples) 的 libsvm 的原始一对一 ('ovo') 决策函数, n_classes * (n_classes - 1) / 2)。None 的默认值当前将表现为向后兼容的“ovo”并引发弃用警告,但将在 0.19 中更改“ovr”。
但我仍然不明白这两者之间的区别是什么:
# First decision_function_shape set to 'ovo'
estim = OneVsRestClassifier(SVC(kernel='linear', decision_function_shape ='ovo'))
# Second decision_function_shape set to 'ovr'
estim = OneVsRestClassifier(SVC(kernel='linear', decision_function_shape ='ovr'))
Run Code Online (Sandbox Code Playgroud)
哪个decision_function_shape
应该用于多标签分类问题?
编辑: 问题询问类似的事情而没有答案。
我认为应该使用哪个的问题最好还是根据情况而定。这很容易成为您的 GridSearch 的一部分。但凭直觉我会觉得,就差异而言,你们都会做同样的事情。这是我的推理:
OneVsRestClassifier
旨在独立地针对所有其他类对每个类进行建模,并为每种情况创建一个分类器。我理解这个过程的方式是OneVsRestClassifier
获取一个类,并创建一个二进制标签来判断一个点是否属于该类。然后,该标签将被输入到您选择使用的任何估算器中。我相信混乱的原因在于,这SVC
也允许您做出相同的选择,但实际上,对于此实现,选择并不重要,因为您始终只将两个类输入到SVC
.
这是一个例子:
from sklearn.datasets import load_iris
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
data = load_iris()
X, y = data.data, data.target
estim1 = OneVsRestClassifier(SVC(kernel='linear', decision_function_shape='ovo'))
estim1.fit(X,y)
estim2 = OneVsRestClassifier(SVC(kernel='linear', decision_function_shape='ovr'))
estim2.fit(X,y)
print(estim1.coef_ == estim2.coef_)
array([[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到两个模型构建的所有三个估计器的系数都相等。尽管该数据集只有 150 个样本和 3 个类,因此对于更复杂的数据集,这些结果可能会有所不同,但这是一个简单的概念证明。
归档时间: |
|
查看次数: |
10806 次 |
最近记录: |