SciKit One-class SVM classifier 训练时间随着训练数据的大小呈指数增长
SciKit One-class SVM classifier training time increases exponentially with size of training data
我正在使用 Python SciKit OneClass SVM 分类器来检测文本行中的异常值。首先使用词袋和 TF-IDF 将文本转换为数字特征。
当我在我的计算机上训练(拟合)分类器 运行 时,时间似乎随着训练集中项目的数量呈指数增长:
训练数据项数和训练时间:
10K:1 秒,15K:2 秒,20K:8 秒,25k:12 秒,30K:16 秒,45K:44 秒。
我能做些什么来减少训练时间,并避免当训练数据量增加到几十万项时训练时间变得太长?
scikit 的 SVM 是一种高级实现,因此您只能做这么多,而且就速度而言,从他们的网站上看,"SVMs do not directly provide probability estimates, these are calculated using an expensive five-fold cross-validation."
您可以根据可用 RAM 增加内核大小参数,但这种增加并没有多大帮助。
您可以尝试更改内核,但您的模型可能不正确。
以下是 http://scikit-learn.org/stable/modules/svm.html#tips-on-practical-use 的一些建议:缩放数据。
不然就别用scikit了,自己用神经网络实现吧
希望我没有太晚。 OCSVM 和 SVM 非常耗费资源,并且 length/time 关系是二次的(您显示的数字遵循此)。如果可以,请查看隔离森林或局部异常值因子是否适合您,但如果您正在考虑在更长的数据集上应用,我建议创建一个与这些现成解决方案的上下文非常相似的手动 AD 模型。通过这样做,您应该能够并行或使用线程工作。
对于来自 Google 的任何人,sklearn
已经实现了 SGDOneClassSVM
,它“在训练样本的数量上具有线性复杂性”。对于大型数据集应该更快。
我正在使用 Python SciKit OneClass SVM 分类器来检测文本行中的异常值。首先使用词袋和 TF-IDF 将文本转换为数字特征。
当我在我的计算机上训练(拟合)分类器 运行 时,时间似乎随着训练集中项目的数量呈指数增长:
训练数据项数和训练时间: 10K:1 秒,15K:2 秒,20K:8 秒,25k:12 秒,30K:16 秒,45K:44 秒。
我能做些什么来减少训练时间,并避免当训练数据量增加到几十万项时训练时间变得太长?
scikit 的 SVM 是一种高级实现,因此您只能做这么多,而且就速度而言,从他们的网站上看,"SVMs do not directly provide probability estimates, these are calculated using an expensive five-fold cross-validation."
您可以根据可用 RAM 增加内核大小参数,但这种增加并没有多大帮助。
您可以尝试更改内核,但您的模型可能不正确。
以下是 http://scikit-learn.org/stable/modules/svm.html#tips-on-practical-use 的一些建议:缩放数据。
不然就别用scikit了,自己用神经网络实现吧
希望我没有太晚。 OCSVM 和 SVM 非常耗费资源,并且 length/time 关系是二次的(您显示的数字遵循此)。如果可以,请查看隔离森林或局部异常值因子是否适合您,但如果您正在考虑在更长的数据集上应用,我建议创建一个与这些现成解决方案的上下文非常相似的手动 AD 模型。通过这样做,您应该能够并行或使用线程工作。
对于来自 Google 的任何人,sklearn
已经实现了 SGDOneClassSVM
,它“在训练样本的数量上具有线性复杂性”。对于大型数据集应该更快。