机器学习 – 仅有正面文本数据集

我有一个包含数千条与某个主题相关的句子的数据集。我想知道如何构建一个分类器,能够根据文本是否涉及该主题来预测其为“True”或“False”。

我一直在使用Weka(基础分类器)和Tensorflow(神经网络方法)来解决这个问题。

我使用字符串到词向量的方法来预处理数据。

由于没有负样本,我处理的是单一类别。我尝试过使用一类分类器(Weka中的libSVM),但误报率太高,无法使用。

我也尝试过添加负样本,但当预测的文本不属于负样本空间时,我尝试过的分类器(如NB、CNN等)往往会将其预测为误报。我认为这是因为正样本数量庞大所致。

如果有必要,我愿意放弃使用机器学习来预测新数据。

感谢任何帮助


回答:

我的回答基于这样一个假设:对于问题作者的数据集(1000个正样本),添加至少100个负样本是可以接受的,因为我还没有得到作者对此问题的答复。

由于这种检测特定主题的情况看起来像是主题分类的一个特定案例,我建议从使用两个简单类别的分类方法开始,一个类别是你的主题,另一个类别是所有其他主题。

我曾在人脸识别任务中成功使用了相同的方法——起初我构建了一个模型,输出神经元的一个高输出水平表示检测到人脸,低输出水平表示未检测到人脸。

然而,这种方法的准确率太低——低于80%。但当我尝试使用两个输出神经元时——一个类别表示图像中有脸,另一个类别表示图像中无脸,这时即使没有使用CNN,我的MLP模型的准确率也超过了90%。

这里的关键点是使用SoftMax函数作为输出层。这显著提高了准确率。根据我的经验,它甚至将MNIST数据集的MLP模型准确率从92%提高到了97%,使用的是相同的模型。

关于数据集。从我的经验来看,大多数具有训练器的分类算法在训练数据集中每个类别的样本数量相等时效率更高。事实上,如果一个类别的样本数量少于其他类别平均数量的10%,这会使模型对该类别的检测几乎无用。因此,如果你的主题有1000个样本,我建议创建1000个尽可能包含不同主题的样本。

或者,如果你不想为你的数据集创建如此大的负样本集,你可以创建一个较小的负样本集,并使用批量训练,批量大小为你的负样本数量的2倍。为此,将你的正样本分成n个块,每个块的大小约为负样本数量,并在每次训练迭代中使用chunk[i]的正样本和所有负样本进行N批次的训练。请注意,这种权衡的代价将是较低的准确率。

此外,你可以考虑创建一个更通用的主题检测器——找出模型应该分析的文本中可能出现的所有主题,例如10个主题,并为每个主题创建一个包含1000个样本的训练数据集。这也可以提高准确率。关于数据集的另一个要点是,最佳实践是仅用数据集的一部分进行训练,例如80%,并使用剩余的20%进行交叉验证。这种对模型之前未知数据的交叉验证将为你提供模型在现实生活中的准确率的良好估计,而不是针对训练数据集,并有助于避免过拟合问题。

关于构建模型。我喜欢采用“从简单到复杂”的方法。因此,我建议从使用SoftMax输出的简单MLP模型和包含1000个正样本和1000个负样本的数据集开始。在达到80%-90%的准确率后,你可以考虑为你的模型使用CNN,我还建议增加训练数据集的数量,因为深度学习算法在大数据集上效率更高。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注