sklearn如何在精确召回曲线中选择阈值步骤?

Posted

技术标签:

【中文标题】sklearn如何在精确召回曲线中选择阈值步骤?【英文标题】:How does sklearn select threshold steps in precision recall curve? 【发布时间】:2020-01-24 09:08:54 【问题描述】:

我在示例乳腺癌数据集上训练了一个基本的 FFNN。对于结果,precision_recall_curve 函数给出了 416 个不同阈值的数据点。我的数据包含 569 个唯一的预测值,据我了解 Precision Recall 曲线,我可以应用 568 个不同的阈值并检查生成的 Precision 和 Recall。

但是我该怎么做呢?有没有办法设置使用sklearn 测试的阈值数量?或者至少解释一下sklearn 如何选择这些阈值?

我的意思是 417 应该足够了,即使对于更大的数据集,我只是好奇它们是如何被选中的。

# necessary packages
from sklearn.datasets import load_breast_cancer
import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout

# load data
sk_data = load_breast_cancer(return_X_y=False)

# safe data in pandas
data = sk_data['data']
target = sk_data['target']
target_names = sk_data['target_names']
feature_names = sk_data['feature_names']
data = pd.DataFrame(data=data, columns=feature_names)

# build ANN
model = Sequential()
model.add(Dense(64, kernel_initializer='random_uniform', input_dim=30, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(32, kernel_initializer='random_uniform', activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(1, activation='sigmoid'))

# train ANN
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

model.fit(data, target, epochs=50, batch_size=10, validation_split=0.2)

# eval
pred = model.predict(data)

# calculate precision-recall curve
from sklearn.metrics import precision_recall_curve
precision, recall, thresholds = precision_recall_curve(target, pred)

# precision-recall curve and f1
import matplotlib.pyplot as plt

#pyplot.plot([0, 1], [0.5, 0.5], linestyle='--')
plt.plot(recall, precision, marker='.')
# show the plot
plt.show()

len(np.unique(pred)) #569
len(thresholds) # 417

【问题讨论】:

【参考方案1】:

读取source、precision_recall_curve 会计算每个唯一预测概率(此处为pred)的精度和召回率,但随后会忽略导致完全召回的所有阈值的输出(除了要达到的第一个阈值完全召回)。

【讨论】:

以上是关于sklearn如何在精确召回曲线中选择阈值步骤?的主要内容,如果未能解决你的问题,请参考以下文章

与 SKlearn 精确召回曲线计算混淆

Sklearn机器学习——ROC曲线ROC曲线的绘制和AUC面积运用ROC曲线找到最佳阈值

从精确召回曲线计算真阳性的数量

绘制阈值(precision_recall 曲线)matplotlib/sklearn.metrics

详解支持向量机-基于SVM的ROC曲线和AUC面积菜菜的sklearn课堂笔记

如何在python中使用插值绘制精确召回曲线?