Machine learning kNN始终过度使用一个标签

Machine learning kNN始终过度使用一个标签,machine-learning,classification,knn,confusion-matrix,Machine Learning,Classification,Knn,Confusion Matrix,我正在使用kNN对标记图像进行分类。分类完成后,我将输出一个混淆矩阵。我注意到一个标签,瓶子被错误使用的频率更高 我取下标签并再次测试,但随后注意到另一个标签,shoe应用不正确,但上次没有问题 不应该进行规范化,所以我不确定是什么导致了这种行为。测试表明,无论我去掉多少标签,它都会继续。 不完全确定要发布多少代码,所以我将放一些应该相关的东西,然后粘贴其余的 def confusionMatrix(classifier, train_DS_X, train_DS_y, test_DS_X, t

我正在使用kNN对标记图像进行分类。分类完成后,我将输出一个混淆矩阵。我注意到一个标签,
瓶子
被错误使用的频率更高

我取下标签并再次测试,但随后注意到另一个标签,
shoe
应用不正确,但上次没有问题

不应该进行规范化,所以我不确定是什么导致了这种行为。测试表明,无论我去掉多少标签,它都会继续。 不完全确定要发布多少代码,所以我将放一些应该相关的东西,然后粘贴其余的

def confusionMatrix(classifier, train_DS_X, train_DS_y, test_DS_X, test_DS_y):
    # Will output a confusion matrix graph for the predicion
    y_pred = classifier.fit(train_DS_X, train_DS_y).predict(test_DS_X)
    labels = set(set(train_DS_y) | set(test_DS_y))

    def plot_confusion_matrix(cm, title='Confusion matrix', cmap=plt.cm.Blues):
        plt.imshow(cm, interpolation='nearest', cmap=cmap)
        plt.title(title)
        plt.colorbar()
        tick_marks = np.arange(len(labels))
        plt.xticks(tick_marks, labels, rotation=45)
        plt.yticks(tick_marks, labels)
        plt.tight_layout()
        plt.ylabel('True label')
        plt.xlabel('Predicted label')

    # Compute confusion matrix
    cm = confusion_matrix(test_DS_y , y_pred)
    np.set_printoptions(precision=2)
    print('Confusion matrix, without normalization')
    #print(cm)
    plt.figure()
    plot_confusion_matrix(cm)

    # Normalize the confusion matrix by row (i.e by the number of samples
    # in each class)
    cm_normalized = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
    print('Normalized confusion matrix')
    #print(cm_normalized)
    plt.figure()
    plot_confusion_matrix(cm_normalized, title='Normalized confusion matrix')

    plt.show()
主功能的相关代码:

# Select training and test data
    PCA = decomposition.PCA(n_components=.95)
    zscorer = ZScoreMapper(param_est=('targets', ['rest']), auto_train=False)
    DS = getVoxels (1, .5)
    train_DS = DS[0]
    test_DS = DS[1]

    # Apply PCA and ZScoring
    train_DS = processVoxels(train_DS, True, zscorer, PCA)
    test_DS = processVoxels(test_DS, False, zscorer, PCA)
    print 3*"\n"

    # Select the desired features
    # If selecting samples or PCA, that must be the only feature
    featuresOfInterest = ['pca']
    trainDSFeat = selectFeatures(train_DS, featuresOfInterest)
    testDSFeat = selectFeatures(test_DS, featuresOfInterest)
    train_DS_X = trainDSFeat[0]
    train_DS_y = trainDSFeat[1]
    test_DS_X = testDSFeat[0]
    test_DS_y = testDSFeat[1]


    # Optimization of neighbors
    # Naively searches for local max starting at numNeighbors
    lastScore = 0
    lastNeightbors = 1
    score = .0000001
    numNeighbors = 5
    while score > lastScore:
        lastScore = score
        lastNeighbors = numNeighbors
        numNeighbors += 1
        #Classification
        neigh = neighbors.KNeighborsClassifier(n_neighbors=numNeighbors, weights='distance')
        neigh.fit(train_DS_X, train_DS_y)

        #Testing
        score = neigh.score(test_DS_X,test_DS_y )

    # Confusion Matrix Output
    neigh = neighbors.KNeighborsClassifier(n_neighbors=lastNeighbors, weights='distance')
    confusionMatrix(neigh, train_DS_X, train_DS_y, test_DS_X, test_DS_y)

Pastebin:

问题的部分原因是我的轴被错误标记,当我认为我正在删除错误的标签时,实际上我只是删除了一个随机标签,这意味着错误的数据仍在分析中。修复轴并移除故障标签,该标签实际上是
rest
产生的:

我更改的代码是:
cm=混淆矩阵(测试、预测、标签)


基本上,我是根据我的已排序标签列表手动设置排序的。

标签的分布是什么?每个人有多少个?训练:
{'rest':256,“scrambledpix”:70,“瓶子”:66,“椅子”:61,“剪刀”:59,“脸”:57,“房子”:55,“猫”:54,“鞋”:48}
测试:
{'rest':248,“鞋”:68,“猫”:65,“房子”:63,“剪刀”:61,“脸”:61,“椅子”:57,“瓶子”:53,“scrambledpix”:49}
你在什么地方有错误。瓶子实例总数为119个,您的混淆矩阵显示了大约250个瓶子实例的正确分类。这还可能是PCA的使用不正确,可能是您单独将其安装到训练和测试中,而您应该只安装一次,然后再使用它。在代码的“隐藏”部分可能有更多这样的错误。实际上我只适合一个,你可以看看我文章底部的粘贴。谢谢你的计数!我将尝试调试那些额外的东西来自哪里,同时我意识到我应该在调试时播种我的随机分裂以进行测试和训练。如果我弄明白了,我会再发回来的。