LightGBM 中不平衡数据集的情感分析
Sentiment Analysis with Imbalanced Dataset in LightGBM
我正在尝试对 2 类(二进制分类)的数据集执行情绪分析。数据集严重不平衡 70% - 30%
。我正在使用 LightGBM
和 Python 3.6
来制作模型和预测输出。
我认为我的模型的数据集效果表现不平衡。我得到了大约 90%
的准确度,但即使我对参数进行了微调,它也没有进一步提高。我不认为这是最大可能的准确度,因为还有其他人的得分比这更好。
我已经用 Textacy
和 nltk
清理了数据集。我正在使用 CountVectorizer
对文本进行编码。
我已经尝试 up-sampling
数据集,但结果模型很差(我还没有调整那个模型)
我试过使用 LightGBM
的 is_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
我正在尝试对 2 类(二进制分类)的数据集执行情绪分析。数据集严重不平衡 70% - 30%
。我正在使用 LightGBM
和 Python 3.6
来制作模型和预测输出。
我认为我的模型的数据集效果表现不平衡。我得到了大约 90%
的准确度,但即使我对参数进行了微调,它也没有进一步提高。我不认为这是最大可能的准确度,因为还有其他人的得分比这更好。
我已经用 Textacy
和 nltk
清理了数据集。我正在使用 CountVectorizer
对文本进行编码。
我已经尝试 up-sampling
数据集,但结果模型很差(我还没有调整那个模型)
我试过使用 LightGBM
的 is_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