在Keras v2中计算精度,召回率和F1,我做得对吗?

时间:2018-04-28 10:33:02

标签: python keras precision-recall keras-2

关于如何在Keras v2中获得精确度,召回率和F1分数已经有question,这是我正在使用的方法,但问题是:我做得对吗?

首先,F. Chollet says他从Keras的第2版中删除了这三个指标,因为它们是基于批处理的,因此不可靠。我正在通过basque21使用带有on_epoch_end方法的回调来跟踪一个想法,这不是通常与批次无关的,因为在历元结束时计算(=所有批次完成后)?

这是我正在使用的代码。在model.fit方法中,我添加了参数callbacks=[metrics],我定义了一个字典myhistory和一个类Metrics,如下所示(代码改编自basque21):

myhistory={}
myhistory['prec']=[]
myhistory['reca']=[]
myhistory['f1']=[]

class Metrics(keras.callbacks.Callback):
    def on_epoch_end(self, batch, logs={}):
        predict = numpy.asarray(self.model.predict(self.validation_data[0]))
        predict = a=numpy.array(predict.flatten()>=0.5,dtype=int)
        targ = self.validation_data[1]
        targ=numpy.array(targ.flatten()>=0.5,dtype=int)
        self.prf=precision_recall_fscore_support(targ, predict)
        print("Precision/recall/f1 class 0 is {}/{}/{}, precision/recall/f1 class 1 is {}/{}/{}".format(self.prf[0][0], self.prf[1][0], self.prf[2][0], self.prf[0][1], self.prf[1][1], self.prf[2][1]))
        myhistory['prec'].append(self.prf[0][1])
        myhistory['reca'].append(self.prf[1][1])
        myhistory['f1'].append(self.prf[2][1])
        return
metrics = Metrics()

一旦完成装配,我将在一个共同的图上显示所有内容,如下所示:

import matplotlib.pyplot as plt

loss = history.history['loss']
val_loss = history.history['val_loss']
precision = [1-x for x in myhistory['prec']]
recall = [1-x for x in myhistory['reca']]
f_one = [1-x for x in myhistory['f1']]

epochs = range(1, len(loss) + 1)

# "bo" is for "blue dot"
plt.plot(epochs, loss, 'bo', label='Training loss')
# b is for "solid blue line"
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.plot(epochs, precision, 'r', label='One minus precision')
plt.plot(epochs, recall, 'g', label='One minus recall')
plt.plot(epochs, f_one, 'm', label='One minus f1')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.show()

我正在使用“一个减去精度”等,使范围内的所有内容接近于零。我不明白的是,正如你在剧情中看到的那样, enter image description here虽然验证损失正在增加(由于过度拟合),但精确度,回忆似乎有所不同,因此F1保持相对稳定。我做错了什么?

示例来自Chapter 3 of F. Chollet's book,它是关于IMDB文本分类的,我只显示第1类的分数。

0 个答案:

没有答案