TensorFlow 中的神经网络比随机森林效果更差,并且每次都预测相同的标签

Posted

技术标签:

【中文标题】TensorFlow 中的神经网络比随机森林效果更差,并且每次都预测相同的标签【英文标题】:Neural Network in TensorFlow works worse than Random Forest and predict the same label each time 【发布时间】:2017-03-20 10:23:40 【问题描述】:

我是 DNN 和 TesorFlow 的新手。 我在使用 NN 进行二进制分类时遇到问题。

作为输入数据,我有文本数据集,由 TF-IDF 转换为数值向量。

训练数据集的行数为 43 000 特征数 4235

我尝试使用 TFlearn 库,然后使用 Keras io。但结果是一样的 - NN 只预测一个标签 0 或 1,并给出比随机森林更差的准确度。

我将添加用于 NN 构建的脚本。请告诉我它有什么问题。

model = Sequential()

model.add(Dense(100, input_dim=4235, init='uniform', activation='relu'))
model.add(Dense(4235, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X_train, y_train, nb_epoch=100, batch_size=10,  verbose=2)

【问题讨论】:

【参考方案1】:

仅凭您提供的信息就有很多可能的原因,还有很多您可以尝试改进的地方,但从高层次来看,这是我的经验中最重要的几项。如果您已经检查了大部分内容,我深表歉意:

数据量

当没有足够的数据时,深度学习实际上可能比“经典”机器学习(例如树、支持向量机)表现更差。多少足够取决于任务,但作为一个宽松的经验法则,您可能希望拥有与您拥有的数据量大致相同数量级的模型参数。在您发布的模型中,您有 100 x 4235 + 100 x 4235 + 4235 * 1 = 851,235 个参数。

正则化

从您发布的代码看来,您没有使用任何正则化(例如 dropout 或 L2),也没有使用验证集来衡量训练集中模型的质量。您的模型可能过度拟合训练集。

架构

对于文本建模,通常使用 RNN(例如 LSTM 或 GRU)或 CNN,而不是密集/全连接层。 RNN 和 CNN 包含对 Dense 层中不存在的模型序列的架构约束。换句话说,密集层缺乏关于数据类型的先验知识,因此它们可能需要更多的数据/训练时间才能获得类似的性能。 Keras repo 中有很多这样的例子:https://github.com/fchollet/keras/tree/master/examples

一个这样的例子是这个带有 LSTM 的 IMDB 文本(二进制)分类:https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py

文本特征化

深度学习中另一个非常常见的工具是将文本编码为一系列词向量(有时是单热字符)。这些可以初始化为 s 随机向量,也可以使用预先训练的向量(例如 GLOVE 和 word2vec)进行初始化。上面的例子使用了前一种方法。

【讨论】:

谢谢@cortex。我会尝试使用您的所有建议。 还有一件事:不要忘记在将数据提供给 NN 之前对数据进行标准化/归一化!!

以上是关于TensorFlow 中的神经网络比随机森林效果更差,并且每次都预测相同的标签的主要内容,如果未能解决你的问题,请参考以下文章

如何从提升树 Estimator 迁移到 TensorFlow 决策森林

如何从提升树 Estimator 迁移到 TensorFlow 决策森林

如何在计算机中训练神经网络或随机森林算法并在以后的Android设备中进行测试?

在 TensorFlow 上训练随机森林

tensorflow基础模型之RandomForest(随机森林)算法

决策树与随机森林