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

Dee*_*Dey 3 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)
Run Code Online (Sandbox Code Playgroud)

训练我的模型需要 2 个多小时。难道我做错了什么?另外,可以做些什么来改善时间

提前致谢

rvf*_*rvf 11

有几种方法可以加速您的 SVM 训练。让n成为记录数和d嵌入维数。我假设你使用scikit-learn.

  • 减少训练集大小。引用文档

    拟合时间复杂度超过样本数量的二次方,这使得很难扩展到超过 10000 个样本的数据集。

    O(n^2)复杂性很可能会主导其他因素。因此,为训练采样较少的记录将对时间产生最大的影响。除了随机抽样,您还可以尝试实例选择方法。例如,最近提出了主样本分析

  • 降低维度。正如其他人在他们的评论中暗示的那样,嵌入维度也会影响运行时。计算线性核的内积在O(d). 因此,降也可以减少运行时间。在另一个问题中,专门为 TF-IDF 表示建议了潜在语义索引

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

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

    此外,scikit-learn 开发人员kernel_approximation类似问题中建议了该模块。