SVC分类器花费太多时间进行训练

时间:2018-12-27 05:43:31

标签: machine-learning deep-learning data-science

我正在使用带有线性内核的SVC分类器来训练我的模型。 火车数据:42000条记录

    model = SVC(probability=True)
    model.fit(self.features_train, self.labels_train)
    y_pred = model.predict(self.features_test)
    train_accuracy = model.score(self.features_train,self.labels_train)
    test_accuracy = model.score(self.features_test, self.labels_test)

训练我的模型需要两个多小时。 难道我做错了什么? 另外,可以采取什么措施来缩短时间

预先感谢

2 个答案:

答案 0 :(得分:2)

有几种方法可以加快您的SVM培训。假设n为记录数,d为嵌入维数。我假设您使用scikit-learn

  • 减小训练集大小。引用docs

      

    拟合时间复杂度是样本数的两倍以上,这使得很难扩展到具有超过10000个样本的数据集。

    O(n^2)的复杂性很可能将主导其他因素。因此,为培训减少采样记录将对时间产生最大的影响。除了随机抽样,您还可以尝试instance selection方法。例如,最近提出了principal sample analysis

  • 缩小尺寸。正如其他人在评论中所暗示的那样,嵌入维度也会影响运行时。在O(d)中计算线性内核的内部乘积。 Dimensionality reduction因此也可以减少运行时间。在another question中,为TF-IDF表示特别建议了潜在语义索引

  • 参数。除非您需要概率,否则请使用SVC(probability=False),因为概率“ 会降低该方法的速度。”(来自文档)。
  • 实施。就我所知,scikit-learn只是围绕LIBSVM和LIBLINEAR。我在这里推测,但是您可以使用高效的BLAS库(例如,英特尔的MKL)来加快这一步。
  • 不同的分类器。您可以尝试sklearn.svm.LinearSVC,这是...

      

    [s]与SVC类似,参数kernel ='linear',但以liblinear而不是libsvm的方式实现,因此它在选择罚分和损失函数时具有更大的灵活性,应更好地扩展到大量样本。

    此外,一个scikit-learn开发人员建议在kernel_approximation中使用similar question模块。

答案 1 :(得分:0)

  

尝试使用以下代码。对于相似的训练数据量,我也遇到了类似的问题。   我将其更改为关注,并且响应速度更快

model = SVC(gamma='auto')