Вопрос или проблема
У меня есть следующий фрейм фактической ценности,
[[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
выглядят как вероятности, а не как факт о принадлежности к определённым классам. Ниже я опишу, как преобразовать ваши вероятностные значения в классы и затем рассчитать необходимые метрики.
Шаги к решению проблемы
-
Преобразование вероятностей в классы: Для начала вам необходимо определить, какой порог использовать для преобразования вероятностей в метки классов. Обычно, наиболее распространённый порог равен 0.5. Таким образом, если вероятность для классов выше 0.5, мы будем считать, что это положительный класс.
-
Вычисление метрик: После этого вы сможете использовать результаты как массивы меток классов для вычисления различных метрик, таких как точность (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
отображает результаты для каждого класса.
Заключение
Используя подход, описанный выше, вы сможете успешно вычислить метрики для ваших предсказаний. Убедитесь, что ваши вероятности адекватно представлены, и примените правильный подход для преобразования в классы. Это позволит вам делать обоснованные выводы о производительности вашей модели.