sklearn如何选择精度召回曲线中的阈值步长?

发布于 2021-01-29 16:05:00

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

但是我该怎么做呢?有没有办法设置要测试的阈值数量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
关注者
0
被浏览
151
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    读取precision_recall_curve不计算精确度和召回为每个唯一的预测概率(这里pred),但是然后省略了导致全面召回(除了第一个阈值,以实现全召回)的所有阈值的输出。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看