Найти совпадения между двумя массивами И первым массивом == 1? - PullRequest
0 голосов
/ 22 января 2020

У меня есть два массива (y_true и y_pred), оба из которых состоят из 0 и 1 одинаковой длины.

Я хочу более эффективный / более быстрый способ подсчета, сколько раз y_pred == y_true И когда y_pred == 1. Я не заинтересован в подсчете совпадающих нулей.

В данный момент моя функция выглядит следующим образом, используя для l oop:

from sklearn.metrics.scorer import make_scorer
# Make a custom metric function
def my_custom_accuracy(y_true, y_pred):       # Bring in the arrays
    good_matches = 0                          # Set counter to 0
    for num, i in enumerate(y_pred):          # for each y_pred in array...
        if i == y_true[num] & i == 1:         # if y_pred == y_true AND y_pred == 1...
            good_matches += 1                 # count it as a good match
    return float(good_matches / sum(y_true))  # return good matches as a % of all the 1's in y_true

... .it работает, но для l oop медленно и не очень эффективно. Я надеялся использовать что-то вроде этого:

# Make a custom metric function
def my_custom_accuracy(y_true, y_pred):
    return float(sum(y_pred == y_true)) / sum(y_true)

... просто, но я не знаю, как добавить в "& y_pred == 1" часть. Любые идеи? Спасибо!

Ответы [ 2 ]

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

Если массивы еще не являются логическими, сделайте их логическими. Это можно сделать дешево с помощью представления или, проще, с помощью astype:

y_pred = y_pred.astype(bool)
y_true = y_true.astype(bool)

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

Теперь good_matches это просто

good_matches = np.sum(y_pred & y_true)

Чтобы понять, почему это так, обратите внимание, что в дополнение к явно содержащему y_pred == y_true выражение может быть истинным, только если y_pred Значение true, поэтому оно автоматически подразумевает y_pref == 1 и y_true == 1 по определению оператора &.

Следовательно, ваш конечный результат будет

np.sum(y_pred & y_true) / np.sum(y_true)

Это можно записать как

np.count_nonzero(y_pred & y_true) / np.count_nonzero(y_true)
1 голос
/ 22 января 2020

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

compare = [p == t for p, t in zip(y_pred, y_true) if p == 1]
accuracy = compare.count(True) / len(compare)

Или для чего-то, использующего numpy:

mask = np.where(y_true == y_pred)
matches = y_pred[mask]
accuracy = np.sum(matches) / len(matches)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...