SciKit One-class SVM 分类器训练时间随着训练数据的大小呈指数增长

Posted

技术标签:

【中文标题】SciKit One-class SVM 分类器训练时间随着训练数据的大小呈指数增长【英文标题】:SciKit One-class SVM classifier training time increases exponentially with size of training data 【发布时间】:2017-06-02 14:52:46 【问题描述】:

我正在使用 Python SciKit OneClass SVM 分类器来检测文本行中的异常值。首先使用词袋和 TF-IDF 将文本转换为数字特征。

当我训练(拟合)在我的计算机上运行的分类器时,时间似乎随着训练集中项目的数量呈指数增长:

训练数据中的项目数和花费的训练时间: 10K:1 秒、15K:2 秒、20K:8 秒、25K:12 秒、30K:16 秒、45K:44 秒。

我能做些什么来减少训练所花费的时间,并避免当训练数据量增加到几十万项时这会变得太长?

【问题讨论】:

Kernel-SVM 介于 O(n^2) 和 O(n^3) 之间(取决于时间/内存权衡)。你无能为力。非线性 SVM 不适用于大数据!线性 SVM 可以,但似乎底层实现只是 libsvm(并且不能使用 liblinear 或 SGD)。 【参考方案1】:

对于来自 Google 的任何人,sklearn 已经实现了 SGDOneClassSVM,它“在训练样本的数量上具有线性复杂性”。对于大型数据集,它应该更快。

【讨论】:

【参考方案2】:

希望我不会太晚。 OCSVM 和 SVM 需要大量资源,并且长度/时间关系是二次的(您显示的数字遵循此)。如果可以,请查看 Isolation Forest 或 Local Outlier Factor 是否适合您,但如果您正在考虑应用更长的数据集,我建议创建一个与这些现成解决方案的上下文非常相似的手动 AD 模型。通过这样做,您应该能够并行工作或使用线程工作。

【讨论】:

【参考方案3】:

scikit 的 SVM 是一个高级实现,所以你能做的只有这么多,而且在速度方面,从他们的网站上,“SVM 不直接提供概率估计,这些是使用昂贵的五倍计算交叉验证。”

您可以根据可用 RAM 增加内核大小参数,但这种增加并没有多大帮助。

您可以尝试更改内核,尽管您的模型可能不正确。

以下是来自http://scikit-learn.org/stable/modules/svm.html#tips-on-practical-use 的一些建议:扩展您的数据。

否则,不要使用 scikit 并使用神经网络自己实现。

【讨论】:

以上是关于SciKit One-class SVM 分类器训练时间随着训练数据的大小呈指数增长的主要内容,如果未能解决你的问题,请参考以下文章

如何获得 scikit-learn SVM 分类器的所有 alpha 值?

用于文本分类的一类 SVM 模型(scikit-learn)

为啥 scikit-learn SVM 分类器交叉验证这么慢?

使用 scikit-learn 训练数据时,SVM 多类分类停止

使用 Scikit Learn SVM 为文本分类准备数据

Scikit learn - 如何使用 SVM 和随机森林进行文本分类?