Я использую kNN, чтобы сделать некоторую классификацию помеченных изображений. После того, как моя классификация выполнена, я выводил матрицу путаницы. Я заметил, что один ярлык, bottle
применялся неправильно чаще. kNN Постоянно Overusing One Label
Я снял ярлык и снова проверял, но затем заметил, что другая метка, 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: http://pastebin.com/U7yTs3vs
Что такое распространение этикеток? Сколько из них? – lejlot
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} ' –
у вас где-то есть ошибки. Общее количество экземпляров бутылок - 119, а ваша матрица замешательства показывает около 250 правильных классификаций экземпляров бутылок. – lejlot