#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 и т.д.), Всегда будет приводить к одному и тому же конечному значению!» или я не понимаю, как это может быть правдой. Вы хотите сказать, что выбор взвешивания не влияет на результат?