python 中 return 概率的多类线性 SVM

Multiclass linear SVM in python that return probability

如何为多个 class 实现线性 SVM,其中 returns 是测试样本的概率矩阵。 训练样本:mxn 列车标签:mxc 测试标签:mxc,其中列有每个 class.

的概率

sklearn 中的函数 "one-vs-the-rest" LinearSVC doesn't return probablity array for each sample like SVC 其中有 predict_proba

编辑

代码:

        print X_train.shape,y.shape
        svc = LinearSVC()
        clf = CalibratedClassifierCV(svc, cv=10)
        clf.fit(X_train, y)

输出:

(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)

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

如果您只需要置信度分数,但不一定是概率,则可以使用 decision_function

如果不需要选择线性SVM的惩罚和损失函数,也可以使用SVC,设置kernel为'linear',就可以有predict_proba

更新 #1:

您可以使用 SVCOneVsRestClassifier 来支持一对多的方案,例如

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)