python-3.x - LightGBM 中不平衡数据集的情感分析

标签 python-3.x machine-learning nlp sentiment-analysis lightgbm

我正在尝试对 2 个类别(二元分类)的数据集执行情感分析。数据集严重不平衡,约为 70% - 30%。我使用 LightGBMPython 3.6 来制作模型并预测输出。

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

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

我已经尝试对数据集进行上采样,但结果是模型很差(我还没有调整该模型)

我尝试过使用 LightGBMis_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/

相关文章:

python-3.x - 如何使用包含 numpy.ndarrays 的列/列对 pandas 数据框执行 StandardScaler?

python - SQLAlchemy 使用连接检查约束

python - 如何对列表中的多个字符串进行切片?

python - 复杂数据集拆分 - StratifiedGroupShuffleSplit

python - 如何在确保向前兼容性的同时保存 Gensim 模型?

python - Python 如何知道我想要将我未定义的数字加倍? (初学者)

python - 从数据集中读取 python 中的 *.dat 文件

python - Matplotlib 中的意外缺口箱线图、Seaborn 中的错误

java - 词类的在线(最好)查找 API

nlp - CoreNLP 斯坦福依赖格式