为什么 Tensorflow tf.learn 分类结果相差很大?
Why do Tensorflow tf.learn classification results vary a lot?
我使用 TensorFlow high-level 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 作为特征,所以我确实有一个非常高维的特征 space,只有 28 个训练和 21 个验证文件。这会导致问题吗?除了收集更多的训练数据之外,如何持续改进结果?
更新:为了澄清,我生成了一个包含出现的词和 n-gram 的字典,并丢弃那些只出现一次的词,所以我只使用语料库中存在的词(n-gram)。
这与 TensorFlow 无关。这个数据集小得离谱,因此你可以获得任何结果。你有 28 + 21 个点,在一个 space 中有 "infinite" 个维度(大约有 1,000,000 个英文单词,因此有 10^18 个三元组,但是其中一些不存在,并且可以肯定它们不存在于您的 49 个文档中,但您仍然至少有 1,000,000 个维度)。对于此类问题,您必须预料到 巨大 结果的差异。
How can I consistently improve the results apart from collecting more training data?
你几乎不能。这是对小样本进行任何统计分析的简单方法。
因此,您能做的最好的事情是 更改评估方案 而不是将数据拆分为 28/21 进行 10 折交叉验证,大约 50 分这意味着您将拥有to 运行 10个实验,每个实验有45个训练文档和4个测试文档,取平均结果。这是减少方差的唯一方法,但请记住,即使使用 CV,如此小的数据集也无法保证无法保证您的模型实际表现如何"in the wild"(一旦应用于以前从未见过的数据)。
我使用 TensorFlow high-level 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 作为特征,所以我确实有一个非常高维的特征 space,只有 28 个训练和 21 个验证文件。这会导致问题吗?除了收集更多的训练数据之外,如何持续改进结果?
更新:为了澄清,我生成了一个包含出现的词和 n-gram 的字典,并丢弃那些只出现一次的词,所以我只使用语料库中存在的词(n-gram)。
这与 TensorFlow 无关。这个数据集小得离谱,因此你可以获得任何结果。你有 28 + 21 个点,在一个 space 中有 "infinite" 个维度(大约有 1,000,000 个英文单词,因此有 10^18 个三元组,但是其中一些不存在,并且可以肯定它们不存在于您的 49 个文档中,但您仍然至少有 1,000,000 个维度)。对于此类问题,您必须预料到 巨大 结果的差异。
How can I consistently improve the results apart from collecting more training data?
你几乎不能。这是对小样本进行任何统计分析的简单方法。
因此,您能做的最好的事情是 更改评估方案 而不是将数据拆分为 28/21 进行 10 折交叉验证,大约 50 分这意味着您将拥有to 运行 10个实验,每个实验有45个训练文档和4个测试文档,取平均结果。这是减少方差的唯一方法,但请记住,即使使用 CV,如此小的数据集也无法保证无法保证您的模型实际表现如何"in the wild"(一旦应用于以前从未见过的数据)。