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

问题描述 投票:0回答:4

我正在使用带有线性内核的 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)

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

提前致谢

machine-learning deep-learning data-science
4个回答
14
投票

有多种方法可以加速 SVM 训练。令

n
为记录数,
d
为嵌入维数。我假设您使用
scikit-learn

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

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

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

  • 降维。正如其他人在评论中暗示的那样,嵌入维度也会影响运行时间。计算线性核的内积在

    O(d)
    中。因此,降维也可以减少运行时间。在另一个问题中,专门针对 TF-IDF 表示建议了潜在语义索引

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

    sklearn.svm.LinearSVC
    ,这是...

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

    此外,一位 scikit-learn 开发者在类似问题

    中建议了
    kernel_approximation模块。


2
投票

我遇到了同样的问题,但是缩放数据解决了问题

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

1
投票

您可以尝试使用算法的加速实现 - 例如 scikit-learn-intelex - https://github.com/intel/scikit-learn-intelex

对于SVM你肯定能够获得更高的计算效率。

首先安装包

pip install scikit-learn-intelex

然后添加你的Python脚本

from sklearnex import patch_sklearn
patch_sklearn()

请注意:“您必须在这些行之后导入 scikit-learn。否则,修补将不会影响原始的 scikit-learn 估计器。” (来自文档


0
投票
尝试使用以下代码。我在训练数据大小相似的情况下也遇到了类似的问题。 我把它改为关注,响应速度快了很多

model = SVC(gamma='auto')
    
© www.soinside.com 2019 - 2024. All rights reserved.