TypeError:不可散列的类型:'numpy.ndarray'

数据挖掘 Python scikit-学习 麻木的
2022-03-02 05:40:15

我正在尝试对两个深度学习模型的预测进行多数投票。y_pred 和 vgg16_y_pred 的形状均为 (200,1),类型为“int64”。

max_voting_pred = np.array([])
for i in range(0,len(X_test)):
    max_voting_pred = np.append(max_voting_pred, statistics.mode([y_pred[i], vgg16_y_pred[i]])) 

我遇到以下错误:

TypeError: unhashable type: 'numpy.ndarray'

我应该如何传递数据?

1个回答

问题是您正在将一个 numpy 数组列表传递给该mode函数。它需要一个值列表,或者一个带有值的 numpy 数组(基本上任何单个容器都可以,但似乎不是数组列表)。

这是因为它必须制作某种哈希映射以确定最常见的情况,因此mode它无法散列数组列表。

一种解决方案是简单地索引每个数组中的值(这意味着mode获取整数列表)。只需将主线更改为:

max_voting_pred = np.append(max_voting_pred, mode([a[i][0], b[i][0]]))

让我知道这是否不能解决问题。


如果您想要一些可能比修复原始代码更容易的东西,请尝试使用模块中的mode函数scipyscipy.stats.mode

此版本允许您传递整个数组并简单地指定一个轴来计算模式。鉴于您拥有来自两个模型的完整预测向量:

  1. 将两个数组合并为一个(200, 2)矩阵的两列

    results = np.concatenate((y_pred, vgg16_y_pred), axis=1)
    

现在,您可以在单行上对该矩阵执行模式,但只需一次操作(无需循环):

max_votes = scipy.stats.mode(results, axis=1)

结果包含两件事。

  1. 每行的众数
  2. 该行中该模式的计数。

因此,要获得您想要的结果(与您的原始结果相匹配max_voters_pred,您必须从 中获取第一个元素max_votes

max_voters_pred = max_votes[0]