【发布时间】:2015-10-19 07:23:30
【问题描述】:
在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/generated/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: user3914041 的回答得出的概率估计非常差。
【问题讨论】:
-
量化“大量时间”。你用什么来分析你的代码?
-
你需要全部 140 万个训练样例吗?根据docs,拟合时间复杂度在训练样例数量上超过二次方。此外,您是否需要概率估计?这需要额外运行交叉验证才能生成。
-
OneVsRestClassifier 带有并行选项,但请注意,它可能会占用您的许多资源,因为适应每个模型需要大量时间。尝试根据文档here 设置 n_jobs 参数。
-
从 Continuum 尝试 MKL 优化,请参阅 store.continuum.io/cshop/mkl-optimizations。他们提供 30 天免费试用,费用为 99 美元。我不是销售代表,但我使用他们的 Anaconda Python 发行版并喜欢它——在 Spark 峰会培训中被推荐。顺便说一句,Spark 支持 SVM,即使在小型 Spark 集群上运行它也会大大提高性能,请参阅 spark.apache.org/docs/1.1.0/…。
-
@TrisNefzger Spark 不起作用,因为它不支持 SVM 的概率估计
标签: python scikit-learn svm