Кривая ROC для леса изоляции - PullRequest
4 голосов
/ 11 марта 2019

Я пытаюсь построить кривую ROC для оценки точности леса изоляции для набора данных по раку молочной железы. Я рассчитал истинно положительный уровень (TPR) и ложно положительный уровень (FPR) из матрицы путаницы. Тем не менее, я не понимаю, как TPR и FPR в виде матриц, а не одно целочисленных значений. И кривая ROC, кажется, работает только с FPR и TPR в виде матриц (я также пытался вручную написать код для вычисления FPR и TPR).

Значения TPR и FPR всегда представлены в виде матриц?

В любом случае, моя кривая ROC выглядит как прямая линия. Почему это так?

Матрица путаницы:

from sklearn.metrics import confusion_matrix
cnf_matrix = confusion_matrix(y, y_pred_test1)

O / P:

>     [[  5  25]
>      [ 21 180]]

Правда положительный и ложный положительный: (Кроме того, почему эти значения непосредственно взяты из матрицы путаницы?)

F_P = cnf_matrix.sum(axis=0) - np.diag(cnf_matrix)  
F_N = cnf_matrix.sum(axis=1) - np.diag(cnf_matrix)
T_P = np.diag(cnf_matrix)
T_N = cnf_matrix.sum() - (FP + FN + TP)

F_P = F_P.astype(float)
F_N = F_N.astype(float)
T_P = T_P.astype(float)
T_N = T_N.astype(float)

O / P:

False Positive [21. 25.] 
False Negative [25. 21.] 
True Positive [  5. 180.] 
True Negative [180.   5.]

TPR и FPR:

tp_rate = TP/(TP+FN)
fp_rate = FP/(FP+TN)

O / P:

TPR :  [0.16666667 0.89552239]
FPR [0.10447761 0.83333333]

Кривая ROC:

from sklearn import metrics
import matplotlib.pyplot as plt

plt.plot(fp_rate,tp_rate)
plt.show()

O / P:

enter image description here

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Функция confusion_matrix() дает вам только правильно / неправильно классифицированную точку, но не предоставляет информацию о том, насколько модель уверена, когда она неправильно классифицирует точку данных.

Эта информация используется для создания кривой ROC (которая используется для измерения способности модели ранжировать каждую точку данных на основе ее вероятности для определенного класса).

Вместо этого используйте функции decision_function() или score_samples() для расчета уверенности модели в том, что каждая точка данных является (или не является) аномалией. Затем используйте roc_curve(), чтобы получить точки, необходимые для построения самой кривой.

Вот пример набора данных по раку молочной железы.

from sklearn.datasets import load_breast_cancer
X, y  = load_breast_cancer(return_X_y=True)

from sklearn.ensemble import IsolationForest

clf = IsolationForest(behaviour='new', max_samples=100,
                      random_state=0, contamination='auto')
clf.fit(X)
y_pred = clf.score_samples(X)

from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y,y_pred)
import matplotlib.pyplot as plt
plt.plot(fpr, tpr, 'k-', lw=2)
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.show()

ROC curve of isolation forest prediction for breast cancer dataset

2 голосов
/ 11 марта 2019

Матрица смешения, по сути, дает вам одну точку на кривой ROC.Для построения «полной» кривой ROC вам понадобится список вероятностей, а затем можно построить кривую ROC, изменив «порог», используемый при определении прогноза класса, чтобы определить, к какому классу принадлежит каждый экземпляр.

В вашем простом случае (когда у вас есть только одна точка кривой ROC), вы можете построить кривую ROC, экстраполируя на начало координат и точку (1,1):

# compare to your confusion matrix to see values.
TP = 180
FN = 21

tpr = TP/(TP+FN)
fpr = 1-tpr

tpr_line = [0, tpr, 1]
fpr_line = [0, fpr 1]

plt.plot(fpr, tpr, 'k-', lw=2)
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.xlim(0, 1)
plt.ylim(0, 1)

и кривая ROC выглядиткак:

example_single_point_roc_curve

...