Рассчитать порог для roc_curve для двоичной классификации - PullRequest
0 голосов
/ 11 марта 2020

Вопрос похож на вопрос, упомянутый в ссылке ниже, пожалуйста, прочтите его для справки.

Как sklearn вычисляет площадь под кривой ro c для двух двоичных входов?

Я понимаю, что все происходит в sklearn.metrics._binary_clf_curve.

Но для двоичной классификации как вычисляются / определяются множественные пороги в указанной функции. Функция возвращает y_score[threshold_idxs] в качестве пороговых значений для построения графика roc_curve. Я не могу понять вычисление y_score[threshold_idxs] и почему это будет пороговым значением.

1 Ответ

3 голосов
/ 11 марта 2020

Давайте используем документацию scikit-learn 0.22.2 в качестве компаса для понимания каждого компонента функции и конечного результата.

  • функция :
sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)
  • "активные" параметры при использовании вызова по умолчанию:

    • y_true: массив, shape = [n_samples], истинные двоичные метки.
    • y_score: массив, shape = [n_samples]. Целевые оценки могут быть либо оценками вероятности положительного класса, доверительными значениями, либо мерами решения без порога
    • drop_intermediate: логическое значение, необязательно (по умолчанию = True), отбрасывать ли некоторые неоптимальные пороги, не отображается на графике RO C.
  • выходы :

    • fpr: массив, форма = [> 2], Увеличение числа ложных срабатываний таким образом, что элемент i - это число ложных положительных прогнозов с оценкой> = пороговые значения [i].
    • tpr: массив, форма = [> 2], Увеличение истинные положительные значения, такие, что элемент i является истинным положительным показателем прогнозов со счетом> = пороговые значения [i].
    • thresholds: массив, форма = [n_thresholds], уменьшение пороговых значений для функции принятия решений, используемой для вычисления fpr и tpr

Теперь, учитывая код для 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]

после этого вы можете увидеть другие манипуляции, но суть - это то, что я выделил выше.

...