keras 序列模型中的类标签预测在混淆矩阵中显示不同的结果

数据挖掘 喀拉斯 张量流
2021-10-06 00:32:14

使用 Keras 序列模型预测来获得类标签,我们可以做

yhat_classes1 = Keras_model.predict_classes(predictors)[:, 0] #this shows deprecated warning in tf==2.3.0

WARNING:tensorflow:From <ipython-input-54-226ad21ffae4>:1: Sequential.predict_classes (from tensorflow.python.keras.engine.sequential) is deprecated and will be removed after 2021-01-01.
Instructions for updating:
Please use instead:* `np.argmax(model.predict(x), axis=-1)`,   if your model does multi-class classification   (e.g. if it uses a `softmax` last-layer activation).* `(model.predict(x) > 0.5).astype("int32")`,   if your model does binary classification   (e.g. if it uses a `sigmoid` last-layer activation).

或者

yhat_classes2 = np.argmax(Keras_model.predict(predictors), axis=1)

如果我创建混淆矩阵,则使用第一类标签,我得到

matrix = confusion_matrix(actual_y, yhat_classes1)
 [[108579   8674]
 [  1205  24086]]

但是对于带有混淆矩阵的第二类标签,我得到 0 表示真阳性和假阳性

matrix = confusion_matrix(actual_y, yhat_classes2)
 [[117253      0]
 [ 25291      0]]

我可以知道这里有什么问题吗?

1个回答

Model.predict_classes只给你最可能的类(最高概率值),因此它是维度(样本),对于样本中的每个输入,都有一个输出 - 类。

更准确地说 Model.predict_classes,在 predict 的输出上调用 argmax。请参阅代码(下面的 predict_classes )

def predict_classes(self, X, batch_size=128, verbose=1):
  proba = self.predict(X, batch_size=batch_size, verbose=verbose)
        if self.class_mode == 'categorical':
            return proba.argmax(axis=-1)
        else:
            return (proba > 0.5).astype('int32')

如警告所示,请改用:

  • np.argmax(model.predict(x), axis=-1),如果您的模型进行多类分类(例如,如果它使用softmax最后一层激活)。
  • (model.predict(x) > 0.5).astype("int32"),如果您的模型进行二元分类(例如,如果它使用sigmoid最后一层激活)。