我正在使用带有线性内核的 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)
训练我的模型需要两个多小时。 难道我做错了什么? 另外,可以做些什么来改善时间
提前致谢
有多种方法可以加速 SVM 训练。令
n
为记录数,d
为嵌入维数。我假设您使用scikit-learn
。
减少训练集大小。引用文档:
拟合时间复杂度大于样本数量的二次方,这使得很难扩展到具有超过 10000 个样本的数据集。
O(n^2)
复杂性很可能会主导其他因素。因此,减少训练记录采样将对时间产生最大的影响。除了随机抽样之外,您还可以尝试实例选择方法。例如,最近提出了主要样本分析。降维。正如其他人在评论中暗示的那样,嵌入维度也会影响运行时间。计算线性核的内积在
O(d)
中。因此,降维也可以减少运行时间。在另一个问题中,专门针对 TF-IDF 表示建议了潜在语义索引。SVC(probability=False)
,因为它们“会减慢该方法的速度。”(来自文档)。不同的分类器。你可以尝试
sklearn.svm.LinearSVC
,这是...
[s]与参数 kernel='linear' 的 SVC 类似,但根据 lib Linear 而不是 libsvm 实现,因此它在惩罚和损失函数的选择上具有更大的灵活性,并且应该更好地扩展到大量样本。
此外,一位 scikit-learn 开发者在类似问题
中建议了
kernel_approximation
模块。我遇到了同样的问题,但是缩放数据解决了问题
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
您可以尝试使用算法的加速实现 - 例如 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 估计器。” (来自文档)
尝试使用以下代码。我在训练数据大小相似的情况下也遇到了类似的问题。 我把它改为关注,响应速度快了很多
model = SVC(gamma='auto')