Используйте сумму в долларах США как убыток для измерения эффективности классификации - PullRequest
0 голосов
/ 03 января 2019

Я работаю над системой обнаружения мошенничества, и я хотел бы оптимизировать систему с учетом стоимости (в $) отдела обзора:

Я хотел бы скорректировать потери в зависимости отпо окончательной стоимости:

  • Если транзакция мошенническая, но сумма небольшая, тратить время на проверку может быть дороже.
  • Не мошенническая транзакция, котораяпроверяется по-прежнему имеет стоимость.
  • Некоторые транзакции могут быть действительно дорогостоящими и должны быть пойманы

Метрика должна быть суммой:

  • TP-> Без затрат
  • FP -> Стоимость проверки
  • TN -> Стоимость проверки + сумма денег, которую мы вернули в результате мошенничества (если это не совокупность)
  • FN -> Общая сумма мошеннической транзакции

Метрика должна выглядеть следующим образом:

def fraudmetric(ytrue, ypred, fraudulentamt, reviewcost):
  cost = [0 if yt==0 and yp==0 else          ## TN
          reviewcost if yt==1 and yp==1 else ## TP
          reviewcost if yt==0 and yp==1 else ## FP
          fa if yt==1 and yp==0 else 0       ## FN
          for yt, yp, fa in zip(ytrue, ypred, fraudulentamt, reviewcost)]
  return np.sum(cost)

Существует ли элегантный способ сделать это с помощью Python?

Спасибо

1 Ответ

0 голосов
/ 03 января 2019

Вы можете легко реализовать такую ​​двоичную таблицу, используя ... ну, таблицу.Это выглядело бы так:

metric_table = [[0, reviewcost],
                [fa, reviewcost]]
metric_value = metric_table[yt][yp]  # for a given yt, yp

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

def fraudmetric(ytrue, ypred, fraudulentamt, reviewcost):
    return sum([[ 0, rc],
                [fa, rc]][yt][yp]
               for yt, yp, fa, rc in zip(ytrue, ypred, fraudulentamt, reviewcost))
...