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

Sentiment Analysis with Imbalanced Dataset in LightGBM

我正在尝试对 2 类(二进制分类)的数据集执行情绪分析。数据集严重不平衡 70% - 30%。我正在使用 LightGBMPython 3.6 来制作模型和预测输出。

我认为我的模型的数据集效果表现不平衡。我得到了大约 90% 的准确度,但即使我对参数进行了微调,它也没有进一步提高。我不认为这是最大可能的准确度,因为还有其他人的得分比这更好。

我已经用 Textacynltk 清理了数据集。我正在使用 CountVectorizer 对文本进行编码。

我已经尝试 up-sampling 数据集,但结果模型很差(我还没有调整那个模型)

我试过使用 LightGBMis_unbalance 参数,但它并没有给我一个更好的模型。

是否有任何方法可以用来处理这种非常不平衡的数据集?我怎样才能进一步改进我的模型。?我应该尝试下采样吗?或者它是最大可能的准确性。?我怎么能确定呢?

Are there any approaches to follow to handle this type of datasets that are so imbalanced.?

您的数据集几乎是平衡的70/30 接近于相等。使用梯度提升树,可以训练更多不平衡的数据,例如信用评分、欺诈检测和医疗诊断,其中阳性百分比可能低于 1%。

您的问题可能不在于 class 失衡,而在于您使用的 错误的指标。当您计算准确性时,您会隐含地对模型的假阴性和假阳性进行同等的惩罚。但事实真的如此吗?当 classes 不平衡,或者从业务或物理角度来看无法比较时,其他指标(如精度、召回率或 ROC AUC)可能比准确性更有用。对于您的问题,我会推荐 ROC AUC。

也许,你真正想要的是概率class化。如果你想让它保持二进制,请使用用于 classification 的阈值。

How can I further improve my model.?

因为是文本分析,建议更准确的数据清洗。一些开始的方向:

  • 您是否尝试过 lemmatization/stemming 的不同方案?
  • 您如何预处理特殊实体,如数字、笑脸、缩写、公司名称等?
  • 您是否利用搭配,将双字母甚至三字母连同单词一起纳入模型?
  • 你是如何处理否定的?一个 "no" 可能会显着改变意思,而 CountVectorizer 很难理解。
  • 您是否尝试从单词中提取语义,例如匹配同义词或使用预训练模型(如 word2vec 或 fastText)中的词嵌入?

也许基于树的模型不是最好的选择。根据我自己的经验,最好的情绪分析是由逻辑回归或浅层神经网络等线性模型执行的。但是你应该大量规范它们,你应该明智地扩展你的特征,例如使用 TF-IDF。

如果您的数据集很大,您可以尝试深度学习并在您的数据上训练 RNN。 LSTM 通常是许多文本相关问题的最佳模型。

Should I try down-sampling.?

不,您应该永远不要缩减采样,除非您的机器上有太多数据要处理。下采样会在您的数据中产生偏差。

如果您真的很想为您的 class 增加少数 class 的相对重要性,您可以 重新加权观察值 。据我所知,在 LightGBM 中,您可以使用 scale_pos_weight 参数更改 class 权重。

Or is it the maximum possible accuracy.? How can I be sure of it.?

你永远不会知道。但是你可以做一个实验:让几个人给你的测试样本贴上标签,然后相互比较。如果只有 90% 的标签重合,那么即使是人类也无法可靠地 class 验证其余 10% 的样本,所以你已经达到了最大值。

同样,不要过分关注准确性。也许,对于您的业务应用程序,如果您将一些正面评论错误地标记为负面,这没关系,只要成功识别所有负面评论即可。

当数据不平衡时,不会计算准确性,而您应该计算召回率、精度和 F1 分数等指标。你可以使用 sklearn 库 用于计算此类指标,您可以尝试使用不同的值 'weighted' 或 'micro' 对数据进行平均。 请检查以下内容: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support.html