我已经用Keras训练了一个二进制分类器。这是模型定义:
model_binary = Sequential()
model_binary.add(layers.Dense(64, activation='relu',input_shape=(7,)))
model_binary.add(layers.Dropout(0.5))
model_binary.add(layers.Dense(32, activation='relu'))
model_binary.add(layers.Dropout(0.5))
model_binary.add(layers.Dense(16, activation='relu'))
model_binary.add(layers.Dropout(0.5))
model_binary.add(layers.Dense(1, activation='sigmoid'))
这是培训代码:
model_binary.compile(optimizer=opt, loss='binary_crossentropy', metrics [tf.keras.metrics.AUC(name='auc')])
model_binary.fit(binary_train_data, binary_train_labels, batch_size=16, epochs=10, validation_split=0.1)
Epoch 1/10
507/507 [==============================] - 3s 4ms/step - loss: 0.4017 - auc: 0.5965 - val_loss: 0.2997 - val_auc: 0.8977
Epoch 2/10
507/507 [==============================] - 1s 2ms/step - loss: 0.3354 - auc: 0.7387 - val_loss: 0.2729 - val_auc: 0.9019
Epoch 3/10
507/507 [==============================] - 1s 3ms/step - loss: 0.3167 - auc: 0.7837 - val_loss: 0.2623 - val_auc: 0.9021
Epoch 4/10
507/507 [==============================] - 1s 2ms/step - loss: 0.3072 - auc: 0.8057 - val_loss: 0.2551 - val_auc: 0.9003
Epoch 5/10
507/507 [==============================] - 1s 2ms/step - loss: 0.2948 - auc: 0.8298 - val_loss: 0.2507 - val_auc: 0.9033
Epoch 6/10
507/507 [==============================] - 1s 2ms/step - loss: 0.2921 - auc: 0.8355 - val_loss: 0.2489 - val_auc: 0.9005
Epoch 7/10
507/507 [==============================] - 2s 4ms/step - loss: 0.2867 - auc: 0.8431 - val_loss: 0.2465 - val_auc: 0.9016
Epoch 8/10
507/507 [==============================] - 2s 4ms/step - loss: 0.2865 - auc: 0.8434 - val_loss: 0.2460 - val_auc: 0.9017
Epoch 9/10
507/507 [==============================] - 2s 4ms/step - loss: 0.2813 - auc: 0.8493 - val_loss: 0.2452 - val_auc: 0.9030
Epoch 10/10
507/507 [==============================] - 1s 3ms/step - loss: 0.2773 - auc: 0.8560 - val_loss: 0.2441 - val_auc: 0.9029
数据集有偏差。阳性样本占87%,阴性样本占13%。基于val_auc
,该模型似乎相当不错。现在的问题是如何使用这个模型进行预测。
当我将binary_train_data
传递给二元模型时,最低输出分数在0.6
左右,但在平衡数据集中,S形激活的截止阈值为0.5
。我的问题是给定数据x
,我如何找到模型预测的x
类,以及如何获得Keras找到的最佳分类阈值?
prediction=model_binary(binary_train_data).numpy()
print(np.amin(prediction))
0.5979678
谢谢。
p.S:train_labels是0和1s的形状N
的第二个阵列。
注释|第1点和第2点是可选读数
-
由于您有一个偏斜的数据集,带有
PR
曲线的AUC
度量可能更具洞察力。请随意阅读题为";当在不平衡数据集上评估二进制分类器时,精度-召回图比ROC图更有信息性;Saito和Rehmsmeier(2015(,DOI:10.1371/journal.pone.0118432. -
TensorFlow中AUC的默认曲线目前为
ROC
。欲了解更多信息,请访问TensorFlow网站。 -
关于以下内容:
如何找到模型的预测类x
请注意,模型只是试图将损失最小化,并输出给定示例的概率分布。该模型没有显式地将任何示例分配给任何类。在二进制分类的情况下,Sigmoid激活会输出一个介于0和1之间的数字。然后,使用该模型的人可以确定用于分类的适当阈值/截止值。
- 要找到最佳阈值,您可以针对各种阈值对模型进行评估,例如,找出F1的最高分数。F1分数的优势在于,它是一个单一的指标,已经考虑了召回率和精度指标(对于给定的阈值(。但是,您可以绘制PR曲线并手动指定最佳召回/精度(基于您的应用要求(。从那里,您可以找到相应的阈值