python中返回概率的多类线性SVM
Posted
技术标签:
【中文标题】python中返回概率的多类线性SVM【英文标题】:Multiclass linear SVM in python that return probability 【发布时间】:2015-10-15 12:56:51 【问题描述】:如何为多类实现线性 SVM,它返回测试样本的概率矩阵。 训练样本:mxn 火车标签:MXC 测试标签:mxc,其中column为每个类的概率。
sklearn 中执行“one-vs-the-rest”LinearSVC 的函数不会为每个样本返回概率数组,例如具有 predict_proba
的 SVC
编辑
代码:
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)
【问题讨论】:
【参考方案1】:LinearSVC
不支持概率估计,因为它基于liblinear
,但liblinear
仅支持逻辑回归的概率估计。
如果您只需要置信度分数,但不一定是概率,您可以改用decision_function
。
如果不需要选择线性SVM的惩罚函数和损失函数,也可以使用SVC
,将kernel设置为'linear'
,就可以得到predict_proba
。
更新 #1:
例如,您可以使用SVC
和OneVsRestClassifier
来支持one-vs-rest 方案
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)
但是对于另一个问题 (Making SVM run faster in python),此解决方案也不太可能提高性能,因为它涉及额外的交叉验证并且不支持并行化。
更新#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 中实现 one vs rest? 非常感谢!它工作完美。我正在使用尺寸(1422392,29)和测试集(233081,29)的火车集上实现这一点。它工作得很慢。有什么建议?我可以并行化吗,我在网上找不到任何示例。 你可以通过设置n_jobs
来并行化OneVsRestClassifier
。有关详细信息,请参阅doc。
无论如何运行校准更快,请解释。如果没有并行化,它会非常慢。
@yangje 非常感谢您的回答!你能解释一下它是否适用于二进制标签,我试过它给出了一个错误。以上是关于python中返回概率的多类线性SVM的主要内容,如果未能解决你的问题,请参考以下文章