Machine learning 为什么Tensorflow tf.learn分类结果差异很大?

Machine learning 为什么Tensorflow tf.learn分类结果差异很大?,machine-learning,tensorflow,classification,deep-learning,text-classification,Machine Learning,Tensorflow,Classification,Deep Learning,Text Classification,我使用TensorFlow高级APItf。learn为一系列二进制文本分类训练和评估DNN分类器(实际上我需要多标签分类,但目前我分别检查每个标签)。我的代码与 准确度得分大致在54%到90%之间变化,验证(测试)集中有21个文档始终相同 非常显著的偏差意味着什么?我知道有一些随机因素(例如辍学),但据我所知,模型应该收敛到最佳值 我使用单词(引理)、双和三叉图、情绪分数和as特征,因此我有一个非常高维的特征空间,只有28个训练和21个验证文档。这会引起问题吗?除了收集更多培训数据外,我如何持续

我使用TensorFlow高级API
tf。learn
为一系列二进制文本分类训练和评估DNN分类器(实际上我需要多标签分类,但目前我分别检查每个标签)。我的代码与

准确度得分大致在54%到90%之间变化,验证(测试)集中有21个文档始终相同

非常显著的偏差意味着什么?我知道有一些随机因素(例如辍学),但据我所知,模型应该收敛到最佳值

我使用单词(引理)、双和三叉图、情绪分数和as特征,因此我有一个非常高维的特征空间,只有28个训练和21个验证文档。这会引起问题吗?除了收集更多培训数据外,我如何持续改进结果


更新:为了澄清这一点,我生成了一个包含出现词和n-gram的词典,并丢弃了那些只出现1次的词,因此我只使用语料库中存在的词(n-gram)。

这与TensorFlow无关。这个数据集非常小,因此您可以获得任何结果。你有28+21个点,在一个有“无限”维度的空间中(大约有1000000个英文单词,因此有10^18个三角形,但是其中一些不存在,并且肯定它们在你的49个文档中不存在,但你仍然至少有1000000个维度)。对于这样的问题,您必须预期结果的巨大差异

除了收集更多培训数据外,我如何持续改进结果

你几乎不能。这是一种简单的小样本统计分析方法


因此,您最好更改评估方案,而不是将数据拆分为28/21,进行10倍交叉验证,分数约为50分。这意味着您必须运行10个实验,每个实验包含45个培训文档和4个测试文档,并平均结果。这是减少方差的唯一方法,但请记住,即使使用CV,如此小的数据集也无法保证模型在“野外”(一旦应用于以前从未见过的数据)的实际表现如何

这与TensorFlow无关。这个数据集非常小,因此您可以获得任何结果。你有28+21个点,在一个有“无限”维度的空间中(大约有1000000个英文单词,因此有10^18个三角形,但是其中一些不存在,并且肯定它们在你的49个文档中不存在,但你仍然至少有1000000个维度)。对于这样的问题,您必须预期结果的巨大差异

除了收集更多培训数据外,我如何持续改进结果

你几乎不能。这是一种简单的小样本统计分析方法


因此,您最好更改评估方案,而不是将数据拆分为28/21,进行10倍交叉验证,分数约为50分。这意味着您必须运行10个实验,每个实验包含45个培训文档和4个测试文档,并平均结果。这是减少方差的唯一方法,但请记住,即使使用CV,如此小的数据集也无法保证模型在“野外”(一旦应用于以前从未见过的数据)的实际表现如何

我更新了我的帖子:我使用缩减的单词和n-gram空格(根据我使用的功能集,最多19k个功能维度)。不过,你能澄清一下吗?结果是否应该通过“丢弃”(减少权重)不相关的特征或与输出标签不相关的特征而不收敛?您所说的是否意味着我可以使用特征选择/降维来获得更一致的结果?我的结果至少与基准线相当,准确率约为53%。我说的是“有这么多数据,没有任何帮助”,即使估计21分的分数本身也是无效的,因此你甚至不能说你的模型是好是坏。数据的维数只会让情况变得更糟,但并不能改变这样一个事实,即即使这些点位于100维空间中,这仍然太多了。有了49分,你可能会有一些相当不错的统计数据,包括2到3个功能。有了10,你可能会说“这大概有点道理”。有超过10个孩子,就像手淫一样。我花了一段时间才明白。。。嗯,我只是在构建一个原型,实际上我并不需要好的结果,我可以用一些方法来测试和调整代码/模型,而这些随机结果我无法做到这一点。因此,据我所知,有太多的方法可以将模型与训练数据相匹配,其中一些方法比其他方法更适合验证数据,对吗?问题是,对于如此少量的数据,您无法进行测试。简单地说,假设集的丰富程度远远超出了测试样本所能涵盖的范围,因此,无论您在“测试集”上得到什么,都与真实数据无关。换句话说,你不能从这些实验中得出任何结论。因此,由于获得了一些任意分数,您将创建错误的假设。收集更多数据,这是进行统计分析的唯一方法。我更新了我的帖子:我使用缩减的单词和n-gram空格(最多19k个特征维度,取决于我使用的特征集)。不过,你能澄清一下吗?结果是否应该通过“丢弃”(减少权重)不相关的特征或与输出标签不相关的特征而不收敛?您所说的是否意味着我可以使用特征选择/降维来获得更一致的结果?我的结果至少与基线相当,准确率约为53%。我说的是“有那么多的数据,而不是
classifier = tf.contrib.learn.DNNClassifier(
    hidden_units=[10],
    n_classes=2,
    dropout=0.1,
    feature_columns=tf.contrib.learn.infer_real_valued_columns_from_input(training_set.data))
classifier.fit(x=training_set.data, y=training_set.target, steps=100)
val_accuracy_score = classifier.evaluate(x=validation_set.data, y=validation_set.target)["accuracy"]