如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表:

print(probabilities)|   |      1       |      3       | ... |     8354     |     8356     |     8357     ||---|--------------|--------------|-----|--------------|--------------|--------------|| 0 | 2.442745e-05 | 5.952136e-06 | ... | 4.254002e-06 | 1.894523e-05 | 1.033957e-05 || 1 | 7.685694e-05 | 3.252202e-06 | ... | 3.617730e-06 | 1.613792e-05 | 7.356643e-06 || 2 | 2.296657e-06 | 4.859554e-06 | ... | 9.934525e-06 | 9.244772e-06 | 1.377618e-05 || 3 | 5.163169e-04 | 1.044035e-04 | ... | 1.435158e-04 | 2.807420e-04 | 2.346930e-04 || 4 | 2.484626e-06 | 2.074290e-06 | ... | 9.958628e-06 | 6.002510e-06 | 8.434519e-06 || 5 | 1.297477e-03 | 2.211737e-04 | ... | 1.881772e-04 | 3.171079e-04 | 3.228884e-04 |

我使用阈值(0.2)将其转换为类标签,以测量我的预测的准确性:

predictions = (probabilities > 0.2).astype(np.int)print(predictions)|   | 1 | 3 | ... | 8354 | 8356 | 8357 ||---|---|---|-----|------|------|------|| 0 | 0 | 0 | ... |    0 |    0 |    0 || 1 | 0 | 0 | ... |    0 |    0 |    0 || 2 | 0 | 0 | ... |    0 |    0 |    0 || 3 | 0 | 0 | ... |    0 |    0 |    0 || 4 | 0 | 0 | ... |    0 |    0 |    0 || 5 | 0 | 0 | ... |    0 |    0 |    0 |

我还有一个测试集:

print(Y_test)|   | 1 | 3 | ... | 8354 | 8356 | 8357 ||---|---|---|-----|------|------|------|| 0 | 0 | 0 | ... |    0 |    0 |    0 || 1 | 0 | 0 | ... |    0 |    0 |    0 || 2 | 0 | 0 | ... |    0 |    0 |    0 || 3 | 0 | 0 | ... |    0 |    0 |    0 || 4 | 0 | 0 | ... |    0 |    0 |    0 || 5 | 0 | 0 | ... |    0 |    0 |    0 |

问题: 如何在Python中构建一个算法来选择最佳阈值,以最大化roc_auc_score(average = 'micro')或其他指标?

或许可以构建一个手动函数在Python中优化阈值,这取决于准确性指标。


回答:

我假设你的真实标签是Y_test,预测结果是predictions

根据预测threshold优化roc_auc_score(average = 'micro')似乎没有意义,因为AUC是基于预测的排名计算的,因此需要predictions作为[0,1]之间的浮点值。

因此,我将讨论accuracy_score

你可以使用scipy.optimize.fmin

import scipyfrom sklearn.metrics import accuracy_scoredef thr_to_accuracy(thr, Y_test, predictions):   return -accuracy_score(Y_test, np.array(predictions>thr, dtype=np.int))best_thr = scipy.optimize.fmin(thr_to_accuracy, args=(Y_test, predictions), x0=0.5)

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

Pytorch DataLoader内存未释放

我想在Google Colab上使用PyTorch实现…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注