вычислить метрики sklearn из двумерного массива

Вопрос или проблема

У меня есть следующий фрейм фактической ценности,

[[0.1,0.2,0.3,0.4,0.5],
 [0.1,0.1,0.3,0.4,0.5],
 [0.1,0.1,0.3,0.4,0.1],
 [0.1,0.3,0.3,0.4,0.5],
 [0.1,0.2,0.2,0.4,0.4],
]

И я построил свою модель, которая предсказала значение следующим образом:

[[0.2,0.4,0.3,0.4,0.1],
 [0.1,0.1,0.3,0.4,0.5],
 [0.2,0.2,0.2,0.4,0.1],
 [0.3,0.3,0.4,0.4,0.2],
 [0.5,0.2,0.2,0.4,0.4],
]

Каждый из них находится в файле csv, я читаю оба как фреймы pandas и обрабатываю их следующим образом:

   arr1 = df1.values
   arr2 = df2.values
   import numpy as np
   from sklearn.metrics import hamming_loss, accuracy_score, precision_score, 
   recall_score, f1_score 
   from sklearn.metrics import multilabel_confusion_matrix
   y_true = np.array(arr1)
   y_pred = np.array(arr2)
   conf_mat=multilabel_confusion_matrix(y_true, y_pred)

и я получаю следующую ошибку,

if y_type not in ["binary", "multiclass", "multilabel-indicator"]:
--> 104         raise ValueError("{0} is not supported".format(y_type))
    105 
    106     if y_type in ["binary", "multiclass"]:
ValueError: continuous-multioutput is not supported

Как я могу получить отчет sklearn для моих значений?

Основываясь на метриках, которые вы импортируете, я предполагаю, что ваши входные данные представляют собой некую вероятность. Однако ваши данные не нормализованы, поэтому я могу ошибаться.
В любом случае, Sklearn не может вычислить ваши метрики из данных, которые не являются классом-меткой или бинарным вводом. Если вы хотите, например, вычислить точность вашего предсказания, вам нужно преобразовать ваши данные из вероятности (т.е. 80% a, 20% b) в класс (метка: a), чтобы для каждого предсказания Sklearn мог сравнить ваше предсказание с данными истинной основы.

Ответ или решение

Для успешного вычисления метрик с использованием библиотеки scikit-learn, ваши данные должны представлять собой метки классов или бинарные значения. В вашем случае, значения в массивах y_true и y_pred выглядят как вероятности, а не как факт о принадлежности к определённым классам. Ниже я опишу, как преобразовать ваши вероятностные значения в классы и затем рассчитать необходимые метрики.

Шаги к решению проблемы

  1. Преобразование вероятностей в классы: Для начала вам необходимо определить, какой порог использовать для преобразования вероятностей в метки классов. Обычно, наиболее распространённый порог равен 0.5. Таким образом, если вероятность для классов выше 0.5, мы будем считать, что это положительный класс.

  2. Вычисление метрик: После этого вы сможете использовать результаты как массивы меток классов для вычисления различных метрик, таких как точность (accuracy), полнота (recall), точность (precision) и F1-меру.

Пример кода

Вот пример, который показывает, как это сделать:

import numpy as np
import pandas as pd
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, multilabel_confusion_matrix

# Загрузка данных
# df1 = pd.read_csv('path_to_true_values.csv')
# df2 = pd.read_csv('path_to_predicted_values.csv')

# Пример данных
arr1 = np.array([[0.1,0.2,0.3,0.4,0.5],
                 [0.1,0.1,0.3,0.4,0.5],
                 [0.1,0.1,0.3,0.4,0.1],
                 [0.1,0.3,0.3,0.4,0.5],
                 [0.1,0.2,0.2,0.4,0.4]])

arr2 = np.array([[0.2,0.4,0.3,0.4,0.1],
                 [0.1,0.1,0.3,0.4,0.5],
                 [0.2,0.2,0.2,0.4,0.1],
                 [0.3,0.3,0.4,0.4,0.2],
                 [0.5,0.2,0.2,0.4,0.4]])

# Преобразование вероятностей в метки классов
threshold = 0.5
y_true = (arr1 > threshold).astype(int)
y_pred = (arr2 > threshold).astype(int)

# Вычисление метрик
accuracy = accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred, average='micro')
recall = recall_score(y_true, y_pred, average='micro')
f1 = f1_score(y_true, y_pred, average='micro')
conf_mat = multilabel_confusion_matrix(y_true, y_pred)

# Вывод результатов
print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 Score:", f1)
print("Confusion Matrix:\n", conf_mat)

Пояснения к коду

  • Преобразование вероятностей: Мы используем условие arr > threshold, чтобы создать бинарные массивы, где значения 1 представляют положительный класс (вероятность выше 0.5), а 0 — отрицательный.
  • Выбор метрик: Мы использовали функции accuracy_score, precision_score, recall_score и f1_score, что позволяет разбираться в различных аспектах производительности вашей модели.
  • Матрица ошибок: multilabel_confusion_matrix отображает результаты для каждого класса.

Заключение

Используя подход, описанный выше, вы сможете успешно вычислить метрики для ваших предсказаний. Убедитесь, что ваши вероятности адекватно представлены, и примените правильный подход для преобразования в классы. Это позволит вам делать обоснованные выводы о производительности вашей модели.

Оцените материал
Добавить комментарий

Капча загружается...