我使用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个文档始终相同。
非常显着的偏差是什么意思?我知道有一些随机因素(例如辍学),但根据我的理解,模型应该收敛到最佳状态。
我使用单词(lemmas),双字母和三字母,情感分数和LIWC scores作为特征,因此我确实有一个非常高维的特征空间,只有28个训练和21个验证文档。这会引起问题吗?除了收集更多的培训数据外,我怎样才能不断改进结果?
更新:为了澄清,我生成一个发生单词和n-gram的字典并丢弃那些只发生过一次的字典,所以我只使用语料库中存在的单词(n-gram)。
答案 0 :(得分:2)
这与TensorFlow无关。此数据集非常小,因此您可以获得任何结果。你有28 + 21分,在一个具有“无限”维度的空间中(大约有1,000,000个英语单词,因此有10 ^ 18个三元组,但是其中一些不存在,并且肯定它们不存在于你的49文件,但你仍然至少有1,000,000个维度)。对于此类问题,您必须预期结果的巨大方差。
除了收集更多的培训数据外,我怎样才能不断提高结果?
你几乎不能。这是对小样本进行任何统计分析的简单方法。
因此,您可以做的最好的是更改评估方案,而不是将数据拆分为28/21做10倍交叉验证,大约50分这意味着您将需要运行10个实验,每个人有45个培训文件和4个测试文件,并对结果取平均值。这是你可以做的唯一减少方差的事情,但要记住,即使使用CV,数据集如此之小也会让你无保证你的模型在“狂野”中的实际表现如何(一旦应用于从未见过数据)。