Как построить кривую ROC для алгоритма Local Outlier Factor?

Я пытаюсь использовать Local Outlier Factor (LOF) алгоритм и хотел бы построить кривую ROC. Проблема в том, что библиотека, предоставляемая scikit-learn, не дает баллов для каждого прогноза.

Итак, как я могу решить эту проблему?


person Kasra Babaei    schedule 20.02.2018    source источник
comment
Кривая ROC определяется только для вероятностных прогнозов. Однако упомянутый алгоритм создает двоичные метки (0/1), поэтому это не сработает.   -  person mzoll    schedule 20.02.2018


Ответы (1)


Атрибут negative_outlier_factor_ фактически является -LOF, как указано в документации и лучше в исходный код. Распространенным подходом является вычисление ROC путем назначения ваших прогнозов на основе разных значений порога. Если у вас есть данные в df с метками в столбце 'label', код будет примерно таким:

def get_predictions(lof, threshold=1.5):
    return list(map(lambda x: -1 if x > threshold else 1, lof))

lof_ths = np.arange(1.3, 6., 0.1)
clf = LocalOutlierFactor(n_neighbors=30)
clf.fit_predict(df.drop(['label'], axis=1))
lofs = -clf.negative_outlier_factor_

plt.figure()
lw = 2
plt.xlim([0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate', fontsize=14)
plt.ylabel('True Positive Rate', fontsize=14)
plt.title('Receiver operating characteristic', fontsize=16)

fpr = tpr = [0]

for ths in lof_ths:
    pred = get_predictions(lof, threshold=ths)
    tn, fp, fn, tp = confusion_matrix(df.label, pred, labels=[-1,1]).ravel()
    fpr.append(fp / (fp + tn + .000001))
    tpr.append(tp / (tp + fn + .000001))

fpr.append(1)
tpr.append(1)
plt.plot(fpr, tpr, label='ROC Curve')
plt.plot([0, 1], [0, 1], color='navy', label='Random Guessing', lw=lw, linestyle='--')
plt.legend(loc="lower right", fontsize=12)
person ggagliano    schedule 09.06.2018