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
不支持概率估计,因为它基于 liblinear
但 liblinear
仅支持逻辑回归的概率估计。
如果您只需要置信度分数,但不一定是概率,则可以使用 decision_function
。
如果不需要选择线性SVM的惩罚和损失函数,也可以使用SVC
,设置kernel为'linear'
,就可以有predict_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)
如何为多个 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
不支持概率估计,因为它基于 liblinear
但 liblinear
仅支持逻辑回归的概率估计。
如果您只需要置信度分数,但不一定是概率,则可以使用 decision_function
。
如果不需要选择线性SVM的惩罚和损失函数,也可以使用SVC
,设置kernel为'linear'
,就可以有predict_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)