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

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

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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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