与准确度分数相比,什么可以解释更高的 F1 分数?

数据挖掘 机器学习 神经网络 深度学习 分类 喀拉斯
2021-09-20 00:52:39

我正在构建一个二进制分类器,它使用 Keras 对数值数据进行分类。

我的数据集中有 6992 个数据点。测试集占数据的 30%。验证集占训练集的 30%。

在评估模型时,我得到以下值:

recall:  0.8914240755310779
precision:  0.7006802721088435
f1_score:  0.7846260387811634
accuracy_score:  0.7035271816800843

怎么accuracy_score比F1-score低10%左右?

这是我用来评估模型的代码:

print('recall: ', recall_score(Y_test, y_pred))
print('precision: ', precision_score(Y_test, y_pred))
print('f1_score: ', f1_score(Y_test, y_pred))
print('accuracy_score: ', model.score(X_test, Y_test, verbose=0))

这是我的模型:

def create_model(neurons=23):

    model = Sequential()
    model.add(Dense(neurons, input_dim=37, kernel_initializer='normal', activation='relu'))
    model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))

    # Compile model
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy', precision, recall])

    return model

model = KerasClassifier(build_fn=create_model, epochs=500, batch_size=5, verbose=1)

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=seed)

transformer = Normalizer().fit(X_train)
X_train = transformer.transform(X_train)
transformer = Normalizer().fit(X_test)
X_test = transformer.transform(X_test)

tensorboard = TensorBoard(log_dir="logs/{}".format(time.time()))
time_callback = TimeHistory()
es = EarlyStopping(monitor='val_acc', min_delta=0, patience=20, verbose=0, mode='auto',restore_best_weights=True)

# Fit the model
history = model.fit(X_train, Y_train, validation_split=0.3, epochs=200, batch_size=5, verbose=1, callbacks=[tensorboard, time_callback]) 
2个回答

你有不平衡的课程。请注意,您的准确度非常接近您的精确度,而与您的召回率完全不同。这意味着您的精度(阳性预测的准确性)在整体准确性测量中占主导地位 - 您数据中的几乎所有案例都被归类为阳性,因此预测阳性的准确性几乎等同于所有案例的准确性。

F1 分数是准确率和召回率的调和平均值,因此它是一个类别平衡的准确度度量。您在少数类上的表现优于多数类,这可以通过几乎相同的准确度和精确度以及更高的召回率来证明。

F1 分数等于:

2*((召回*精度)/(召回+精度))

如果你的模型捕捉到更多的真阴性(TN),它会降低 F1 分数。虽然您的模型可能擅长预测真阳性,但它可能以较低的速率预测真阴性。