python中返回概率的多类线性支持向量机

python中返回概率的多类线性支持向量机,python,scipy,scikit-learn,Python,Scipy,Scikit Learn,如何为多类实现线性支持向量机,该支持向量机返回测试样本的概率矩阵。 列车样本:mxn 列车标签:mxc 测试标签:mxc,其中列具有每个类的概率 sklearn中执行“一对其余”的函数不会为每个样本返回概率数组,比如haspredict\u proba 编辑 代码: 输出: (7112L, 32L) (7112L, 6L) Traceback (most recent call last): File "SVC_Calibirated_Probability.py", line 171, i

如何为多类实现线性支持向量机,该支持向量机返回测试样本的概率矩阵。 列车样本:mxn 列车标签:mxc 测试标签:mxc,其中列具有每个类的概率

sklearn中执行“一对其余”的函数不会为每个样本返回概率数组,比如has
predict\u proba

编辑

代码:

输出:

(7112L, 32L) (7112L, 6L)
Traceback (most recent call last):
  File "SVC_Calibirated_Probability.py", line 171, in <module>
    clf.fit(X_train, y)
  File "C:\Anaconda\lib\site-packages\sklearn\calibration.py", line 110, in fit
    force_all_finite=False)
  File "C:\Anaconda\lib\site-packages\sklearn\utils\validation.py", line 449, in check_X_y
    y = column_or_1d(y, warn=True)
  File "C:\Anaconda\lib\site-packages\sklearn\utils\validation.py", line 485, in column_or_1d
    raise ValueError("bad input shape {0}".format(shape))
ValueError: bad input shape (7112L, 6L)
(7112L,32L)(7112L,6L)
回溯(最近一次呼叫最后一次):
文件“SVC_Calibirated_Probability.py”,第171行,in
clf.配合(X_系列,y)
文件“C:\Anaconda\lib\site packages\sklearn\calibration.py”,第110行,在fit中
强制(全部(有限=错误)
文件“C:\Anaconda\lib\site packages\sklearn\utils\validation.py”,第449行,检查
y=列_或_1d(y,警告=真)
文件“C:\Anaconda\lib\site packages\sklearn\utils\validation.py”,第485行,第\u或\u 1d列
raise VALUERROR(“错误的输入形状{0}”。格式(形状))
值错误:输入形状不正确(7112L,6L)

LinearSVC
不支持概率估计,因为它基于
liblinear
,但
liblinear
仅支持逻辑回归的概率估计

如果您只需要信心分数,但这些不一定是概率,您可以使用
决策函数

如果不需要选择线性支持向量机的惩罚函数和损失函数,也可以通过将内核设置为“线性”来使用
SVC
,然后可以使用
predict\u proba

更新#1: 例如,您可以将
SVC
OneVsRestClassifier
一起使用,以支持一对多方案

from sklearn import datasets
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
iris = datasets.load_iris()
X, y = iris.data, iris.target
clf = OneVsRestClassifier(SVC(kernel='linear', probability=True, class_weight='auto'))
clf.fit(X, y)
proba = clf.predict_proba(X)
更新#2: 还有另一种方法可以使用
LinearSVC
作为分类器来估计概率

from sklearn.svm import LinearSVC
from sklearn.calibration import CalibratedClassifierCV
from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data
Y = iris.target
svc = LinearSVC()
clf = CalibratedClassifierCV(svc, cv=10)
clf.fit(X, Y)
proba = clf.predict_proba(X)
但是对于另一个问题(),此解决方案也不可能提高性能,因为它涉及额外的交叉验证,并且不支持并行化

更新#3: 对于第二种解决方案,由于
LinearSVC
不支持多标签分类,因此必须将其包装在
OneVsRestClassifier
中,下面是一个示例:

from sklearn.svm import LinearSVC
from sklearn.calibration import CalibratedClassifierCV
from sklearn.multiclass import OneVsRestClassifier
from sklearn.datasets import make_multilabel_classification

X, Y = make_multilabel_classification(n_classes=2, n_labels=1,
                                      allow_unlabeled=True,
                                      return_indicator=True,
                                      random_state=1)
clf0 = CalibratedClassifierCV(LinearSVC(), cv=10)
clf = OneVsRestClassifier(clf0)
clf.fit(X, Y)
proba = clf.predict_proba(X)

谢谢你的回复。可以在SVC中实现一对一吗?非常感谢!它工作得很好。我正在尺寸为(1422392,29)和测试集(233081,29)的列车组上实现此功能。它工作得很慢。有什么建议吗?我可以并行化吗?我在网上找不到任何示例。您可以通过设置
n\u作业
来并行化
OneVsRestClassifier
。有关更多详细信息,请参阅。无论如何,要更快地运行校准,请解释。如果没有并行化,速度会非常慢。@yangje非常感谢您的回答!你能解释一下它是否适用于二进制标签吗?我试过了,它给出了一个错误。
from sklearn.svm import LinearSVC
from sklearn.calibration import CalibratedClassifierCV
from sklearn.multiclass import OneVsRestClassifier
from sklearn.datasets import make_multilabel_classification

X, Y = make_multilabel_classification(n_classes=2, n_labels=1,
                                      allow_unlabeled=True,
                                      return_indicator=True,
                                      random_state=1)
clf0 = CalibratedClassifierCV(LinearSVC(), cv=10)
clf = OneVsRestClassifier(clf0)
clf.fit(X, Y)
proba = clf.predict_proba(X)