我正在使用Python SciKit OneClass SVM分类器来检测文本行中的异常值。首先使用单词袋和TF-IDF将文本转换为数字特征。
当我训练(拟合)计算机上运行的分类器时,时间似乎随着训练集中的项目数量呈指数级增长:
训练数据中的项目数和所用训练时间:10K:1秒,15K:2秒,20K:8秒,25K:12秒,30K:16秒,45K:44秒。
我能做些什么来减少训练所需的时间,并避免在训练数据大小增加到几十万个项目时这变得太长?
scikit的SVM是一个高级实现,所以你能做的只有这么多,就速度而言,从他们的网站上,"SVM不直接提供概率估计,这些是使用昂贵的五倍交叉验证计算的。
您可以根据可用 RAM 增加内核大小参数,但这种增加没有多大帮助。
您可以尝试更改内核,但您的模型可能不正确。
以下是 http://scikit-learn.org/stable/modules/svm.html#tips-on-practical-use 的一些建议:缩放数据。
否则,不要使用 scikit 并使用神经网络自己实现它。
希望我不会太晚。OCSVM 和 SVM 需要大量资源,并且长度/时间关系是二次的(您显示的数字遵循此数字)。如果可以,请查看隔离林或局部异常因子是否适合您,但如果您正在考虑应用于更长的数据集,我建议您创建一个手动 AD 模型,该模型与这些现成解决方案的上下文非常相似。通过这样做,您应该能够并行或与线程一起工作。
对于任何来自谷歌的人来说,sklearn
已经实现了SGDOneClassSVM
,它"在训练样本的数量上具有线性复杂性"。对于大型数据集,它应该更快。