不平衡数据集上的一类文本分类
Posted
技术标签:
【中文标题】不平衡数据集上的一类文本分类【英文标题】:One Category Text Classification on imbalanced data-set 【发布时间】:2019-07-27 19:51:00 【问题描述】:我从网页文本数据中抓取不平衡数据集并手动将其分类为正类,而另一个否定类可以包含我标记为否定的任何类型的文本数据。 查看数据集,很明显负样本非常少大约。 1200 6000。
负数 = 1200
正 = 4800
最初使用不平衡的端口词干数据集,模型偏向于具有高精度的多数类,这在看不见的数据中表现最差。
所以我采用了1200 Negative和1200 Positive并使其平衡。
我实现了一个 4 层 64 个节点的密集模型 使用 Keras 对 0.5 进行正则化并能够达到 60% 的准确率 在交叉验证中,训练准确率高达 >95%。
看着val_acc
和acc
,我觉得在大约 20 个 epoch 之后完全过拟合。除此之外,由于平衡数据集中的数据行数较少,它也无法泛化。
【问题讨论】:
【参考方案1】:首先,您确定在您认为是负面的 6000 个类别中没有正面类别吗?垃圾进,垃圾出,确保这里不是这种情况。
解决此类问题的方法有哪些
按照我处理问题的顺序。
确保您的数据表示良好。如果你正在处理文本数据,你应该使用像pretrained word2vec这样的词向量,也可以在tensorflow和tensorflow hub中找到(你可以在这里找到更高级的词嵌入方法,比如ELMo。
李>获取更多示例 - 这通常会产生最佳结果(如果执行上述步骤),但需要时间。
尝试不同的算法 - 一些算法并不真正关心类不平衡。我认为决策树及其变体是最突出的。您应该真正检查一下它们,从简单的决策树开始,而不是 random forest 和提升树,如 xgboost、LightGBM 或 catboost,我认为最后三个应该表现得非常相似,xgboost 可能是最佳选择,因为关于这个主题的大量材料。 不同的指标 - 准确度不是最好的,因为它受到负面类的高度激励。使用 precision and recall 等其他指标并关注后者(因为您的算法可能找不到足够的正类)。 加权损失 - 对正样本的错误的权重将高于对负样本的错误。我比下一个更喜欢它,因为模型试图适应数据。 Here 是 Tensorflow 中自定义损失的一个示例。 上采样 - 与您所做的相反,多次为您的模型提供相同的正样本(在本例中每次 5 次,因此有 6000 个正样本,与负样本一样多)。您不会丢失信息,但训练需要更长的时间(总共 7200 个示例基本上不存在问题)。 欠采样 - 你在这里做了什么,但是你丢失了很多关于负类及其特征的信息。更适合更大的数据集,您的数据集很小。 创造性的方法 - 文本数据更难,如果不是这种情况,您可以尝试降维或其他数据表示,这可以找到正点和负点之间差异的根本原因。最难,可能对您的情况没有帮助。One Class SVM 能否提供帮助
怀疑,它用于异常值检测。 7200 个数据点中的 1200 个数据点不应被视为异常值。此外,它可能与负类共享许多特征,并且您无法使用您当前拥有的标记数据。
如果你想尝试一下,sklearn 中有一个实现here。
【讨论】:
感谢您指出采样不足。当我发现我的数据集不平衡并且模型正向大多数班级跳水时,我一直关注 F1 分数而不是准确性。以上是关于不平衡数据集上的一类文本分类的主要内容,如果未能解决你的问题,请参考以下文章