Ошибка значения в метриках кНН - PullRequest
0 голосов
/ 28 марта 2019

У меня есть проект, который состоит из использования алгоритма 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. Presicion - печать (metrics.precision_score (y_test, y_pred_class))

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

ValueError: Цель мультиклассовая, но средняя = «двоичная» Пожалуйста, выберите другое среднее значение

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

ValueError: мультиклассовый формат не поддерживается


DATASET

DATASET:

ССЫЛКА НА ДАННЫЕ: https://www.dropbox.com/s/yt3n1eqxlsb816n/Testfile%20-%20kNN.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 Ответ

1 голос
/ 28 марта 2019

Вам необходимо установить аргумент ключевого слова 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).

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

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

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

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

...