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 吗?如果是,检查嵌入维度 不,使用 tfidfVectorizor。不是 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 分类器花费太多时间进行训练的主要内容,如果未能解决你的问题,请参考以下文章