当前位置: 首页 > 面试题库 >

使SVM在python中运行更快

南宫保臣
2023-03-14
问题内容

在python中为svm使用以下 代码

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)

但是,这需要大量时间。

实际数据尺寸

train-set (1422392,29)
test-set (233081,29)

如何加快速度(并行或其他方式)?请帮忙。我已经尝试过PCA和下采样。

我有6节课。编辑:找到http://scikit-
learn.org/stable/modules/generation/sklearn.linear_model.SGDClassifier.html,

但我希望获得概率估计,而svm似乎并非如此。

编辑:

from sklearn import datasets
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC,LinearSVC
from sklearn.linear_model import SGDClassifier
import joblib
import numpy as np
from sklearn import grid_search
import multiprocessing
import numpy as np
import math

def new_func(a):                              #converts array(x) elements to (1/(1 + e(-x)))
    a=1/(1 + math.exp(-a))
    return a

if __name__ == '__main__':
    iris = datasets.load_iris()
    cores=multiprocessing.cpu_count()-2
    X, y = iris.data, iris.target                       #loading dataset

    C_range = 10.0 ** np.arange(-4, 4);                  #c value range 
    param_grid = dict(estimator__C=C_range.tolist())

    svr = OneVsRestClassifier(LinearSVC(class_weight='auto'),n_jobs=cores) ################LinearSVC Code faster        
    #svr = OneVsRestClassifier(SVC(kernel='linear', probability=True,  ##################SVC code slow
    #   class_weight='auto'),n_jobs=cores)

    clf = grid_search.GridSearchCV(svr, param_grid,n_jobs=cores,verbose=2)  #grid search
    clf.fit(X, y)                                                   #training svm model

    decisions=clf.decision_function(X)                             #outputs decision functions
    #prob=clf.predict_proba(X)                                     #only for SVC outputs probablilites
    print decisions[:5,:]
    vecfunc = np.vectorize(new_func)
    prob=vecfunc(decisions)                                        #converts deicision to (1/(1 + e(-x)))
    print prob[:5,:]

编辑2:用户 3914041的答案得出的概率估计非常差。


问题答案:

如果要尽可能坚持使用SVC并在完整数据集上进行训练,则可以使用对数据子集进行训练的SVC集成来减少每个分类器的记录数量(这显然对复杂性具有二次影响)。Scikit支持使用BaggingClassifier包装器。与单个分类器相比,这应该为您提供类似(如果不是更好)的准确性,并且训练时间要少得多。还可以使用n_jobs参数将单个分类器的训练设置为并行运行。

或者,我也将考虑使用随机森林分类器-本机支持多类分类,它min_samples_leaf设置得很快,并且在适当设置时给出了很好的概率估计。

我对10个SVC的集合进行了100次爆炸,虹膜数据集进行了快速测试,每个训练了10%的数据。它比单个分类器快10倍以上。这些是我在笔记本电脑上得到的数字:

单次SVC:45秒

集成SVC:3秒

随机森林分类器:0.5秒

参见下面我用来产生数字的代码:

import time
import numpy as np
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier
from sklearn import datasets
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC

iris = datasets.load_iris()
X, y = iris.data, iris.target

X = np.repeat(X, 100, axis=0)
y = np.repeat(y, 100, axis=0)
start = time.time()
clf = OneVsRestClassifier(SVC(kernel='linear', probability=True, class_weight='auto'))
clf.fit(X, y)
end = time.time()
print "Single SVC", end - start, clf.score(X,y)
proba = clf.predict_proba(X)

n_estimators = 10
start = time.time()
clf = OneVsRestClassifier(BaggingClassifier(SVC(kernel='linear', probability=True, class_weight='auto'), max_samples=1.0 / n_estimators, n_estimators=n_estimators))
clf.fit(X, y)
end = time.time()
print "Bagging SVC", end - start, clf.score(X,y)
proba = clf.predict_proba(X)

start = time.time()
clf = RandomForestClassifier(min_samples_leaf=20)
clf.fit(X, y)
end = time.time()
print "Random Forest", end - start, clf.score(X,y)
proba = clf.predict_proba(X)

如果要确保在中对每个记录仅进行一次训练BaggingClassifier,可以将bootstrap参数设置为False。



 类似资料:
  • 我需要使用Weka的LibSVM实现对RSS提要中关键字的频率进行SVM分类,以将提要分类为目标类别。但根据我的数据,我不确定要运行哪个版本。 我的. arff文件通常包含以下数据: 以此类推:总共有570行,每行都包含一天的提要中关键字的频率。在这种情况下,10天内有57条feed,总共有570条记录需要分类。每个关键字都以代理项编号作为前缀,并以“频率”作为后缀。 但在其他情况下,我对频率使用

  • 问题内容: 我对Selenium完全陌生。我想在以下代码中执行一个javascript代码段(如代码中所注释),但是无法执行。请帮忙。 如果我使用- 它错误地显示为- 问题答案: 尝试代替。 要返回值,只需在传递给方法的字符串中使用JavaScript关键字,例如

  • 理解SVM 作者|OpenCV-Python Tutorials 编译|Vincent 来源|OpenCV-Python Tutorials 目标 在本章中,我们将重新识别手写数据集,但是使用SVM而不是kNN。 识别手写数字 在kNN中,我们直接使用像素强度作为特征向量。这次我们将使用定向梯度直方图(HOG)作为特征向量。 在这里,在找到HOG之前,我们使用其二阶矩对图像进行偏斜校正。因此,我们

  • 问题内容: 我正在尝试使用Zed A. Shaw的 “ 以 艰难的方式学习Python” 指南来 学习Python的 基础知识。我遇到的问题是我可以运行Python脚本,但只能在名称前面使用。这会瞬间打开CMD,然后关闭。 如果我尝试运行该文件,它将返回该文件不是可操作的程序文件,脚本等。 我已经在Stack Overflow上找到了与此问题相关的多个问题,但是没有一个解决方案对我有用。 我尝试过

  • 问题内容: 我运行一个包含此行的python脚本 然后,我在服务器上运行相同的代码,并收到以下错误消息 因此,我要做的就是print bashCommand在运行之前,在终端中插入一个比命令更清晰的信息os.system()。 当然,我再次收到错误(由引起os.system(bashCommand)),但是在该错误出现之前,它会在终端中打印命令。然后我只是复制了输出,然后将复制粘贴到终端中,然后按

  • 我编写了一个由五个。py脚本文件组成的Python程序。我希望从Java应用程序中执行这些python脚本的主要部分。 我有什么选择?使用PythonInterperter不起作用,例如,模块不能从Jython中加载(我不希望用户为这些依赖项的工作而确定他的Python路径)。 我使用Jython的CompileAll将整个文件夹编译为。class文件。我能以某种方式嵌入这些。class文件以从J