Кривая Roc не отображается на графике (Sklearn-kNN) - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть алгоритм k-NN, который использует параметры K = 3 и перекрестная проверка = 10 , как показано ниже. Этот алгоритм предназначен для запуска в наборе данных, который может принимать 2 значения: background / normal и bot. При запуске набора данных, который я делаю доступным ниже, он генерирует следующую матрицу путаницы:

       confusion matrix
Background/Normal [[23553   136]
Bot               [  237  1786]] 

и следующие метрики:

                   precision    recall  f1-score   support

Background/Normal       0.99      0.99      0.99     23689
              Bot       0.93      0.88      0.91      2023

        micro avg       0.99      0.99      0.99     25712
        macro avg       0.96      0.94      0.95     25712
     weighted avg       0.99      0.99      0.99     25712


Cross Val Score
[0.97773673 0.98288936 0.98425044 0.96869531 0.96800856 0.98064955 0.97851031 0.97782964 0.95702061 0.95439518] 

Cross val avg: 0.9729985691978758 

RocAUC score: 0.9725001834719879

CTU13 / 10 - ссылка на набор данных

Единственная проблема - это создание графика кривой ROC. Я не понимаю, почему я получаю эту ошибку, так как она генерирует вывод для метрической команды roc_aus_score, но на графике она помещает AUC = nan

print(metrics.roc_auc_score(y_test, y_pred_prob, average='micro'))
OUTPUT: RocAUC score: 0.9725001834719879

ошибка вывода графика : Ошибка изображения

И показать это предупреждение:

Python3 \ lib \ site-packages \ sklearn \ metrics \ rating.py: 656: UndefinedMetricWarning: в y_true нет положительных выборок, истинное положительное значение должно быть бессмысленным UndefinedMetricWarning)

Программный код :

import pandas as pd
import time
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
from sklearn import metrics
from sklearn.metrics import roc_curve
from sklearn.metrics import auc

def openfile():
    df = pd.read_csv('TestfileBEB - kNN.csv')

    return df

def main():

    openfile= abrir()

    X = dataset.drop(columns=['Label'])
    y = dataset['Label'].values

    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

    Classifier = KNeighborsClassifier(n_neighbors=3, p=2, metric='euclidean')
    Classifier.fit(X_train, y_train)

    y_pred_class = Classifier.predict(X_test)

    score = cross_val_score(Classifier, X, y, cv=10)

    y_pred_prob = Classifier.predict_proba(X_test)[:, 1]


    print("accuracy_score:", metrics.accuracy_score(y_test, y_pred_class),'\n')
    print("confusion matrix")
    print(metrics.confusion_matrix(y_test, y_pred_class),'\n')
    print(metrics.classification_report(y_test, y_pred_class, digits=2),'\n')
    print("Cross Val Score")
    print(score,'\n')
    print("Cross val avg:", score.mean(),'\n')
    print(metrics.roc_auc_score(y_test, y_pred_prob, average='micro'))


    fpr, tpr, threshold = roc_curve(y_test, y_pred_prob, pos_label=2)
    roc_auc = auc(fpr, tpr)
    plt.title('Receiver Operating Characteristic')
    plt.plot(fpr, tpr, 'b', label='AUC = %0.2f' % roc_auc)
    plt.legend(loc='lower right')
    plt.plot([0, 1], [0, 1], 'r--')
    plt.xlim([0, 1])
    plt.ylim([0, 1])
    plt.ylabel('True Positive Rate')
    plt.xlabel('False Positive Rate')
    plt.title('ROC Curve of kNN')
    plt.show()

Я хотел бы знать, что не так с кодом и как я могу его улучшить, чтобы метрика успешно показывалась.

...