У меня есть алгоритм 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()
Я хотел бы знать, что не так с кодом и как я могу его улучшить, чтобы метрика успешно показывалась.