#python #artificial-intelligence #knn #valueerror
#python #искусственный интеллект #knn #ошибка значения
Вопрос:
У меня есть проект, который заключается в использовании алгоритма kNN в файле csv и отображении выбранных показателей. Но когда я пытаюсь представить некоторые показатели, он выдает несколько ошибок.
При попытке использовать: чувствительность, f1_Score и точность:
- чувствительность — печать (metrics.recall_score(y_test, y_pred_class))
- F1_score — печать (metrics.f1_score(y_test, y_pred_class))
- Предварительный просмотр — печать (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'))
Вы можете настроить другие показатели аналогичным образом. Надеюсь, это поможет.