降维,然后应用SVM

数据挖掘 Python 支持向量机 scikit-学习
2022-03-03 17:53:23

只是出于好奇,在使用训练集训练 SVM 分类器之前减少训练集的维度通常是一个好主意吗?

我有一个文档集合,每个文档都由一个向量表示,该向量具有由 scikit-learn 的 tfidf_transformer 计算的 tf-idf 权重。术语(特征?)的数量接近 60k,而我的训练集包含大约 250 万个文档,它使训练过程永远持续下去。

除了需要永远训练之外,分类也不准确,很可能是由于模型错误。只是为了了解我正在处理的内容,我尝试找到一种以某种方式可视化数据的方法。我使用SVD和scikit-learn将文档矩阵分解为(m,2)矩阵(想尝试其他方法,但它们都在中途崩溃了)。

所以这就是可视化的样子

SVD 的结果

那么降低维度然后只进行SVM通常是一种好习惯吗?同样在这种情况下,我能做些什么来提高分类器的准确性?我正在尝试使用 sklearn.svm.SVC 和kernel='poly',并且degree=3需要很长时间才能完成。

3个回答

我建议花更多时间考虑 SVM 的特征选择和表示,而不是担心模型中的维数。一般来说,SVM 往往对无信息特征非常稳健(例如,参见Joachims, 1997Joachims, 1999一个很好的概述)。根据我的经验,支持向量机通常不会像其他算法(例如朴素贝叶斯)那样从花时间进行特征选择中受益。我在 SVM 中看到的最大收益往往来自尝试以一种计算上可访问的方式编码您自己关于分类域的专业知识。例如,假设您正在对出版物进行分类,以确定它们是否包含有关蛋白质-蛋白质相互作用的信息。在词袋和 tfidf 矢量化方法中丢失的东西是邻近性的概念——在文档中彼此靠近出现的两个与蛋白质相关的词更有可能在处理蛋白质-蛋白质相互作用的文档中找到。这有时可以使用n-gram 建模,但只有考虑到要识别的文档类型的特征,才能使用更好的替代方法。

如果您仍想尝试进行功能选择,我建议您χ2(卡方)特征选择。为此,您根据目标对特征进行排名

χ2(D,t,c)=et0,1ec0,1(NetecEetec)2Eetec,
在哪里N是观察到的术语在D,E是它的预期频率,并且tc分别表示术语和类别。您可以在 sklearn 中轻松计算,除非您想要自己编码的教育体验¨

虽然对您的 tfidf 向量执行 PCA 或提取或消除不常用的单词可能会显着降低维度,但您可能想尝试主题建模

虽然创建主题和为文档分配主题的最初问题将保留在高维空间中,但受监督的部分将在主题空间中。

有很多LDA和类似主题模型的快速实现。

这么多训练向量上的 SVM 将花费很长时间和大量内存[ O(n^3) 时间和 O(n^2) 空间,n 是没有的。的训练向量]。您可以使用具有 GPU 加速的 SVM 库,这可能会有所帮助。如前文所述,功能对 SVM 来说并不重要。

你的C值是多少?对于某些 C 值,它需要额外的时间。您可以尝试使用一些向量和网格搜索对其进行调整。

神经网络可以从如此庞大的数据集中很好地学习,再加上 RBM,它应该会产生良好的结果。或者您可以尝试使用 Bagging/XGBoost 或其他集成方法的随机森林/决策树它们出奇的好,而且速度超级快(相对于 SVM)。

此外,这可能并不重要,但我没有足够的声誉来评论 - 这是什么样的可视化 - PCA?如果这不能给你一个好主意,你可以试试MDS,也许?