簡體   English   中英

查找兩個數組之間的匹配項,並且第一個數組 == 1?

[英]Find matches between two arrays, AND the first array == 1?

我有兩個數組(y_true 和 y_pred),它們都由長度相同的 0 和 1 組成。

我想要一種更有效/更快的方法來計算 y_pred == y_true 和 y_pred == 1 的次數。我對計算匹配的 0 不感興趣。

現在,我的函數使用 for 循環如下所示:

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

....它有效,但 for 循環很慢而且效率不高。 我希望利用這樣的東西:

# 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”部分。 有任何想法嗎? 謝謝!

您可以使用列表理解來相互檢查列表,同時過濾掉 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)

如果數組還不是布爾值,請將它們設為布爾值。 這可以通過視圖廉價地完成,或者更簡單地使用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為真時為真,因此根據&運算符的定義,它自動暗示y_pref == 1y_true == 1 .

因此,您的最終結果是

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

這也可以寫成

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM