SVC分类器训练时间过长

8

我正在使用具有线性内核的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小时时间,这是我做错了什么吗?同时,有什么方法可以提高训练速度呢?

提前感谢。


每个训练样本有多少特征? - wriuhasdfhvhasdv
实际上,数据是文本数据。每条记录的文本大小不同,大约在100-200个单词之间。 - Deepankar Dey
你是否在使用某种word2vec?如果是,请检查嵌入维度。 - Courage
不,不使用tfidfVectorizor。不使用word2Vec。 - Deepankar Dey
4个回答

14

有几种可能加速SVM训练。假设您使用scikit-learn,令n为记录数,d为嵌入维度。

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

    拟合时间复杂度随样本数量的增加而超过二次方,这使得它很难扩展到具有超过几万个样本的数据集。

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

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

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

    [s]imilar to SVC with parameter kernel=’linear’, but implemented in terms of liblinear rather than libsvm, so it has more flexibility in the choice of penalties and loss functions and should scale better to large numbers of samples.

    此外,scikit-learn dev在类似问题中建议使用kernel_approximation模块。


@Deepankar 如果您觉得我的回答有用,请考虑给它点赞并接受它。谢谢 :) - rvf

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()

0
尝试使用以下代码。我曾经遇到过类似大小的训练数据的问题。我将其更改为以下内容,响应速度快得多。
model = SVC(gamma='auto') 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接