Как sklearn выбирает пороговые значения в кривой точного возврата? - PullRequest
3 голосов
/ 24 сентября 2019

Я обучил базовому 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

1 Ответ

2 голосов
/ 24 сентября 2019

Чтение источника , precision_recall_curve действительно вычисляет точность и отзыв для каждой уникальной прогнозируемой вероятности (здесь pred), но затем пропускает выходные данные для всех пороговых значений, которые приводят к полному отзыву (кроме самогопервый порог для достижения полного отзыва).

...