python中返回概率的多类线性支持向量机
如何为多类实现线性支持向量机,该支持向量机返回测试样本的概率矩阵。 列车样本:mxn 列车标签:mxc 测试标签:mxc,其中列具有每个类的概率 sklearn中执行“一对其余”的函数不会为每个样本返回概率数组,比如haspython中返回概率的多类线性支持向量机,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
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)