在LightGBM中处理不平衡数据集的情感分析

3
我正在尝试对一个包含两个类别 (二元分类) 的数据集进行情感分析。这个数据集非常不平衡,大约有70% - 30%的比例。我使用 LightGBMPython 3.6 来构建模型和进行输出预测。
我认为数据集的不平衡会影响我的模型效果。我得到了大约90%的准确率,但是即使我进行参数调优,它也不能进一步提高。我认为这不是最大可能的精度,因为还有其他人的得分比这个更好。
我使用 Textacynltk 清理了数据集。我使用 CountVectorizer 对文本进行编码。
我尝试过 上采样 数据集,但结果是模型效果很差(我没有对该模型进行调优)。
我尝试使用 LightGBMis_unbalance 参数,但它并不能给我更好的模型。
有没有什么方法可以处理这种极度不平衡的数据集?如何进一步提高我的模型?我应该尝试下采样吗?或者这已经是最大可能的精度了?我怎样才能确定呢?
2个回答

6
有没有一些处理这种极度不平衡数据集的方法可以遵循?
你的数据集几乎是平衡的。70/30接近相等。使用梯度提升树,可以在更不平衡的数据上进行训练,例如信用评分、欺诈检测和医疗诊断,其中正例的百分比可能小于1%。
你的问题可能不在于类别不平衡,而在于你使用的指标不正确。当你计算准确率时,你隐含地同样惩罚了模型的假阴性和假阳性。但这真的是这样吗?当类别不平衡或从业务或物理角度来看不可比较时,其他指标如精确率、召回率或ROC AUC可能比准确率更有用。对于你的问题,我建议使用ROC AUC。
也许你真正想要的是概率分类。如果你想保持二元,可以调整用于分类的阈值。
如何进一步改善我的模型?
因为它是文本分析,所以我建议更准确的数据清洗。一些开始的方向:
- 你尝试过不同的词形还原/词干提取方法吗? - 你如何预处理特殊实体,如数字、表情符号、缩写、公司名称等? - 你是否利用了搭配,将二元组甚至三元组与单词一起包含在模型中? - 你如何处理否定?一个"no"就可以戏剧性地改变意义,而CountVectorizer捕捉得很差。 - 你尝试从单词中提取语义吗?例如匹配同义词或使用预训练模型(如word2vec或fastText)的单词嵌入?
也许基于树的模型不是最佳选择。根据我的经验,最好的情感分析是通过像逻辑回归或浅层神经网络这样的线性模型执行的。但你应该对它们进行严格的正则化,并明智地缩放你的特征,例如使用TF-IDF。
如果你的数据集很大,你可以尝试深度学习并在数据上训练RNN。LSTM通常是许多文本相关问题的最佳模型。
我应该尝试降采样吗?
不,你不应该降采样,除非你有太多数据要在你的机器上处理。降采样会在你的数据中引入偏差。
如果你真的想增加少数类别的相对重要性,可以重新加权观察值。据我所知,在LightGBM中,你可以使用scale_pos_weight参数更改类别权重。
或者这是最大可能的准确率吗?我怎么能确定呢?

你永远无法确知。但你可以做一个实验:请几个人对你的测试样本进行标注,然后将它们相互比较。如果只有90%的标签重合,那么即使是人类也不能可靠地对剩下的10%的样本进行分类,所以你已经达到了极限。

同样,不要过于强调准确性。也许对于你的业务应用来说,如果将一些正面评论错误地标记为负面评论,只要所有的负面评论都能被成功识别出来就没关系。


感谢提供的信息。我已经使用Textacy清理了数据中的数字、表情等内容,同时也尝试了不同的StemmersLemmatisations - Sreeram TP
我尝试了使用auc作为度量标准,但没有显示出改进。由于无法在我的机器上找到该模型,因此我还没有使用word2vec - Sreeram TP
我尝试使用Keras训练LSTM,但结果并不是很令人满意。 - Sreeram TP
你能为我解释一下或者提供一个链接,关于如何将 bigrams 应用到数据中吗? - Sreeram TP
@SreeramTP,最简单的加入二元组的方法是通过调整CountVectorizer.ngram_range参数。 - David Dale

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接