Python SVC尺寸>&燃气轮机;酸洗时的线性VC尺寸

Python SVC尺寸>&燃气轮机;酸洗时的线性VC尺寸,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我尝试使用多个分类器。我希望在测试过程中保存所有分类器,并使其易于访问。目前,当使用LinearSVC时,经过训练的模型为5MB或更少。使用SVC时,模型大小将超过400 MB,加载到内存几乎需要一分钟。我可以使用LinearSVC,但我也想尝试使用RBF内核。我无法理解预先描述的尺寸之间的巨大差异。有人能向我解释为什么会发生这种情况(如果可以解释的话,或者让我指出一个可能的错误)并提出一个解决方案来截断SVC模型的大小,或者避免使用SVC来实现RBF内核吗?谢谢大家 例子 取自教程页面并添加了

我尝试使用多个分类器。我希望在测试过程中保存所有分类器,并使其易于访问。目前,当使用LinearSVC时,经过训练的模型为5MB或更少。使用SVC时,模型大小将超过400 MB,加载到内存几乎需要一分钟。我可以使用LinearSVC,但我也想尝试使用RBF内核。我无法理解预先描述的尺寸之间的巨大差异。有人能向我解释为什么会发生这种情况(如果可以解释的话,或者让我指出一个可能的错误)并提出一个解决方案来截断SVC模型的大小,或者避免使用SVC来实现RBF内核吗?谢谢大家

例子 取自教程页面并添加了pickle

import os
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
import cPickle as pickle
# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, :2] 
y = iris.target
C = 1.0  # SVM regularization parameter
svc = svm.SVC(kernel='linear', C=C).fit(X, y)
lin_svc = svm.LinearSVC(C=C).fit(X, y)
rbf_svc = svm.SVC(kernel='rbf', gamma=0.7, C=C).fit(X, y)
with open('svcpick','w') as out:
    pickle.dump(svc,out)
with open('rbfsvcpick','w') as out:
    pickle.dump(rbf_svc,out)
with open('linsvcpick','w') as out:
    pickle.dump(lin_svc,out)
print 'SVC(Linear):',os.path.getsize('./svcpick'),' B'
print 'SVC(RBF):',os.path.getsize('./rbfsvcpick'),' B'
print 'LinearSVC:',os.path.getsize('./linsvcpick'),' B'
输出:

SVC(Linear): 11481 B
SVC(RBF): 12087 B
LinearSVC: 1188 B
mSVC(Linear): 126539 B
mSVC(RBF): 561532 B
mLinearSVC: 9782 B
多标签分类的另一个例子 再次(部分)取自教程

import os
import numpy as np
from sklearn import svm, datasets
from sklearn.datasets import make_multilabel_classification
from sklearn.multiclass import OneVsRestClassifier
import cPickle as pickle
# import some data to play with
X, Y = make_multilabel_classification(n_classes=10, n_labels=1,
                                      allow_unlabeled=True,
                                      random_state=1)
msvc = OneVsRestClassifier(svm.SVC(kernel='linear')).fit(X, Y)        
mrbf_svc = OneVsRestClassifier(svm.SVC(kernel='rbf')).fit(X, Y)    
mlin_svc = OneVsRestClassifier(svm.LinearSVC()).fit(X, Y)   

with open('msvcpick','w') as out:
    pickle.dump(msvc,out)
with open('mrbfsvcpick','w') as out:
    pickle.dump(mrbf_svc,out)
with open('mlinsvcpick','w') as out:
    pickle.dump(mlin_svc,out)
print 'mSVC(Linear):',os.path.getsize('./msvcpick'),' B'
print 'mSVC(RBF):',os.path.getsize('./mrbfsvcpick'),' B'
print 'mLinearSVC:',os.path.getsize('./mlinsvcpick'),' B'
输出:

SVC(Linear): 11481 B
SVC(RBF): 12087 B
LinearSVC: 1188 B
mSVC(Linear): 126539 B
mSVC(RBF): 561532 B
mLinearSVC: 9782 B

在我的实现中,我尝试对2个以上的类使用多标签分类,这就是为什么我将默认值更改为10。可以看到大小的差异。在我的实现中,mLinearSVC的大小超过1MB,而不是10KB,如上所示,这是因为我必须处理多维数据(每个示例有256个功能)。

这可能有很多原因。但是没有代码,这只是猜测。我没有添加代码,因为它太通用了。更新。只需先检查SVs并阅读。因为所有实际实现都不同于一个经典公式。说真的,我给了你两个重要的步骤。检查模型(至少是支持向量;易学)并理解相关帖子。有很多东西要发现。慢慢来。更准确地说:这个链接给出了一个可能的解释,检查你的SVs就是一种验证。你的假设是错误的,但很难在评论中说明这一点。这都是关于模型的。如果rbf支持向量机工作得更好,在给定一些最小性能的情况下,它可以更小。但这更多的是理论上的东西。实时应用程序可能永远也不会做IO之类的事情。保持足够的内存。但是想想不同模式的影响。您谈论的是大小或IO时间,但更多的支持向量在预测时间上也会更糟糕(一个良好的通用紧凑模型通常是支持向量机强大的原因,在ML中;如果稀疏,在许多dims poss中仍然有很强的性能)。