F1 比在 keras 回调中使用 sklearn 的准确率更高。有问题?

Posted

技术标签:

【中文标题】F1 比在 keras 回调中使用 sklearn 的准确率更高。有问题?【英文标题】:F1 is higher than accuracy using sklearn in keras callback. Something wrong? 【发布时间】:2017-09-26 10:02:43 【问题描述】:

我尝试进行自定义回调来计算 keras 中的 f1 和 roc_auc。我使用 sklearn 来计算 f1 度量和 roc_auc。这是代码:

from keras.callbacks import Callback
from keras import backend as K
import numpy as np
import tensorflow as tf
from sklearn.metrics import accuracy_score, f1_score, roc_auc_score

class Measurement(Callback):
    def on_train_begin(self, logs=):
        self.acc = 0
        self.f1s = 0
        self.roc_auc = 0

def on_train_end(self, logs=):
    y_true = []
    for y in self.validation_data[1]:
        for idx in range(2):
            if y[idx] == 1:
                y_true.append(idx)
    y_pred_temp = self.model.predict(self.validation_data[0])
    y_pred = []
    for y in y_pred_temp:
        for idx in range(2):
            if y[idx] > 0.49999 + K.epsilon():
                y_pred.append(idx)
    self.acc = accuracy_score(y_true, y_pred)
    self.f1s = f1_score(y_true, y_pred)
    self.roc_auc = roc_auc_score(y_true, y_pred)
    return

def on_epoch_begin(self, epoch, logs=):
    return

def on_epoch_end(self, epoch, logs=):
    return

def on_batch_begin(self, batch, logs=):
    return

def on_batch_end(self, batch, logs=):
    return

我的数据集数量非常不平衡,我有 2 个类,第 1 类数据仅占整个数据的 33%。所以我使用StratifiedKFold 来缓解数据本身不平衡的问题。但是,与 F1 值相比,最终结果产生的精度较低。我从来没有见过这样的东西。我的教授也说可能有问题,但我选择相信这是正常的,因为负类(一等)的数量比正类少很多,这将导致较低的真负值,并使精度较低。任何想法?提前致谢。

【问题讨论】:

除非您发布实际值和数据,否则很难说。 数据实际上是机密资产,我只能告诉你,它以文本的形式出现,它有 2 个类别,第一类分布 33%,第二类分布 67%第二类,这意味着数据在数量上是不平衡的。结果如下:ACCURACY: 84.28%F1: 87.79% 知道@VivekKumar 吗? 【参考方案1】:

我终于尝试切换类标签,它给出了一个更小的 F1。所以我在问题中描述的现象可能是因为负类数量少导致真负值较低,这在F1中没有考虑,但在准确性上考虑。

【讨论】:

以上是关于F1 比在 keras 回调中使用 sklearn 的准确率更高。有问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 中将 Sklearn Metric 实现为 Metric?

如何在 sklearn 的 AdaBoost 中使用 Keras 模型?

在“Keras”分类中使用“sklearn”库中计算类权重函数问题(Python 3.8,仅在 VS 代码中)

将 keras 集成到 sklearn 管道中的问题

在keras中复制sklearn的MLPClassifier()

如何使用 sklearn 管道缩放 Keras 自动编码器模型的目标值?