我正在尝试对 2 个类别(二元分类)的数据集执行情感分析。数据集严重不平衡,约为 70% - 30%
。我使用 LightGBM
和 Python 3.6
来制作模型并预测输出。
我认为数据集的不平衡会影响我的模型的性能。我获得了大约 90%
的准确度,但即使我对参数进行了微调,它也没有进一步提高。我认为这不是最大可能的准确度,因为还有其他人的得分比这更好。
我已经使用 Textacy
和 nltk
清理了数据集。我正在使用 CountVectorizer 来编码文本。
我已经尝试对数据集进行上采样
,但结果是模型很差(我还没有调整该模型)
我尝试过使用 LightGBM
的 is_unbalance
参数,但它并没有给我一个更好的模型。
是否有任何方法可以遵循来处理此类如此不平衡的数据集?我怎样才能进一步改进我的模型?我应该尝试下采样吗?或者它是最大可能的精度。?我怎样才能确定呢?
最佳答案
Are there any approaches to follow to handle this type of datasets that are so imbalanced.?
您的数据集几乎是平衡的。 70/30
接近相等。通过梯度增强树,可以训练更多不平衡的数据,例如信用评分、欺诈检测和医疗诊断,其中阳性百分比可能低于 1%。
您的问题可能不在于类别不平衡,而在于您使用的错误指标。当您计算准确性时,您会隐式地对模型的误报和误报进行同等惩罚。但事实真的如此吗?当类别不平衡,或者从业务或物理角度来看无法比较时,其他指标(例如精度、召回率或 ROC AUC)可能比准确性更有用。对于您的问题,我会推荐 ROC AUC。
也许,您真正想要的是概率分类。如果您想保持二进制,请使用用于分类的阈值。
How can I further improve my model.?
因为是文本分析,所以我建议更准确的数据清理。一些开始的方向:
- 您是否尝试过不同的词形还原/词干提取方法?
- 您如何预处理特殊实体,例如数字、表情符号、缩写、公司名称等?
- 您是否通过将二元词甚至三元词与单词一起纳入模型来利用搭配?
- 你是如何处理否定的?一个“不”可能会极大地改变含义,而
CountVectorizer
捕捉不到这一点。 - 您是否尝试过从单词中提取语义,例如匹配同义词或使用来自预训练模型(如 word2vec 或 fastText)的单词嵌入?
也许基于树的模型不是最好的选择。根据我自己的经验,最好的情感分析是通过逻辑回归或浅层神经网络等线性模型进行的。但是你应该对它们进行严格的正则化,并且你应该明智地扩展你的特征,例如与 TF-IDF。
如果您的数据集很大,您可以尝试深度学习并在数据上训练 RNN。 LSTM 通常是解决许多文本相关问题的最佳模型。
Should I try down-sampling.?
不,您不应该永远不要下采样,除非您的机器上需要处理太多数据。下采样会导致数据出现偏差。
如果您确实想提高分类器中少数类别的相对重要性,您可以重新加权观察结果。据我所知,在 LightGBM
中,您可以使用 scale_pos_weight
参数更改类权重。
Or is it the maximum possible accuracy.? How can I be sure of it.?
你永远无法知道。但你可以做一个实验:请几个人给你的测试样本贴上标签,然后相互比较。如果只有 90% 的标签一致,那么即使人类也无法可靠地对其余 10% 的样本进行分类,所以你已经达到了最大值。
再说一次,不要过分关注准确性。也许,对于您的业务应用程序,如果您错误地将一些正面评论标记为负面评论,只要成功识别所有负面评论,就可以了。
关于python-3.x - LightGBM 中不平衡数据集的情感分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47187750/