我是DNN和TesorFlow的新手。我有一个问题与NN用于二进制分类。
输入数据是文本数据集,通过TF-IDF转换成数值向量。
训练数据集的行数为43 000功能个数4235
我尝试使用TFlearn库,然后是Keras io。但结果是一样的——神经网络只预测一个标签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)
你提供的信息有很多可能的原因,也有很多你可以尝试改进的地方,但从高层次来看,这里是我经验中最重要的项目。如果你已经查看了大部分内容,我很抱歉:
数据量
当没有足够的数据时,深度学习实际上可能比"经典"ML(例如树,支持向量机)表现最差。多少是足够的取决于任务,但作为一个松散的经验法则,您可能希望有一些模型参数与您拥有的数据量大致相同。在你发布的模型中,你有100 x 4235 + 100 x 4235 + 4235 * 1 = 851,235个参数。
正规化
从你发布的代码来看,你似乎没有使用任何正则化(例如dropout或L2),也没有使用验证集来度量训练集之外的模型的质量。你的模型可能会过度拟合训练集。
建筑对于文本建模,通常使用rnn(例如LSTM或GRU)或cnn而不是Dense/Fully connected layers。rnn和cnn包含了密集层中不存在的结构约束来建模序列。换句话说,密集层缺乏关于数据类型的先验知识,因此它们可能需要更多的数据/训练时间来获得类似的性能。在Keras repo中有很多这样的例子:https://github.com/fchollet/keras/tree/master/examples
一个这样的例子是使用LSTM的IMDB文本(二进制)分类:https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py文本featurization
深度学习中另一个非常常见的工具是将文本编码为单词向量序列(有时是单字)。这些可以用随机向量初始化,也可以用预训练向量初始化(例如GLOVE和word2vec)。上面的例子使用了前一种方法。