我尝试进行自定义回调以在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个类,第一类数据只占整个数据的33%。所以我使用StratifiedKFold
来缓解不平衡数据本身的问题。但是,与F1值相比,最终结果的准确度较低。我从来没有见过这样的东西。我的教授也说可能有些不对劲,但我选择相信它是正常的,因为负类(第一类)数量远低于正类,这将导致较低的真实负值,并使准确度更低。任何想法?提前谢谢。
答案 0 :(得分:0)
我终于尝试切换了类标签,它给出了一个更小的F1。因此,我在问题中描述的现象可能是因为负等级的数量较少导致较低的真实负值,这在F1中没有考虑,而是在准确性上考虑。