为了账号安全,请及时绑定邮箱和手机立即绑定

查找两个数组之间的匹配项,并且第一个数组 == 1?

查找两个数组之间的匹配项,并且第一个数组 == 1?

智慧大石 2022-07-05 15:49:21
我有两个数组(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 functiondef 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 functiondef my_custom_accuracy(y_true, y_pred):    return float(sum(y_pred == y_true)) / sum(y_true)...简单,但我不知道如何添加“& y_pred == 1”部分。有任何想法吗?谢谢!
查看完整描述

2 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

如果数组还不是布尔值,请将它们设为布尔值。这可以通过视图廉价地完成,或者更简单地通过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 == 1and 。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)


查看完整回答
反对 回复 2022-07-05
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

您可以使用列表推导来检查列表,同时过滤掉 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)


查看完整回答
反对 回复 2022-07-05
  • 2 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信