Я пытаюсь понять, почему оценка F1 такая же, как в sklearn. Я понимаю, что он рассчитывается как:

F1 = 2 * (precision * recall) / (precision + recall)

Мой код:

from sklearn.metrics import f1_score, precision_score, recall_score
...
fmeasure1 = f1_score(true_output, predicted_output, average="macro")
fmeasure2 = f1_score(true_output, predicted_output, average="micro")

precision = precision_score(true_output, predicted_output, average="macro")
recall = recall_score(true_output, predicted_output, average="macro")

print 2*(precision*recall)/(precision + recall), fmeasure1, fmeasure2

Значения, которые я получаю для своих данных:

0.785744255639 0.769527615775 0.984532095901

Я не понимаю, почему эти три ценности отличаются друг от друга. Я пробовал читать документацию здесь, но Я все еще заблудился.

Мой набор данных является многоуровневым и по своей природе очень несбалансированным. Какое из приведенных здесь значений является «правильным» значением и, соответственно, какой из параметров для среднего (например, «Нет», «микро», «макро», «вес») мне следует использовать?

Спасибо, и любая информация будет очень ценной.

2
meraxes 22 Дек 2016 в 10:33

1 ответ

Лучший ответ

Посмотрите на возвращаемое значение:

Returns:    
f1_score : float or array of float, shape = [n_unique_labels]
F1 score of the positive class in binary classification or weighted average of the F1 scores of each class for the multiclass task.

Каждое значение представляет собой оценку F1 для этого конкретного класса, поэтому каждый класс может быть предсказан с разной оценкой.

Что касается лучшего результата.

best value at 1 and worst score at 0.[ \[From documentation\]][1]

Кстати, если вы имеете дело с сильно несбалансированными наборами данных, вам следует подумать о методах выборки или просто подвыборке из существующих данных, если это позволяет.

Если вы хотите получить среднее значение прогнозов average='weighted':

sklearn.metrics.f1_score(y_true, y_pred, labels=None, pos_label=1, average='weighted')
2
SerialDev 22 Дек 2016 в 10:55
Я не понимаю. Каждая оценка F1 предназначена для определенного класса?
 – 
meraxes
22 Дек 2016 в 10:42
В шестой строке документации: В случае с несколькими классами и несколькими метками это средневзвешенное значение балла F1 каждого класса.
 – 
SerialDev
22 Дек 2016 в 10:48
Хорошо, спасибо за ваш вклад. Однако мой вопрос все еще остается: почему эти значения отличаются от значения, возвращаемого: 2 * (точность * отзыв) / (точность + отзыв)?
 – 
meraxes
22 Дек 2016 в 11:00
Из документации: Рассчитайте метрики для каждой метки и найдите их среднее значение, взвешенное по поддержке (количество истинных экземпляров для каждой метки). Это изменяет "макрос" для учета дисбаланса меток; это может привести к получению F-оценки, которая не находится между точностью и отзывом, поэтому возвращаемое значение обязательно будет другим. рассмотрите возможность принятия, если это ответило на ваш вопрос
 – 
SerialDev
22 Дек 2016 в 11:18
1
Хорошо, теперь я понимаю. Первое значение в моем выводе принимает f-меру средней точности и отзыва, тогда как sklearn возвращает среднюю f-меру точности и отзыва / для каждого класса /. Спасибо.
 – 
meraxes
22 Дек 2016 в 11:23