Давайте используем документацию scikit-learn 0.22.2 в качестве компаса для понимания каждого компонента функции и конечного результата.
sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)
Теперь, учитывая код для roc_curve()
, он вызывает функцию _binary_clf_curve()
, где после правильные манипуляции и сортировка, она вычисляет:
distinct_value_indices = np.where(np.diff(y_score))[0]
threshold_idxs = np.r_[distinct_value_indices, y_true.size - 1]
е xplanation этих строк в комментарии:
y_score
обычно имеет много связанных значений. Здесь мы извлекаем индексы, связанные с различными значениями. Мы также объединяем значение для конца кривой.
Две строки выше примерно отвечают на ваш вопрос как рассчитываются / определяются множественные пороги .
Затем он вычисляет:
tps = stable_cumsum(y_true * weight)[threshold_idxs]
fps = 1 + threshold_idxs - tps
и возвращает:
return fps, tps, y_score[threshold_idxs]
После этого возвращается к основной функции roc_curve()
, если if drop_intermediate and len(fps) > 2:
, он
пытается сбросить пороги, соответствующие точкам между ними, и коллинеарен другим точкам.
optimal_idxs = np.where(np.r_[True,
np.logical_or(np.diff(fps, 2),
np.diff(tps, 2)),
True])[0]
и "новые" значения :
fps = fps[optimal_idxs]
tps = tps[optimal_idxs]
thresholds = thresholds[optimal_idxs]
после этого вы можете увидеть другие манипуляции, но суть - это то, что я выделил выше.