Среднее геометрическое значение точности и отзыва

#python #python-3.x #machine-learning #classification #metrics

#python #python-3.x #машинное обучение #классификация #показатели

Вопрос:

Я пытаюсь создать пользовательскую метрику для оценки модели ML. Я хочу сделать взвешенное среднее геометрическое значение точности и отзыва и взвесить его таким образом, чтобы приоритет отдавался отзыву, а не точности. Я знаю, что среднее геометрическое значение — это sqrt(точность * отзыв), но я не уверен, как его параметризовать, чтобы придать большее значение отзыву в python. Существует эта метрика из библиотеки дисбаланса, но я не вижу никаких весов, которые я мог бы предоставить

 imblearn.metrics.geometric_mean_score(y_true, y_pred, labels=None, pos_label=1, average='multiclass', sample_weight=None, correction=0.0)
 

Есть идеи о том, как реализовать то, что я хочу, на python?

Ответ №1:

Если вы столкнулись с class-imbalance проблемой, multi-class geometric mean отличным вариантом является разница между точностью и отзывом, взвешенная по метке supports (количество выборок позиций для каждой метки) (это разрешено в связанном вами API imblearn с параметром average='weighted' ).

Однако, IIUC, это не то, что вы ищете. Вы пытаетесь взять взвешенное среднее геометрическое значение между precision и recall .

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

Вы можете вычислить precision и recall с помощью sklearn api из y_true и y_pred , а затем использовать функцию для вычисления weighted geometric mean .

Я написал weighted_geometric_mean функцию, основанную на следующем определении (первая форма со степенями вместо экспонент) —

введите описание изображения здесь

 from sklearn.metrics import precision_score, recall_score

y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]

precision = precision_score(y_true, y_pred, average='micro')
recall = recall_score(y_true, y_pred, average='micro')
#parameter 'micro' calculates metrics globally by counting the total TP, FN and FP

scores = [precision, recall]
weights = [0.6,0.4]  #60% precision, 40% recall

def weighted_geometric_mean(scores, weights):
    wgm = np.product(np.power(scores, weights))
    return wgm

weighted_geometric_mean(scores, weights)
 
 0.3333333333333333
 

Приведенная выше реализация использует глобальную точность и отзыв с параметром micro . Если вы хотите учитывать веса по классам для вычисления точности и отзыва (для ситуаций с дисбалансом классов), пожалуйста, установите его равным weighted


Редактировать: С другой стороны, взвешенное среднее геометрическое значение между глобальной точностью и отзывом с весами, которые суммируются до 1 (60: 40 или 50: 50 и т.д.), Всегда будет приводить к одному и тому же конечному значению! Вы можете получить это, записав точность в форме TP, FP и то же самое для отзыва. Поэтому я бы рекомендовал поддерживать weighted точность и отзыв метки.

Комментарии:

1. Большое вам спасибо за ответ. Единственное, чего я не понимаю, это то, где в функции над каждым из весов соответствует либо точности, либо отзыву (т. Е. Откуда мы знаем, что 3 — это вес отзыва, а 2 — вес точности?)

2. Я обновил код, чтобы упростить определение. Теперь вы можете считать веса в процентах (0,3 = 30%)

3. Проверьте эту ссылку для получения более подробной информации о том, как определить веса. Я также добавил это как часть ответа.

4. Дайте мне знать, если это решило ваш вопрос. Спасибо!

5. Либо я не понимаю вашего утверждения о редактировании «взвешенное среднее геометрическое значение между глобальной точностью и отзывом с весами, которые суммируются до 1 (60: 40 или 50: 50 и т.д.), Всегда будет приводить к одному и тому же конечному значению!» или я не понимаю, как это может быть правдой. Вы хотите сказать, что выбор взвешивания не влияет на результат?