2

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

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

我已经用Textacy和清理了数据集nltk。我CountVectorizer用于编码文本。

我已经尝试up-sampling过数据集,但它导致模型很差(我没有调整那个模型)

我曾尝试使用 的is_unbalance参数LightGBM,但它并没有给我一个更好的模型。

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

4

2 回答 2

6

是否有任何方法可以处理这种不平衡的数据集?

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

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

也许,您真正想要的是概率分类。如果您想保持二进制,请使用用于分类的阈值。

我怎样才能进一步改进我的模型。?

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

  • 您是否尝试过不同的词形还原/词干化机制?
  • 您如何预处理特殊实体,如数字、笑脸、缩写、公司名称等?
  • 您是否通过在模型中包含双元组甚至三元组以及单词来利用搭配?
  • 你是如何处理否定的?一个单一的“不”可以极大地改变意思,并且CountVectorizer很难理解。
  • 您是否尝试从单词中提取语义,例如匹配同义词或使用来自 word2vec 或 fastText 等预训练模型的词嵌入?

也许基于树的模型不是最佳选择。以我自己的经验,最好的情感分析是通过逻辑回归或浅层神经网络等线性模型执行的。但是您应该对它们进行大量正则化,并且应该明智地扩展您的功能,例如使用 TF-IDF。

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

我应该尝试下采样吗?

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

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

或者它是最大可能的精度。?我怎么能确定呢。?

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

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

于 2017-11-19T17:30:50.327 回答
0

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

于 2018-04-13T19:57:56.187 回答