gpt4 book ai didi

python - 返回概率的python中的多类线性SVM

转载 作者:行者123 更新时间:2023-11-28 22:42:30 24 4
gpt4 key购买 nike

如何为多类实现线性 SVM,它返回测试样本的概率矩阵。 训练样本:mxn 列车标签:mxc 测试标签:mxc,其中列有每个类别的概率。

sklearn 中的函数“一对一”LinearSVC不会为每个样本返回概率数组,如 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的惩罚和损失函数,你也可以通过设置kernel为'linear'来使用SVC,那么你可以有predict_proba.

更新#1:

例如,您可以将 SVCOneVsRestClassifier 一起使用以支持 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)

关于python - 返回概率的python中的多类线性SVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31617530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com