我正在使用带有线性内核的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)
训练我的模型需要两个多小时。 难道我做错了什么? 另外,可以采取什么措施来缩短时间
预先感谢
答案 0 :(得分:2)
有几种方法可以加快您的SVM培训。假设n
为记录数,d
为嵌入维数。我假设您使用scikit-learn
。
减小训练集大小。引用docs:
拟合时间复杂度是样本数的两倍以上,这使得很难扩展到具有超过10000个样本的数据集。
O(n^2)
的复杂性很可能将主导其他因素。因此,为培训减少采样记录将对时间产生最大的影响。除了随机抽样,您还可以尝试instance selection方法。例如,最近提出了principal sample analysis。
缩小尺寸。正如其他人在评论中所暗示的那样,嵌入维度也会影响运行时。在O(d)
中计算线性内核的内部乘积。 Dimensionality reduction因此也可以减少运行时间。在another question中,为TF-IDF表示特别建议了潜在语义索引。
SVC(probability=False)
,因为概率“ 会降低该方法的速度。”(来自文档)。 不同的分类器。您可以尝试sklearn.svm.LinearSVC
,这是...
[s]与SVC类似,参数kernel ='linear',但以liblinear而不是libsvm的方式实现,因此它在选择罚分和损失函数时具有更大的灵活性,应更好地扩展到大量样本。
此外,一个scikit-learn开发人员建议在kernel_approximation
中使用similar question模块。
答案 1 :(得分:0)
尝试使用以下代码。对于相似的训练数据量,我也遇到了类似的问题。 我将其更改为关注,并且响应速度更快
model = SVC(gamma='auto')