一种基于不平衡数据集的类别文本分类

时间:2019-03-06 07:57:24

标签: tensorflow machine-learning keras svm text-classification

我正在从网页文本数据抓取的不平衡数据集,并且手动将其分类为肯定类,而另一个否定类可以包含任何类型的文本数据,我已将其标记为否定。 查看数据集后,很明显,负样本大约少得多。在6000中 1200

负= 1200

正值= 4800

最初,使用不平衡的端口词干数据集,该模型以较高的准确度偏向多数类,在看不见的数据中表现最差。

  

所以我选择了 1200负值和1200正值并使它保持平衡

     

我实现了一个4层的64个节点的密集模型,   使用Keras进行0.5的正则化,能够达到60%的精度   在交叉验证中,而火车的准确性高达> 95%。

看着val_accacc,我觉得在大约20个时期后完全过度拟合。除此之外,由于平衡数据集中的数据行数较少,因此无法一概而论。

  • 有哪些方法可以解决此类问题?
  • 一类SVM可以帮助进行单一类别的文本分类吗?
  • 如果一个Class SVM可以提供帮助,那么任何人都可以提供其实现的基本示例或资源吗?

1 个答案:

答案 0 :(得分:4)

首先,您确定在您认为否定的6000个分类中没有正面分类吗?倒入垃圾,确保这里不是这种情况。

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

按照顺序我将解决问题。

  • 确保您的数据表示正确。如果您要处理文本数据,则应使用pretrained word2vectensorflow中的tensorflow hub之类的词向量(您可以在此处找到{{3}这样的更高级的词嵌入方法) }。

  • 获取更多示例-该示例通常应该产生最佳结果(如果执行上述步骤),但是会花费时间。

  • 尝试不同的算法-有些算法并不真正关心类的不平衡。我认为决策树及其变体是最突出的。实际上,您应该从简单的决策树开始检查它们,而不是从ELMorandom forestxgboostLightGBM之类的增强树,我认为最后三个应该表现得非常相似,由于有关此主题的资料很多,xgboost可能是最佳选择。
  • 不同的指标-准确性不是最好的指标,因为否定因素会极大地激发准确性。使用其他指标,例如catboost并专注于后者(因为您的算法可能找不到足够的肯定类)。
  • 加权损失-正面示例所产生的错误的权重将高于负面示例所犯的错误。我喜欢它比下一个更好,因为该模型试图适应数据。 precision and recall是Tensorflow中自定义损失的一个示例。
  • 上采样-与您所做的相反,多次为模型提供相同的正例(在这种情况下,每次5次,因此有6000个正例,与负数一样多)。您不会丢失信息,但是培训会花费更长的时间(总共7200个示例基本上不存在问题)。
  • 欠采样-您在此处所做的事情,但是您正在丢失很多有关否定类及其特征的信息。对于较大的数据集来说更好,而您的数据集很小。
  • 创造性的方法-文本数据很难处理,如果不是这种情况,则可以尝试降维或以其他方式表示数据,这可能找到正负差异的根本原因。最困难,可能对您没有帮助。

一类SVM可以帮助

怀疑它,用于离群值检测。 7200中的1200个数据点不应视为异常值。此外,它可能与否定类共享许多功能,并且您无法利用当前拥有的标签数据。

如果您仍然想尝试,可以在sklearn Here中实现。