不平衡数据集上的一类文本分类

One Category Text Classification on imbalanced data-set

我正在从网页文本数据中获取不平衡数据集,并且手动class把它变成positiveclass,而另一个negativeclass可以有任何类型的文本数据我已将其标记为 negative。 查看数据集,很明显负样本 非常少 大约。 1200 满分 6000。

负 = 1200

正 = 4800

最初使用不平衡的端口词干数据集,模型偏向多数 class 具有高精度,这在看不见的数据中表现最差。

So I took 1200 Negative and 1200 Positive and made it balanced.

I implemented a Dense Model of 64 nodes in 4 layers with regularization of 0.5 using Keras and was able to achieve 60% accuracy in cross-validation while train accuracy goes as high as up to >95%.

val_accacc我觉得在大约20个epoch后完全过拟合。除此之外,由于平衡数据集中的数据行数较少,它也无法泛化。

首先,您确定在您认为是负数的那 6000 个中没有正数 class?垃圾进,垃圾出,确保不是这里的情况。

解决此类问题的方法有哪些

按照我处理问题的顺序。

  • 确保您的数据表示良好。如果你正在处理文本数据,你应该使用像 pretrained word2vec, also available in tensorflow and tensorflow hub (you can find a more advanced approach to word embeddings here like ELMo.

  • 这样的词向量
  • 获取更多示例 - 这个示例通常会产生最佳结果(如果执行了上述步骤),但需要时间。

  • 尝试不同的算法 - 有些算法并不真正关心 class 不平衡。我认为决策树及其变体是最突出的。你真的应该检查它们,从简单的决策树开始,而不是 random forest and boosted trees like xgboost, LightGBM or catboost,我认为最后三个应该表现得非常相似,xgboost 可能是最好的选择,因为关于这个主题的材料很多。
  • 不同的指标 - 准确性不是最好的指标,因为它受到负面影响 class。使用其他指标,如 precision and recall 并关注后者(因为你的算法可能没有找到足够的积极 classes)。
  • 加权损失 - 正例错误的权重高于负例错误。我比下一个更喜欢它,因为模型试图适应数据。 Here 是 Tensorflow 中自定义损失的示例。
  • 上采样 - 与您所做的相反,多次为您的模型提供相同的正面示例(在这种情况下每次 5 次,因此有 6000 个正面示例,与负面示例一样多)。您不会丢失信息,但训练时间更长(基本上不存在总共 7200 个示例的问题)。
  • 欠采样 - 你在这里做了什么,但是你丢失了很多关于负面 class 及其特征的信息。对于更大的数据集更好,你的数据集很小。
  • 创造性方法 - 文本数据更难,如果不是这种情况,您可以尝试降维或其他数据表示,这可以找到正负点之间差异的根本原因。最难,可能对你的情况没有帮助。

可以吗 Class SVM 帮助

怀疑,它是用来做异常值检测的。 7200 个数据点中的 1200 个不应被视为异常值。此外,它可能与负面 class 共享很多功能,并且您无法使用当前拥有的标记数据。

如果你想尝试一下,sklearn 中有一个实现 here