Почему roc_curve возвращает дополнительное значение для порогов (2.0) для некоторых классов? - PullRequest
0 голосов
/ 16 сентября 2018

Я использую python 3.5.2 и sklearn 0.19.1

У меня проблема с мультиклассом (3 класса), и я использую RandomForestClassifier.Для одного из кассов у меня есть 19 уникальных predict_proba значений:

{0.0,
0.6666666666666666,
0.6736189855024448,
0.6773290780865037,
0.7150826826468751,
0.7175236925236925,
0.7775446850962057,
0.8245648135911781,
0.8631035080004867,
0.8720525244880196,
0.8739595855873906,
0.8787152225755167,
0.9289844333343654,
0.954439314892936,
0.9606503912532541,
0.9771342285323964,
0.9883370916703461,
0.9957401423931763,
1.0}

Я вычисляю roc_curve, и я ожидаю того же количества точек для кривой roc, что и у меня есть уникальное значение вероятности.Это верно только для 2 из 3 классов!

Когда я посмотрел на пороговые значения, возвращается, что функция roc_curve:

fpr, tpr, proba = roc_curve(....):

Я вижутакое же точное значение, как и в списке вероятностей + одно новое значение 2.0!

[2.,
1.,
0.99574014,
0.98833709,
0.97713423,
0.96065039,
0.95443931,
0.92898443,
0.87871522,
0.87395959,
0.87205252,
0.86310351,
0.82456481,
0.77754469,
0.71752369,
0.71508268,
0.67732908,
0.67361899,
0.66666667,
0. ]

Почему возвращается новое пороговое значение 2.0?Я не видел ничего связанного с этим в документации.

Есть идеи?Я что-то упускаю

1 Ответ

0 голосов
/ 17 сентября 2018

roc_curve записывается так, чтобы точка ROC, соответствующая наибольшему порогу (fpr[0], tpr[0]), всегда была (0, 0). Если это не так, создается новый порог с произвольным значением max(y_score)+1. Соответствующий код из источника :

thresholds : array, shape = [n_thresholds]
    Decreasing thresholds on the decision function used to compute
    fpr and tpr. `thresholds[0]` represents no instances being predicted
    and is arbitrarily set to `max(y_score) + 1`.

и

if tps.size == 0 or fps[0] != 0:
    # Add an extra threshold position if necessary
    tps = np.r_[0, tps]
    fps = np.r_[0, fps]
    thresholds = np.r_[thresholds[0] + 1, thresholds]

Похоже, что в том случае, если вы показали, что у вас есть данные с оценкой 1.0, которая неверно классифицирована.

...