Почему кривая KS начинается с (0,0)? - PullRequest
1 голос
/ 08 января 2020

вертикальная ось кривой KS равна tpr,fpr и (tpr-fpr), горизонтальная ось является порогом.

tpr=(tp/tp+fn).

Когда threshold = 0, прогнозируем всю выборку до 1, поэтому tp = number of positive samples, fn = 0.

Таким образом, tpr=1.

Но все кривые KS, которые я нашел на Inte rnet, начинаются с (0,0). Не должно ли быть (0,1)? Я так растерялся! Спасибо за ответ 101

1 Ответ

0 голосов
/ 08 января 2020
  • TP: количество положительных прогнозов, которые на самом деле равны 1
  • FP: количество положительных предусловий, которые на самом деле равны 0
  • TN: количество отрицательных прогнозов, которые на самом деле равны 0
  • FN: число отрицательных предусловий, которые на самом деле равны 1

Когда трехзначное число = 0, модель прогнозирует только положительное значение, поэтому FN = TN = 0. FPR = FP / (FP + TN) = 1, TPR = TP / (TP + FN) = 1, поэтому эта точка должна быть (1,1). Вы делаете ошибку, что

Когда трехзначное число = 1, модель прогнозирует только отрицательное значение, поэтому TP = FP = 0. FPR = FP / (FP + TN) = 0, TPR = TP / (TP + FN) = 0, поэтому эта точка должна быть (0,0).

# roc curve and auc
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
from matplotlib import pyplot
import pandas as pd

# generate 2 class dataset
X, y = make_classification(n_samples=1000, n_classes=2, weights=[1,1], random_state=1)
# split into train/test sets
trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.5, random_state=2)
# fit a model
model = KNeighborsClassifier(n_neighbors=3)
model.fit(trainX, trainy)
# predict probabilities
probs = model.predict_proba(testX)
# keep probabilities for the positive outcome only
probs = probs[:, 1]
# calculate AUC
auc = roc_auc_score(testy, probs)
print('AUC: %.3f' % auc)
# calculate roc curve
fpr, tpr, thresholds = roc_curve(testy, probs)
# plot no skill
pyplot.plot([0, 1], [0, 1], linestyle='--')
# plot the roc curve for the model
pyplot.plot(fpr, tpr, marker='.')
# show the plot
pyplot.show()
# see calculations
pd.DataFrame({'fpr':fpr,'tpr':tpr,'thresholds':thresholds})

Выходы:

     fpr        tpr         threshouds
0   0.000000    0.000000    2.000000
1   0.054264    0.561983    1.000000
2   0.217054    0.884298    0.666667
3   0.406977    0.975207    0.333333
4   1.000000    1.000000    0.000000
...