为啥 Tensorflow tf.learn 分类结果差异很大?

Posted

技术标签:

【中文标题】为啥 Tensorflow tf.learn 分类结果差异很大?【英文标题】:Why do Tensorflow tf.learn classification results vary a lot?为什么 Tensorflow tf.learn 分类结果差异很大? 【发布时间】:2017-01-18 15:38:24 【问题描述】:

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

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"]

准确度分数大致从 54% 到 90% 不等,验证(测试)集中的 21 个文档始终相同。

非常显着的偏差是什么意思?我知道有一些随机因素(例如辍学),但据我了解,模型应该收敛到最优。

我使用单词(引理)、二元组和三元组、情感分数和LIWC scores 作为特征,所以我确实有一个非常高维的特征空间,只有 28 个训练和 21 个验证文档。这会导致问题吗?除了收集更多的训练数据,我如何才能持续改进结果?

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

【问题讨论】:

【参考方案1】:

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

除了收集更多的训练数据之外,我怎样才能持续改进结果?

你几乎不能。这只是小样本进行任何统计分析的简单方法。

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

【讨论】:

我更新了我的帖子:我使用缩减的单词和 n-gram 空间(最多 19k 个特征维度,具体取决于我使用的特征集)。不过,你能澄清一下吗?结果不应该通过“丢弃”(减少权重)不相关的特征或与输出标签不相关的特征来收敛吗?您所说的是否意味着我可以使用特征选择/降维来获得更一致的结果?我的结果仍然至少等于基线,准确率约为 53%。 我的意思是“有这么多的数据,没有任何帮助”,即使在 21 分上估计自己的分数也是无效的,因此你甚至不能说你的模型是好是坏。数据的维度只会使情况变得更糟,但不会改变这样一个事实,即即使这些点在 100 维空间中,这仍然太多了。有了 49 分,您可能会得到一些具有 23 特征的不错的统计数据。使用 10,您可能会说“它大致有一些意义”。超过 10 个就像手相术。 我花了一段时间才明白……嗯,我只是在构建一个原型,我实际上并不需要好的结果,我可以使用一些方法测试和调整代码/模型,而那些随机结果我无法做到这一点。因此,据我了解,将模型拟合到训练数据的方法太多了,其中一些方法比其他方法更适合验证数据,对吧? 问题是,数据量这么少,你无法测试。假设集的简单丰富性远远超出了您的测试样本所能涵盖的范围,因此无论您在“测试集”上得到什么,都与真实数据无关。换言之,您无法从此类实验中得出任何结论。因此,由于获得了一些任意分数,您将创建错误的假设。收集更多数据,这是进行统计分析的唯一方法。

以上是关于为啥 Tensorflow tf.learn 分类结果差异很大?的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记TF042:TF.Learn分布式Estimator深度学习Estimator

学习笔记TF043:TF.Learn 机器学习EstimatorDataFrame监督器Monitors

为啥 TensorFlow 分类示例不使用激活函数?

为啥 Spark ML 感知器分类器的 F1 分数很高,而 TensorFlow 上的相同模型表现很差?

人工智能:TensorFlow 带你进入深度学习的世界

Python中计算TF-IDF(scikit-learn)