【问题标题】:Evaluating a Multi-Label Classification model评估多标签分类模型
【发布时间】:2020-11-06 14:30:50
【问题描述】:

我目前有一个多标签分类问题,为此我正在使用keras构建神经网络如下:

n_cols = dataset.shape[1]
print(n_cols)

model = Sequential()
model.add(Dense(128, activation='relu', input_shape=(n_cols,)))
model.add(Dense(64, activation='relu'))
model.add(Dense(26, activation='sigmoid')) # Sigmoid for multi-label classification

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.5, nesterov=True)
#RMSprop
model.compile(loss='binary_crossentropy', optimizer='RMSprop', metrics=['accuracy'])

model.summary()

## Fit the model ##
early_stopping_monitor = EarlyStopping(patience=20)
history = model.fit(dataset, labels, validation_split=0.33, epochs=30, callbacks=[early_stopping_monitor])

plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

我被告知对于多标签分类,我们使用binary_crossentropy 作为损失,而在最后一层(输出层)使用sigmoid 进行激活。但是,有了这个,我分别得到了~0.0931~0.0937accuracyval_accuracy

对于多标签分类,使用准确度指标是否最合适?我环顾四周,有人建议其他指标,例如 binary_accuracy 可能会更好..

那么问题是,如何才能最好地评估多标签分类?

编辑:作为参考,我的目标“类”中有 26 个标签列,数据集由 21 个列组成。模型训练的整个数据集有大约 82k 个样本。

【问题讨论】:

    标签: python tensorflow keras neural-network multilabel-classification


    【解决方案1】:

    正如this 帖子中提到的,使用 binary_crossentropy 是正确的。添加 softmax 层作为最后一层是可以对模型进行的第一个更改,如该线程下面的答案中所述。此外,关于您的实际问题:如链接帖子中所述,您可能希望改为进行精确/召回。

    【讨论】:

    • 感谢您的回答!然而,对于 softmax 的建议,每个类的最终分数应该相互独立。因此我们不能应用 softmax 激活,因为 softmax 将分数转换为概率,同时考虑其他分数,这就是为什么我认为 sigmoid 是首选。至于那篇文章中的答案,模型预测的 pred_test_input 是什么?这可能只是用于拟合模型的数据集的随机样本吗?
    • @rshah model.predict(pred_test_input):这意味着您应用您的模型来评估未知样本的性能。所以你实际上不应该对你已经用于训练的数据集进行采样。通常你会分成训练、验证和测试。
    猜你喜欢
    • 2019-10-13
    • 2013-12-20
    • 2020-10-09
    • 2020-10-09
    • 1970-01-01
    • 2017-09-19
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多