机器学习 - 巨大的唯一正文本数据集
Machine Learning - Huge Only positive text dataset
我有一个数据集,其中包含属于一个主题的数千个句子。我想知道什么是最好的创建一个 classifier 将预测文本为 "True" 或 "False" 取决于他们是否谈论该主题。
我一直在使用 Weka(基本 classifier)和 Tensorflow(神经网络方法)的解决方案。
我使用字符串到词向量来预处理数据。
由于没有负样本,我处理一个class。我试过一个-class classifier(Weka中的libSVM)但是误报的数量太高了我不能使用它。
我也尝试添加负样本,但是当要预测的文本不属于负样本时 space,我尝试过的 classifiers(NB、CNN、...)倾向于将其预测为误报。我猜是因为大量的阳性样本
如果有必要,我愿意放弃 ML 作为预测新传入数据的工具
感谢您的帮助
我的回答是基于这样的假设,即为作者的数据集添加至少 100 个负样本和 1000 个正样本对于问题的作者来说是可以接受的,因为我对作者的问题没有答案还
由于这种检测特定主题的情况看起来像是主题的特殊情况 classification 我建议使用 classification 方法和两个简单的 classes 1 class – 你的主题和另一个 – 开始的所有其他主题
我用同样的方法成功地完成了人脸识别任务——一开始我用一个输出神经元建立模型,人脸检测的输出水平高,如果没有检测到人脸则输出水平低
然而,这种方法给我的准确率太低了——不到 80%
但是当我尝试使用 2 个输出神经元时——1 个 class 用于图像上的人脸存在,另一个如果没有在图像上检测到人脸,那么它给了我超过 90% 的 MLP 准确度,即使不使用 CNN
这里的重点是输出层使用SoftMax函数。它显着提高了准确性。根据我的经验,对于同一模型,它甚至将 MLP 的 MNIST 数据集的准确性从 92% 提高到 97%
关于数据集。大多数 class 带有训练器的化算法,至少从我的经验来看,训练数据集中每个 class 的样本数量相等时效率更高。事实上,如果我的 1 class 少于其他 class 平均数量的 10%,那么模型对于检测这个 class 几乎毫无用处。因此,如果您的主题有 1000 个样本,那么我建议创建 1000 个样本,其中包含尽可能多的不同主题
或者,如果您不想为您的数据集创建如此大的负样本集,您可以为您的数据集创建一个较小的负样本集,并使用大小为 batch = 2 倍的批量训练负样本数量。为了做到这一点,将您的正样本分成 n 个块,每个块的大小〜负样本数量,并且在训练过程的每次迭代中用 N 批次训练您的 NN,其中正样本块 [i] 和所有负样本对于每批。请注意,较低的准确性将是这种权衡的代价
此外,您可以考虑创建更通用的主题检测器 – 找出所有可能出现在模型应该分析的文本中的主题,例如 – 10 个主题并创建一个训练数据集,每个主题有 1000 个样本.它还可以提供更高的准确性
关于数据集的另一点。最佳做法是仅使用数据集的一部分来训练您的模型,例如 – 80%,并将其余 20% 用于交叉验证。这种对模型先前未知数据的交叉验证将使您对现实生活中的模型准确性有一个很好的估计,而不是针对训练数据集,并且可以避免过度拟合问题
关于模型的构建。我喜欢用 "from simple to complex" 方法来做。所以我建议从带有 SoftMax 输出的简单 MLP 和包含 1000 个正样本和 1000 个负样本的数据集开始。在达到 80%-90% 的准确率后,你可以考虑使用 CNN 作为你的模型,而且我建议增加训练数据集的数量,因为深度学习算法在更大的数据集上效率更高
我最终为负 class 添加了数据,并构建了一个多线朴素贝叶斯 classifier,它正在按预期完成工作。
(添加的数据大小约为一百万个样本:))
对于文本数据,您可以使用 Spy EM。
基本思想是将您的正集与一大堆随机样本结合起来,其中一些是您保留的。您最初将所有随机文档视为负样本 class,并使用您的正样本和这些负样本训练一个 classifier。
现在,其中一些随机样本实际上是阳性的,您可以保守地重新标记得分高于最低得分的任何文档,以保留真正的阳性样本。
然后你重复这个过程直到它稳定。
我有一个数据集,其中包含属于一个主题的数千个句子。我想知道什么是最好的创建一个 classifier 将预测文本为 "True" 或 "False" 取决于他们是否谈论该主题。
我一直在使用 Weka(基本 classifier)和 Tensorflow(神经网络方法)的解决方案。
我使用字符串到词向量来预处理数据。
由于没有负样本,我处理一个class。我试过一个-class classifier(Weka中的libSVM)但是误报的数量太高了我不能使用它。
我也尝试添加负样本,但是当要预测的文本不属于负样本时 space,我尝试过的 classifiers(NB、CNN、...)倾向于将其预测为误报。我猜是因为大量的阳性样本
如果有必要,我愿意放弃 ML 作为预测新传入数据的工具
感谢您的帮助
我的回答是基于这样的假设,即为作者的数据集添加至少 100 个负样本和 1000 个正样本对于问题的作者来说是可以接受的,因为我对作者的问题没有答案还
由于这种检测特定主题的情况看起来像是主题的特殊情况 classification 我建议使用 classification 方法和两个简单的 classes 1 class – 你的主题和另一个 – 开始的所有其他主题
我用同样的方法成功地完成了人脸识别任务——一开始我用一个输出神经元建立模型,人脸检测的输出水平高,如果没有检测到人脸则输出水平低
然而,这种方法给我的准确率太低了——不到 80% 但是当我尝试使用 2 个输出神经元时——1 个 class 用于图像上的人脸存在,另一个如果没有在图像上检测到人脸,那么它给了我超过 90% 的 MLP 准确度,即使不使用 CNN
这里的重点是输出层使用SoftMax函数。它显着提高了准确性。根据我的经验,对于同一模型,它甚至将 MLP 的 MNIST 数据集的准确性从 92% 提高到 97%
关于数据集。大多数 class 带有训练器的化算法,至少从我的经验来看,训练数据集中每个 class 的样本数量相等时效率更高。事实上,如果我的 1 class 少于其他 class 平均数量的 10%,那么模型对于检测这个 class 几乎毫无用处。因此,如果您的主题有 1000 个样本,那么我建议创建 1000 个样本,其中包含尽可能多的不同主题
或者,如果您不想为您的数据集创建如此大的负样本集,您可以为您的数据集创建一个较小的负样本集,并使用大小为 batch = 2 倍的批量训练负样本数量。为了做到这一点,将您的正样本分成 n 个块,每个块的大小〜负样本数量,并且在训练过程的每次迭代中用 N 批次训练您的 NN,其中正样本块 [i] 和所有负样本对于每批。请注意,较低的准确性将是这种权衡的代价
此外,您可以考虑创建更通用的主题检测器 – 找出所有可能出现在模型应该分析的文本中的主题,例如 – 10 个主题并创建一个训练数据集,每个主题有 1000 个样本.它还可以提供更高的准确性 关于数据集的另一点。最佳做法是仅使用数据集的一部分来训练您的模型,例如 – 80%,并将其余 20% 用于交叉验证。这种对模型先前未知数据的交叉验证将使您对现实生活中的模型准确性有一个很好的估计,而不是针对训练数据集,并且可以避免过度拟合问题
关于模型的构建。我喜欢用 "from simple to complex" 方法来做。所以我建议从带有 SoftMax 输出的简单 MLP 和包含 1000 个正样本和 1000 个负样本的数据集开始。在达到 80%-90% 的准确率后,你可以考虑使用 CNN 作为你的模型,而且我建议增加训练数据集的数量,因为深度学习算法在更大的数据集上效率更高
我最终为负 class 添加了数据,并构建了一个多线朴素贝叶斯 classifier,它正在按预期完成工作。
(添加的数据大小约为一百万个样本:))
对于文本数据,您可以使用 Spy EM。
基本思想是将您的正集与一大堆随机样本结合起来,其中一些是您保留的。您最初将所有随机文档视为负样本 class,并使用您的正样本和这些负样本训练一个 classifier。
现在,其中一些随机样本实际上是阳性的,您可以保守地重新标记得分高于最低得分的任何文档,以保留真正的阳性样本。
然后你重复这个过程直到它稳定。