Ошибка значения в метриках kNN

#python #artificial-intelligence #knn #valueerror

#python #искусственный интеллект #knn #ошибка значения

Вопрос:

У меня есть проект, который заключается в использовании алгоритма kNN в файле csv и отображении выбранных показателей. Но когда я пытаюсь представить некоторые показатели, он выдает несколько ошибок.

При попытке использовать: чувствительность, f1_Score и точность:

  1. чувствительность — печать (metrics.recall_score(y_test, y_pred_class))
  2. F1_score — печать (metrics.f1_score(y_test, y_pred_class))
  3. Предварительный просмотр — печать (metrics.precision_score(y_test, y_pred_class))

Pycharm выдает следующую ошибку:

Ошибка значения: цель мультиклассовая, но среднее значение = ‘binary’. Пожалуйста, выберите другое среднее значение

Ошибка при попытке напечатать кривую ROC немного отличается:

Ошибка значения: многоклассовый формат не поддерживается


НАБОР ДАННЫХ

НАБОР ДАННЫХ:

ССЫЛКА НА НАБОР ДАННЫХ:https://www.dropbox.com/s/yt3n1eqxlsb816n/Testfile — kNN.csv?dl=0

Программа

 import matplotlib
import pandas as pd
import numpy as np
import math
import matplotlib.pyplot as plt
from matplotlib.dviread import Text

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

#Tools para teste
from sklearn import metrics
from sklearn.metrics import confusion_matrix
from sklearn.metrics import f1_score
from sklearn.metrics import accuracy_score

def main():
    dataset = pd.read_csv('filetestKNN.csv')

    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, test_size=0.34)

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

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

    accuracy = Classifier.score(X_test, y_test)

    confusion = metrics.confusion_matrix(y_test, y_pred_class)

    print()
    print("Accuracy")
    print(metrics.accuracy_score(y_test, y_pred_class))
    print()
    print("Classification Error")
    print(1 - metrics.accuracy_score(y_test, y_pred_class))
    print()
    print("Confusion matrix")
    print(metrics.confusion_matrix(y_test, y_pred_class))
    #error
    print(metrics.recall_score(y_test, y_pred_class))
    #error
    print(metrics.roc_curve(y_test, y_pred_class))
    #error
    print(metrics.f1_score(y_test, y_pred_class))
    #error
    print(metrics.precision_score(y_test, y_pred_class))
  

Я просто хотел показать метрики алгоритма на экране.

Ответ №1:

Вам нужно задать average аргумент ключевого слова для этих sklearn.metrics функций. Для примера посмотрите на документацию f1_score . Вот часть, соответствующая average ключевому слову arg:

среднее значение: строка, [Отсутствует, ‘двоичный’ (по умолчанию), ‘микро’, ‘макрос’, ‘выборки’, ‘взвешенный’]

Этот параметр необходим для многоклассовых / многоуровневых целей. Если нет, возвращаются оценки для каждого класса. В противном случае это определяет тип усреднения, выполняемого для данных:

 'binary':
  Only report results for the class specified by pos_label. This is applicable only if targets (y_{true,pred}) are binary.
'micro':
  Calculate metrics globally by counting the total true positives, false negatives and false positives.
'macro':
  Calculate metrics for each label, and find their unweighted mean. This does not take label imbalance into account.
'weighted':
  Calculate metrics for each label, and find their average weighted by support (the number of true instances for each label).
  

Это изменяет ‘macro’ для учета дисбаланса меток; это может привести к
F-оценка, которая не находится между точностью и отзывом.
‘образцы’:
Вычислите показатели для каждого экземпляра и найдите их среднее значение (имеет смысл только для многоуровневой классификации, где это отличается от
accuracy_score).

Здесь мы можем видеть, что это описывает, как результаты агрегируются по различным меткам в вашей многоклассовой задаче. Я не уверен, какой из них вы хотели бы использовать, но micro кажется приятным. Вот как ваш вызов f1_score выглядел бы с этим выбором:

 print(metrics.f1_score(y_test, y_pred_class, average='micro'))
  

Вы можете настроить другие показатели аналогичным образом. Надеюсь, это поможет.