scikit-learn - multiclass - roc curve svm python
scikit-learn roc_curve: ¿por qué devuelve un valor de umbral=2 en algún momento? (3)
Corrígeme si me equivoco: los "umbrales" devueltos por roc_curve de scikit-learn deben ser una matriz de números que están en [0,1]. Sin embargo, a veces me da una matriz con el primer número cerca de "2". ¿Es un error o lo hice mal? Gracias.
In [1]: import numpy as np
In [2]: from sklearn.metrics import roc_curve
In [3]: np.random.seed(11)
In [4]: aa = np.random.choice([True, False],100)
In [5]: bb = np.random.uniform(0,1,100)
In [6]: fpr,tpr,thresholds = roc_curve(aa,bb)
In [7]: thresholds
Out[7]:
array([ 1.97396826, 0.97396826, 0.9711752 , 0.95996265, 0.95744405,
0.94983331, 0.93290463, 0.93241372, 0.93214862, 0.93076592,
0.92960511, 0.92245024, 0.91179548, 0.91112166, 0.87529458,
0.84493853, 0.84068543, 0.83303741, 0.82565223, 0.81096657,
0.80656679, 0.79387241, 0.77054807, 0.76763223, 0.7644911 ,
0.75964947, 0.73995152, 0.73825262, 0.73466772, 0.73421299,
0.73282534, 0.72391126, 0.71296292, 0.70930102, 0.70116428,
0.69606617, 0.65869235, 0.65670881, 0.65261474, 0.6487222 ,
0.64805644, 0.64221486, 0.62699782, 0.62522484, 0.62283401,
0.61601839, 0.611632 , 0.59548669, 0.57555854, 0.56828967,
0.55652111, 0.55063947, 0.53885029, 0.53369398, 0.52157349,
0.51900774, 0.50547317, 0.49749635, 0.493913 , 0.46154029,
0.45275916, 0.44777116, 0.43822067, 0.43795921, 0.43624093,
0.42039077, 0.41866343, 0.41550367, 0.40032843, 0.36761763,
0.36642721, 0.36567017, 0.36148354, 0.35843793, 0.34371331,
0.33436415, 0.33408289, 0.33387442, 0.31887024, 0.31818719,
0.31367915, 0.30216469, 0.30097917, 0.29995201, 0.28604467,
0.26930354, 0.2383461 , 0.22803687, 0.21800338, 0.19301808,
0.16902881, 0.1688173 , 0.14491946, 0.13648451, 0.12704826,
0.09141459, 0.08569481, 0.07500199, 0.06288762, 0.02073298,
0.01934336])
De la documentación:
thresholds: array, shape = [n_thresholds] Umbrales decrecientes en la función de decisión utilizada para calcular fpr y tpr.
thresholds[0]
no representan instancias que se pronostiquen y se ajusta arbitrariamente amax(y_score) + 1
.
Entonces, el primer elemento de los thresholds
es cerca de 2 porque es max(y_score) + 1
, en su caso los thresholds[1] + 1
.
La mayoría de las veces estos umbrales no se utilizan, por ejemplo, al calcular el área bajo la curva, o al trazar la Tasa de Falso Positivo contra la Tasa de Positiva Verdadera.
Sin embargo, para trazar lo que parece una curva razonable, se necesita tener un umbral que incorpore 0 puntos de datos. Dado que la función de curva ROC de Scikit-Learn no necesita tener probabilidades normalizadas para los umbrales (cualquier puntuación es buena), establecer el umbral de este punto en 1 no es suficiente; configurarlo en inf
es sensato, pero los codificadores a menudo esperan datos finitos (y es posible que la implementación también funcione para umbrales enteros). En cambio, la implementación usa max(score) + epsilon
donde epsilon = 1
. Esto puede ser estéticamente deficiente, pero no has dado ninguna razón por la cual es un problema.
esto me parece un error: en roc_curve (aa, bb), 1 se agrega al primer umbral. Debería crear un problema aquí https://github.com/scikit-learn/scikit-learn/issues