为什么我在 SVC、LinearSVC 和朴素贝叶斯之间得到非常不同的结果?

数据挖掘 scikit-学习 支持向量机
2022-02-20 11:44:30

我正在使用词袋模型进行分类。目标是根据用户的推文定位用户。将数据拆分为 80% 的训练和 20% 的测试。

我用 sklearn 的 SVC 和 Naives Bayes 做了实验。结果的准确率分别为 35% 和 42%。但是,当我尝试 sklearn 的 LinearSVC 算法时,它给了我 80% 的结果,这让我感到震惊。

这是代码的一部分:

text_clf = Pipeline([
    ('vect', CountVectorizer(stop_words='english')),
    ('tfidf', TfidfTransformer()),
    ('clf', LinearSVC()),
])
text_clf.fit(train_data, train_target)  

这可能是什么原因?为什么 LinearSVC 表现得非常好?

1个回答

这些模型用于凸优化。这意味着该问题只有一种解决方案。LinearSVC 和 SVC 用于相同目的,但使用的优化技术不同。例如,LinearSVC 拦截会受到惩罚,而在 SVC 中则不会。缩放或默认损失函数可能存在差异。因此它们产生不同的结果。LinearSVC 倾向于更快地优化。在多类分类中,liblinear 默认做一对一,而 libsvm 做一对一。

如果您想知道它们如何产生类似的结果。你可以看看这个问题。 https://stackoverflow.com/q/33843981/5947203

现在 SVN 产生比朴素贝叶斯更好的结果的原因是在这个问题中特征很重要。朴素贝叶斯将它们视为独立的,而 SVN 在一定程度上着眼于它们之间的相互作用。在数学上,一个是概率的,而另一个是几何的。朴素贝叶斯没有捕捉到依赖关系,因此它不会产生好的结果。