我发现sklearn.svm.LinearSVC并且sklearn.svm.SVC(kernel='linear')他们看起来和我非常相似,但我对路透社的结果却截然不同.
sklearn.svm.LinearSVC: 81.05% in 28.87s train / 9.71s test
sklearn.svm.SVC : 33.55% in 6536.53s train / 2418.62s test
Run Code Online (Sandbox Code Playgroud)
两者都有线性内核.LinearSVC的容差高于SVC的容差:
LinearSVC(C=1.0, tol=0.0001, max_iter=1000, penalty='l2', loss='squared_hinge', dual=True, multi_class='ovr', fit_intercept=True, intercept_scaling=1)
SVC (C=1.0, tol=0.001, max_iter=-1, shrinking=True, probability=False, cache_size=200, decision_function_shape=None)
Run Code Online (Sandbox Code Playgroud)
两种功能如何区别?即使我设置kernel='linear,tol=0.0001,max_iter=1000 anddecision_function_shape = 'OVR' theSVC takes much longer thanLinearSVC`.为什么?
我使用sklearn 0.18,两者都包裹在OneVsRestClassifier.我不确定这是否与multi_class='ovr'/ 相同decision_function_shape='ovr'.
E.Z*_*.Z. 13
确实,LinearSVC并SVC(kernel='linear')产生不同的结果,即指标得分和决策边界,因为他们使用不同的方法.下面的玩具示例证明了这一点:
from sklearn.datasets import load_iris
from sklearn.svm import LinearSVC, SVC
X, y = load_iris(return_X_y=True)
clf_1 = LinearSVC().fit(X, y) # possible to state loss='hinge'
clf_2 = SVC(kernel='linear').fit(X, y)
score_1 = clf_1.score(X, y)
score_2 = clf_2.score(X, y)
print('LinearSVC score %s' % score_1)
print('SVC score %s' % score_2)
--------------------------
>>> 0.96666666666666667
>>> 0.98666666666666669
Run Code Online (Sandbox Code Playgroud)
这种差异的关键原则如下:
LinearSVC最大限度地减少平方铰链损耗,同时SVC最大限度地减少常规铰链损耗 可以手动为loss参数输入定义"铰链"字符串LinearSVC.LinearSVC使用One-vs-All(也称为One-vs-Rest)多类缩减,同时SVC使用One-vs-One多类缩减.这里也要注意.此外,对于多类分类问题SVC适合N * (N - 1) / 2模型,其中N类的数量.LinearSVC相比之下,简单地适合N模型.如果分类问题是二进制的,那么在两种情况下只适用一种模型.multi_class和decision_function_shape参数没有任何共同之处.第二个是聚合器,它以方便的形式转换决策函数的结果(n_features, n_samples).multi_class是一种建立解决方案的算法方法.LinearSVC是liblinear,实际上会对截距进行惩罚.SVC使用没有的libsvm估算器.liblinear估计器针对线性(特殊)情况进行了优化,因此比libsvm更快地收敛于大量数据.这就是为什么LinearSVC花费更少的时间来解决问题.实际上,LinearSVC在截取缩放之后实际上并不是线性的,正如评论部分所述.
| 归档时间: |
|
| 查看次数: |
5010 次 |
| 最近记录: |