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

Posted

技术标签:

【中文标题】SVC 分类器花费太多时间进行训练【英文标题】:SVC classifier taking too much time for training 【发布时间】:2019-05-25 04:48:44 【问题描述】:

我正在使用带有线性内核的 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 个多小时。 难道我做错了什么? 还有,可以做些什么来改善时间

提前致谢

【问题讨论】:

每个训练样例有多少特征? 其实数据是文本数据。每条记录的文本大小从 100 到 200 个字不等。 你在使用某种 word2vec 吗?如果是,检查嵌入维度 不,使用 tfidfVectorizo​​r。不是 word2Vec。 【参考方案1】:

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

减少训练集大小。引用docs:

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

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

降维。正如其他人在他们的 cmets 中所暗示的那样,嵌入维度也会影响运行时间。计算线性核的内积在O(d)。因此,Dimensionality reduction 也可以减少运行时间。在another question 中,潜在语义索引专门针对 TF-IDF 表示提出了建议。

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

不同的分类器。你可以试试sklearn.svm.LinearSVC,就是……

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

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

【讨论】:

@Deepankar 如果您觉得它有用,除了接受它之外,请考虑支持我的回答。谢谢:)【参考方案2】:

尝试使用以下代码。我在训练数据的大小相似时遇到了类似的问题。 我将其更改为关注,响应速度更快

model = SVC(gamma='auto') 

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

第一个安装包

pip install scikit-learn-intelex

然后添加你的python脚本

from sklearnex import patch_sklearn
patch_sklearn()

【讨论】:

以上是关于SVC 分类器花费太多时间进行训练的主要内容,如果未能解决你的问题,请参考以下文章

具有概率或置信度的 Keras CNN 的 SVC 分类器以区分未经训练的类

保存 scikit-learn 分类器会导致内存错误

字母分类准确率

训练 SVM 分类器需要多少时间?

Sklearn:如何获得对训练数据进行分类的均方误差

如何利用opencv进行样本训练