6

我正在使用深度神经网络模型(在 中实现keras)进行预测。像这样的东西:

def make_model():
 model = Sequential()       
 model.add(Conv2D(20,(5,5), activation = "relu"))
 model.add(MaxPooling2D(pool_size=(2,2)))    
 model.add(Flatten())
 model.add(Dense(20, activation = "relu"))
 model.add(Lambda(lambda x: tf.expand_dims(x, axis=1)))
 model.add(SimpleRNN(50, activation="relu"))
 model.add(Dense(1, activation="sigmoid"))    
 model.compile(loss = "binary_crossentropy", optimizer = adagrad, metrics = ["accuracy"])

 return model

model = make_model()
model.fit(x_train, y_train, validation_data = (x_validation,y_validation), epochs = 25, batch_size = 25, verbose = 1)

##Prediciton:
prediction = model.predict_classes(x)
probabilities = model.predict_proba(x) #I assume these are the probabilities of class being predictied

我的问题是分类(二进制)问题。我想计算每一个的置信度分数,prediction即我想知道 - 我的模型是 99% 确定它是“0”还是 58% 是“0”。

我找到了一些关于如何做到这一点的观点,但无法实施。我希望遵循的方法说:“使用分类器,当您输出时,您可以将值解释为属于每个特定类别的概率。您可以使用它们的分布来粗略衡量您对观察属于该类别的信心程度。”

我应该如何使用上述模型进行预测,以便我对每个预测都有信心?我会很感激一些实际的例子(最好在 Keras 中)。

4

4 回答 4

6

softmax 是一种估计模型预测置信度的有问题的方法。

最近有几篇关于这个主题的论文。

您可以寻找神经网络的“校准”以找到相关论文。

这是您可以开始的一个示例 - https://arxiv.org/pdf/1706.04599.pdf

于 2020-01-22T05:50:57.780 回答
0

尽管前面的答案代表了处理概率概念的不同方法,但对预测具有置信度分数的最真实/最接近的答案是使用贝叶斯网络。

有关贝叶斯网络的基本概念,您可以从这里开始:https ://towardsdatascience.com/introduction-to-bayesian-networks-81031eeed94e

有关 TensorFlow 的快速入门,请参阅以下链接:https ://towardsdatascience.com/bayesian-neural-networks-in-10-mins-in-tfp-c735ec99384f

于 2020-01-22T08:32:22.417 回答
0

如何在最后一层使用 softmax 作为激活?让我们这样说:

model.add(Dense(2, activation='softmax'))    
model.compile(loss='categorical_crossentropy', optimizer = adagrad, metrics = ["accuracy"])

这样,对于每个数据点,模型将为您提供一个概率性的结果,该结果说明您的数据点属于两个类中的每一个的可能性是多少。

例如,对于给定的 X,如果模型返回 (0.3,0.7),您将知道 X 属于 1 类而不是 0 类的可能性更大。并且您知道可能性估计为 0.7 超过 0.3。

于 2020-01-22T03:26:23.207 回答
0

在 Keras 中,有一种方法被称为predict()可用于顺序模型和函数模型。binary_crossentropy如果您使用作为损失函数和具有 sigmoid 激活函数的最终密集层,它将在您的情况下正常工作。

这是使用一个测试数据实例调用它的方法。下面,mymodel.predict()将返回两个概率相加为 1.0 的数组。这些值是您提到的置信度分数。您可以进一步使用np.where()如下所示的方法来确定两个概率中的哪一个(超过 50% 的概率)将是最终类别。

yhat_probabilities = mymodel.predict(mytestdata, batch_size=1)
yhat_classes = np.where(yhat_probabilities > 0.5, 1, 0).squeeze().item()

我开始明白逻辑回归输出的概率可以解释为置信度。

这里有一些链接可以帮助您得出自己的结论。

https://machinelearningmastery.com/how-to-score-probability-predictions-in-python/

如何使用 scikit-learn 评估预测的置信度得分

https://stats.stackexchange.com/questions/34823/can-logistic-regressions-predicted-probability-be-interpreted-as-the-confidence

https://kiwidamien.github.io/are-you-sure-thats-a-probability.html

如果您觉得我的回答有用,请随时为我的回答点赞。

于 2020-01-22T04:37:44.100 回答