首页 > 解决方案 > 使用高级索引时形状不匹配

问题描述

我正在开发一个像集成一样的自定义分类器,将次要分类器组合在一起,集成的输出实际上是多数投票。值得一提的是,每个分类器都有一个与每个样本相关联的“权重”。

这是predict方法:

def predict(self, X):        
    
    G = self._compute_g(X) # G comes from a softmax distribution
    pred = np.zeros( (len(self._estimators), X.shape[0]), dtype=int ) 
    
    for i, estimator in enumerate(self._estimators): #loop each minor classifier
        y_est = estimator.predict(X)    
        pred[i] = y_est

    pred = pred.T # Prediction matrix (samples x classifiers)
    C = len(self._classes) # number of classes of the dataset
    M, N = pred.shape

    row, col = np.indices((M,N))
    P3d = np.zeros(shape=(M,N,C))
    P3d[row, col, pred-1] = G
    P = P3d.sum(axis=1)
    return np.argmax(P, axis=1)

对于多数投票,我创建了一个P矩阵(样本 x n_classes),它将在给定类中投票的分类器权重相加。例如:假设我们有 3 个分类器试图预测k3 类问题的样本。分类器权重是[0.3, 0.4, 0.6],预测是[1,1,2]k矩阵的第 - 行P[0.7, 0.6, 0],集成分类器的输出是1

问题是我正在尝试使用高级索引来构建矩阵P3d(用于构建矩阵P),并且在尝试预测 Iris 数据集时出现以下错误:

ValueError: shape mismatch: value array of shape (150,6) could not be broadcast to indexing result of shape (150,3)

这个错误来自这一行:P3d[row, col, pred-1] = G,但我不知道是什么导致了这个问题。

涉及的矩阵形状

标签: pythonnumpyscikit-learnnumpy-ndarrayarray-broadcasting

解决方案


如果没有看到完全可重现的代码,就很难判断G = self._compute_g(X)它在做什么。但是,返回的值G似乎有 shape (150, 6),不像(150, 3)预期的那样。因此,您会得到形状不匹配错误。

我建议您仔细检查一下,G以确认self._compute_g(X)是否符合您的预期。

作为旁注,明智地使用assert来确认各种数组的形状可以帮助捕获许多此类错误。IEassert G.shape == (M, N)


推荐阅读