2016-04-06 10 views
0

Я использую kNN, чтобы сделать некоторую классификацию помеченных изображений. После того, как моя классификация выполнена, я выводил матрицу путаницы. Я заметил, что один ярлык, bottle применялся неправильно чаще. bottle_matrixkNN Постоянно Overusing One Label

Я снял ярлык и снова проверял, но затем заметил, что другая метка, shoe была применена неправильно, но в последний раз была в порядке. enter image description here

Не должно быть нормализации, поэтому я не уверен, что вызывает подобное поведение. Тестирование показало, что это продолжалось независимо от того, сколько ярлыков я удалил. Не совсем уверен, сколько кода для публикации, поэтому я поставлю некоторые вещи, которые должны быть релевантными, и остальное.

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: http://pastebin.com/U7yTs3vs

+1

Что такое распространение этикеток? Сколько из них? – lejlot

+0

train_ds: '{'rest': 256, 'scrambledpix': 70, 'bottle': 66, 'chair': 61, 'scissors': 59, 'face': 57, 'house': 55, 'cat' : 54, 'shoe': 48} ' test_ds:' {'rest': 248, 'shoe': 68, 'cat': 65, 'house': 63, 'scissors': 61, 'face' : 61, 'chair': 57, 'bottle': 53, 'scrambledpix': 49} ' –

+0

у вас где-то есть ошибки. Общее количество экземпляров бутылок - 119, а ваша матрица замешательства показывает около 250 правильных классификаций экземпляров бутылок. – lejlot

ответ

0

Проблемы была частично результат моей оси помечается, когда я думал, что удаление неисправных метки I на самом деле просто удалил случайную метку, а это означало, что все еще анализировались ошибочные данные. Закрепление оси и удаление неисправного ярлыка, который был на самом деле rest дало: enter image description here

кода я изменил это: cm = confusion_matrix(test_DS_y , y_pred, labels)

В основном я вручную установить порядок, основанный на моем список упорядоченных меток.