Machine learning kNN始终过度使用一个标签
我正在使用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
瓶子
被错误使用的频率更高
我取下标签并再次测试,但随后注意到另一个标签,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的使用不正确,可能是您单独将其安装到训练和测试中,而您应该只安装一次,然后再使用它。在代码的“隐藏”部分可能有更多这样的错误。实际上我只适合一个,你可以看看我文章底部的粘贴。谢谢你的计数!我将尝试调试那些额外的东西来自哪里,同时我意识到我应该在调试时播种我的随机分裂以进行测试和训练。如果我弄明白了,我会再发回来的。