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 代码中)