我正在尝试使用Python的sklearn包构建一个情感分析引擎。问题在于分析烂番茄影评,这是在Kaggle竞赛中的一个项目
https://www.kaggle.com/c/sentiment-analysis-on-movie-reviews
情感可以有五种可能的值
我使用了以下分类器
- 多项式朴素贝叶斯
- 逻辑回归
- 随机梯度下降
由于这些都是适合二元分类的线性分类器,我需要采取以下步骤
-
将训练集和测试集分成五个部分,每个部分对应一种情感。假设情感的可能值为a、b、c、d、e。那么在我的数据的第一部分中,我将拥有所有评论,但标记为情感’a’的评论将被标记为正面,其余所有评论将被标记为负面。同样,我为其他情感值创建其他部分。
-
清理所有五个部分的数据
-
创建一个管道,并将所有测试集部分依次输入到我的分类器中。我将为每个部分存储一个结果。因此,分类第一部分的结果是partOneRes,依此类推。在partOneRes中标记为正面的任何内容都属于情感’a’。其他部分也是如此处理。
-
最后,我希望将所有五个部分的结果结合起来。我会查看partOneRes。任何标记为正面的内容将被更改为情感’a’。我将对所有其他部分进行类似的处理。然后我只需合并结果。
-
理想情况下,我不会有重叠或重复的情况。但我确实有少量的重复,这是可以接受的。我可以添加一些逻辑来处理这个问题。
-
我将对所有三个分类器执行此操作,最后我想找出哪个分类器给我带来的结果最佳。
我的问题是,我可以看到许多评论我的分类器无法归入任何类别!为什么会这样?这是否因为数据集的规模较小?
回答:
重申一下,问题在于你训练的五个二元模型并非相互排斥的。有几种可能。首先,你对五种情感的分类是否完全准确,或者是否有一些已知的分类错误?
你需要一个既相互排斥又完全覆盖的数据集。你的方法暗示了这一点,但几乎不能保证这一结果。你可以考虑一个集成解决方案,这样可以保证这一点。多类支持向量机就是这样一种方法,但可能不适用于你的情况。
如果类别不是100%准确,你很容易让所有五个分类器拒绝一个特定的观察。这表明你的分类算法需要调整,或者数据本身并不像你希望的那样适合分类。
你还可以检查你是否适当地清理了数据;一些错误可能会严重影响类别边界。
我怀疑发生的情况是小边界效应:每个类别在与其他四个类别的组合进行比较时,“拉近”其边界,留下了最终集合之间的未被认领的区域。
你有办法在训练后检查分类参数吗?如果有,你能可视化选定的五个边界吗?如果你发现病态的间隙,是否有可以调整的训练参数,比如给训练组一个更大的epsilon?
希望这些对你有帮助。