我正在尝试使用 python 的 sklearn 包构建一个情感分析引擎。 问题是分析烂番茄对本次 Kaggle 竞赛的评论
https://www.kaggle.com/c/sentiment-analysis-on-movie-reviews
情绪可以采用 5 个可能的值
我正在使用以下分类器
- 多项式朴素贝叶斯
- 逻辑回归
- 随机梯度下降
由于这些都是适合二元分类的线性分类器,因此这是我必须采取的步骤
将训练集和测试集分为 5 个部分,每种情绪一个部分。 假设情绪的可能值为 a、b、c、d、e。因此,在我的数据的第一部分中,我将拥有所有评论,但情绪为“a”的评论将被标记为正面,所有其他评论将被标记为负面。同样,我为其他情感值创建其他部分。
清理全部5个部分的数据
创建一个管道并将所有测试集部分一个接一个地输入到我的分类器中。我将为每个零件存储一个结果。所以对第一个部分进行分类的结果是partOneRes等等。在partOneRes 中标记为积极的任何内容都属于情感“a”。其他部分也类似。
最后我想合并所有 5 个部分的结果。我会看看partOneRes。任何标记为积极的内容都将更改为情绪“a”。我将对所有其他部分执行类似的操作。然后我简单地合并结果。
如果我没有重叠或重复,那就太理想了。但我得到了少量的重复项,这很好。我可以添加一些逻辑来处理这个问题。
我会对所有三个分类器执行此操作,最后我想找出哪个分类器给我最好的结果。
我的问题是我可以看到有很多评论我的分类器无法放入任何类别!为什么会出现这种情况呢?难道是因为数据集太小了?
最佳答案
重申一下,问题在于您训练的五个二元模型并不是相互详尽的。有几种可能性。 首先,您是否对这五种情绪中的每一种都有 100% 清晰的分类,或者是否存在一些公认的分类错误?
您需要一个相互排斥且详尽的集合。你的方法表明但很难保证这个结果。您可能会考虑一个确实可以保证这一点的集成解决方案。多类 SVM 就是其中之一,但可能不太适合您的情况。
如果类别不是 100% 准确,您可以轻松地让所有五个类别拒绝特定的观察结果。这表明您的分类算法需要调整,或者数据本身并不像您希望的那样适合分类。
您还可以检查是否已适当清理该数据;一些错误可能会严重移动类(Class)界限。
我怀疑正在发生的是一种小边界效应:与其他四个类别的组合相比,每个类别都会“拉动”其边界,在最终组之间留下无人认领的领土。
训练后有办法检查分类参数吗?如果是这样,您能想象出所选择的五个边界吗?如果您确实发现了病理性差距,是否可以调整训练参数,例如为训练组提供更大的 epsilon?
我希望这会有所帮助。
关于python - 情感分类中的缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32913155/