2015-12-15 2 views
-2

я не мог сделать функцию такой же, как в примере ниже я получил одно возвращаемое значение только выше 3 балловкак я могу сделать оценку качества фильтра?

качество фильтра будет определяться в соответствии со следующей формулой:

q=((TP+TN)/(TP+TN+10*FP+FN)) 

положительных случаев (P) - это электронные письма, которые фильтруются как спам, а отрицательные случаи (N) - это электронные письма, которые фильтруются как обычные сообщения электронной почты. Таким образом, FP представляет собой количество писем, которые неправильно помечены как спам, FN - это количество спам-писем, которые проходят без пометок.

Важно отметить, что TP, FP, TN, FN - это частоты (количество случаев), а не проценты.

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

q  pts 
<0, 0.3) 0 
<0.3, 0.5) 1 
<0.5, 0.7) 2 
<0.7, 0.9) 2.5 
<0.9, 1> 3 

мой код до сих пор:

def quality_score(TP, TN, FP, FN): 
     q=(TP+TN//TP+TN+10*FP+FN) 

     return q 
+1

то, что я прочитал это: 'TP + (TN/TP) + TN + 10 * FP + FN', вам необходимо проверить вашу скобку – MaTh

+2

Пожалуйста, напишите, если у вас есть какие-либо конкретные проблемы или ошибки. У вашего существующего кода есть одна чрезвычайно простая ошибка. Остальная реализация более или менее тривиальна. –

+0

Да, он возвращает все то же самое значение, как я могу исправить свою функцию, поэтому он возвращает то же, что и пример – jason

ответ

0

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

pointsTable = [ 
    (0, 0), 
    (0.3, 1), 
    (0.5, 2), 
    (0.7, 2.5), 
    (0.9, 3) 
    ] 

def calculate_quality_points(tp, tn, fp, fn): 
    q = get_quality_score(tp, tn, fp, fn) 
    return get_quality_points(q) 

def get_quality_score(tp, tn, fp, fn): 
    return float(tp + tn)/(tp + tn + 10 * fp + fn) 

def get_quality_points(q): 
    i = 0 
    if q < 0 or q > 1: 
     return -1 
    for i in range(len(pointsTable) - 1): 
     if q >= pointsTable[i][0] and q < pointsTable[i + 1][0]: 
      return pointsTable[i][1] 
    return pointsTable[len(pointsTable) - 1][1] 

Этот код также проверяет, находится ли значение q вне диапазона [0, 1].

Использование:

print(calculate_quality_points(30, 20, 4, 3)) 
Смежные вопросы