Saturday, February 26, 2022

Precision and Recall in Python

 В задаче несбалансированной классификации с более чем двумя классами точность рассчитывается как сумма истинных срабатываний по всем классам, деленная на сумму истинных срабатываний и ложных срабатываний по всем классам.

Точность = сумма c в C TruePositives_c / сумма c в C (TruePositives_c + FalsePositives_c)

Например, у нас может быть проблема несбалансированной мультиклассовой классификации, в которой класс большинства является отрицательным классом, но есть два положительных класса меньшинства: класс 1 и класс 2. Точность может количественно определить соотношение правильных прогнозов для обоих положительных классов.

Рассмотрим набор данных с отношением класса меньшинства к классу большинства 1:1:100, то есть отношением 1:1 для каждого положительного класса и отношением 1:100 для классов меньшинства к классу большинства, и у нас есть 100 примеров в каждом меньшинстве. класс и 10 000 примеров в классе большинства.

Модель делает прогнозы и предсказывает 70 примеров для первого класса меньшинства, где 50 правильных и 20 неправильных. Он предсказывает 150 для второго класса с 99 правильными и 51 неправильным. Точность можно рассчитать для этой модели следующим образом:

Точность = (ИстинноПоложительные_1 + ИстинныеПоложительные_2) / ((ИстинноПоложительные_1 + ИстинныеПоложительные_2) + (ЛожныеПоложительные_1 + ЛожныеПоложительные_2))

Точность = (50 + 99) / ((50 + 99) + (20 + 51))

Точность = 149 / (149 + 71)

Точность = 149/220

Точность = 0,677

При использовании функции precision_score() для мультиклассовой классификации важно указать миноритарные классы с помощью аргумента «метки» и установить для аргумента «среднее» значение «микро», чтобы гарантировать, что расчет выполняется так, как мы ожидаем.

Code1

(.env) [boris@fedora34server NUMPY]$ cat CalculatePrecision1.py
# calculates precision for 1:1:100 dataset with 50tp,20fp, 99tp,51fp                       
from sklearn.metrics import precision_score                                                
# define actual                                                                            
act_pos1 = [1 for _ in range(100)]                                                         
act_pos2 = [2 for _ in range(100)]                                                         
act_neg = [0 for _ in range(10000)]                                                        
y_true = act_pos1 + act_pos2 + act_neg                                                     
# define predictions                                                                       
pred_pos1 = [0 for _ in range(50)] + [1 for _ in range(50)]                                
pred_pos2 = [0 for _ in range(1)] + [2 for _ in range(99)]                                 
pred_neg = [1 for _ in range(20)] + [2 for _ in range(51)] + [0 for _ in range(9929)]      
y_pred = pred_pos1 + pred_pos2 + pred_neg
# calculate prediction
precision = precision_score(y_true, y_pred, labels=[1,2], average='micro')
print('Precision: %.3f' % precision)






























Отзыв для многоклассовой классификации
Напомним, не ограничивается задачами бинарной классификации.
В задаче несбалансированной классификации с более чем двумя классами полнота вычисляется как сумма истинных положительных результатов по всем классам, деленная на сумму истинных положительных и ложных отрицательных результатов по всем классам.
Отзыв = Сумма c в C TruePositives_c / Сумма c в C (TruePositives_c + FalseNegatives_c)
Как и в предыдущем разделе, рассмотрим набор данных с отношением класса меньшинства к классу большинства 1:1:100, то есть отношением 1:1 для каждого положительного класса и отношением 1:100 для классов меньшинства к классу большинства, и мы иметь 100 примеров в каждом классе меньшинства и 10 000 примеров в классе большинства.
Модель правильно предсказывает 77 примеров и 23 неверно для класса 1, 95 правильно и пять неверно для класса 2. Мы можем рассчитать полноту для этой модели следующим образом:
Напомним = (ИстинноПоложительные_1 + ИстинныеПоложительные_2) / ((ИстинноПоложительные_1 + ИстинныеПоложительные_2) + (ЛожноОтрицательные_1 + ЛожноОтрицательные_2))
Напомним = (77 + 95) / ((77 + 95) + (23 + 5))
Напомним = 172 / (172 + 28)
Напомним = 172/200
Напомним = 0,86
Мы также можем использовать функцию Recall_score() для несбалансированных задач мультиклассовой классификации.
В этом случае набор данных имеет дисбаланс 1:1:100, по 100 в каждом классе меньшинства и 10 000 в классе большинства. Модель предсказывает 77 истинных положительных результатов и 23 ложных отрицательных результата для класса 1 и 95 истинных положительных результатов и пять ложных отрицательных результатов для класса 2.

Code2

(.env) [boris@fedora34server NUMPY]$ cat CalculateRecall.py
# calculates recall for 1:1:100 dataset with 77tp,23fn and 95tp,5fn
from sklearn.metrics import recall_score
# define actual

act_pos1 = [1 for _ in range(100)]
act_pos2 = [2 for _ in range(100)]
act_neg = [0 for _ in range(10000)]
y_true = act_pos1 + act_pos2 + act_neg

# define predictions
pred_pos1 = [0 for _ in range(23)] + [1 for _ in range(77)]
pred_pos2 = [0 for _ in range(5)] + [2 for _ in range(95)]
pred_neg = [0 for _ in range(10000)]
y_pred = pred_pos1 + pred_pos2 + pred_neg

# calculate recall
recall = recall_score(y_true, y_pred, labels=[1,2], average='micro')
print('Recall: %.3f' % recall)





















References 



No comments:

Post a Comment