Пользовательская точность метри c в диапазоне, для регрессии - PullRequest
0 голосов
/ 20 января 2020

Мне нужно написать метрику точности c (во время тренировки), которая вычисляет% точности по диапазону. Так что это показало бы мою индивидуальную точность каждую эпоху во время тренировок.

Например, Если y_pred равно 343, а y_target равно 340, а диапазон равен 10, его следует считать правильным. Это означает, что любое прогнозируемое значение в диапазоне [340-5, 340+5] будет считаться правильным для этого экземпляра.

Но существующая метрика точности c будет считать вышеупомянутое неверным, а точность очень низка для проблем регрессии. ,

Ответы [ 2 ]

1 голос
/ 20 января 2020

Вам нужно:

y_pred = [125, 332, 268, 349]
y_target = [129, 342, 265, 370]

def accuracy(y_pred, y_target):
    a = [1 for i,j in zip(y_pred, y_target) if i in range(j-5,j+6)]

    return sum(a)/len(y_pred)

print(accuracy(y_pred, y_target))

Вывод:

0.5
0 голосов
/ 20 января 2020

Если вы используете Numpy

import numpy as np

...

good = np.abs(pred-target) <= (range/2)

, это будет вектор логических значений (False и True), сообщающий вам, достаточно ли предсказан прогноз.

Логические значения в Python может использоваться как целое число (со значениями соответственно равными 0 и 1), и это означает, что вы можете суммировать массив good, чтобы узнать, сколько прогнозов было на цели

n_good = np.sum(good)

Небольшой эталон

In [1]: import numpy as np 
   ...:  
   ...: target = np.ones(2**18, dtype=int)*10 
   ...: predicted = np.random.randint(0, 21, 2**18)                                       

In [2]: %timeit [1 for i,j in zip(predicted, target) if i in range(j-5,j+6)] 
   ...: %timeit sum(1 for i,j in zip(predicted, target) if i in range(j-5,j+6)) 
   ...: %timeit np.abs(predicted-target)<=5 
   ...: %timeit np.sum(np.abs(predicted-target)<=5)                                       
983 ms ± 6.22 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
964 ms ± 11.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1.63 ms ± 44.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
2.18 ms ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [3]: 
...