如何计算两个 numpy 数组之间匹配的零元素的数量?

数据挖掘 数据 麻木的
2022-02-10 07:38:45

我有一个函数可以返回时间序列模型的预测精度。我有两个大小相同的 numpy 数组,一个用于实际方向,一个用于预测方向。我正在分类数据的方向是否与之前的 t-1 步骤发生了变化。“1”代表从 t-1 增加,“0”代表方向不变,“-1”代表从 t-1 减少。我正在尝试比较两个数组的元素以确定它们是否都包含相同的数据以确定准确性。

我可以匹配索引并计算匹配的“1”和“-1”的数量,但我无法计算匹配零的数量。(这有点难求和零)。:-) 无论如何,我已经尝试了将 '0' 指定为两个数组的参数的 numpy sum 函数,但它只返回一个零数组,但没有计数。我不是想创建一个混淆矩阵......这里的目标是创建一个准确度分数。我计划取所有匹配的,负数和零,然后将其除以总长度以获得准确度分数。

提前致谢。

1个回答

您可以使用简单的比较直接将预测与预期结果进行比较,在这种情况下只需==. 这将返回布尔值 -TrueFalse,您可以将其总结为True == 1False = 0

这是使用一些随机生成的虚拟数据的案例示例:

In [1]: import numpy as np                                                                                                           

In [2]: y = np.random.choice([-1, 0, 1], 10)                                                                                         

In [3]: preds = np.random.choice([-1, 0, 1], 10)                                                                                     

In [4]: y                                                                                                                            
Out[4]: array([ 1,  1,  1, -1,  1, -1, -1,  1,  1,  0])

In [5]: preds                                                                                                                        
Out[5]: array([ 0, -1,  1,  0,  1,  1, -1,  1, -1,  0])

然后使用两个检查来检查您的预测是否正确的真实部分:

  1. 预测在哪里等于基本事实,即你在哪里预测方向是正确的,以及
  2. 预测在哪里等于您感兴趣的方向,即向下 ( -1)、无变化 ( 0) 或向上 ( 1)

这可以按如下方式完成:

In [6]: (y == preds) & (preds == 0)   #   &   means we needs both checks to be True 
Out[6]:
array([False, False, False, False, False, False, False, False, False, True])

在这两项检查之后,我们只能看到最终位置为 True,因为这是唯一的预测位置True和价值方向0

然后,您可以编写一个循环来检查所有值并对它们执行一些操作:

In [7]: n = len(preds)    # the number of test samples (= 10 in my dummy example)

In [8]: for direction in [-1, 0, 1]:
            score = sum((y == preds) & (preds == 0)) 
            accuracy = score / n 
            print(f"Direction {direction:>2}: {score}/{n} = {accuracy * 100:.1f}%")

这使:

Direction -1: 1/10 = 10.0%
Direction  0: 1/10 = 10.0%
Direction  1: 1/10 = 10.0%