我是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)
答案 0 :(得分:5)
由于您提供的信息以及您可以尝试改进的许多内容,有很多可能的原因,但从高层次来看,这是我体验中最重要的项目。如果你已经检查了大部分内容,我道歉:
深度学习实际上可能表现得比#34经典更糟糕。 ML(例如树,svm),当数据不足时。足够多的是任务依赖,但作为一个宽松的经验法则,您可能希望有一些模型参数与您拥有的数据量大致相同。在您发布的模型中,您有100 x 4235 + 100 x 4235 + 4235 * 1 = 851,235参数。
根据您发布的代码,您似乎没有使用任何正规化(例如,丢失或L2),也没有使用验证集来测量训练集之外的模型质量。您的模型可能会过度拟合训练集。
对于建模文本,通常使用RNN(例如LSTM或GRU)或CNN而不是密集/完全连接的层。 RNN和CNN包含对密集层中不存在的模型序列的架构约束。换句话说,密集层缺乏关于数据类型的先验知识,因此他们可能需要更多的数据/训练时间来获得类似的性能。在Keras回购中有很多例子:https://github.com/fchollet/keras/tree/master/examples
一个这样的例子是使用LSTM的这个IMDB文本(二进制)分类:https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py
深度学习中另一个非常常见的工具是将文本编码为一个单词向量序列(有时是一个热字符)。这些可以用随机向量初始化或用预训练的向量(例如GLOVE和word2vec)初始化。上面的例子使用了前一种方法。