猿问

使用 SVC 分类的 100% 准确度,一定有问题吗?

我试图实现的上下文:


我在使用 scikit 进行图像分类时遇到问题。我有 Cifar 10 数据、训练和测试图像。有 10000 张训练图像和 1000 张测试图像。每个测试/训练图像都存储在测试/训练 npy 文件中,作为 4 维矩阵(高度、宽度、rgb、样本)。我也有测试/训练标签。我有一个“computeFeature”方法,它利用定向梯度直方图方法将图像域特征表示为向量。我试图在训练和测试数据上迭代此方法,以便我可以创建一组可以稍后使用的特征,以便对图像进行分类。我尝试使用 I 创建一个 for 循环并将结果存储在一个 numpy 数组中。然后我必须继续应用 PCA/LDA 并使用 SVC 和 CNN 等(任何图像分类方法)进行图像分类。


import numpy as np

import skimage.feature

from sklearn.decomposition import PCA

trnImages = np.load('trnImage.npy')

tstImages = np.load('tstImage.npy')

trnLabels = np.load('trnLabel.npy')

tstLabels = np.load('tstLabel.npy')

from sklearn.svm import SVC


def computeFeatures(image):

hog_feature, hog_as_image = skimage.feature.hog(image, visualize=True, block_norm='L2-Hys')

return hog_feature


trnArray = np.zeros([10000,324]) 

tstArray = np.zeros([1000,324])


for i in range (0, 10000 ):

    trnFeatures = computeFeatures(trnImages[:,:,:,i])

    trnArray[i,:] = trnFeatures



for i in range (0, 1000):

    tstFeatures = computeFeatures(tstImages[:,:,:,i])

    tstArray[i,:] = tstFeatures



pca = PCA(n_components = 2)

trnModel = pca.fit_transform(trnArray)

pca = PCA(n_components = 2)

tstModel = pca.fit_transform(tstArray)


# Divide the dataset into the two sets.

test_data = tstModel

test_labels = tstLabels 

train_data = trnModel

train_labels = trnLabels 


C = 1 

model = SVC(kernel='linear', C=C)


model.fit(train_data, train_labels.ravel())


y_pred = model.predict(test_data)


accuracy = np.sum(np.equal(test_labels, y_pred)) / test_labels.shape[0] 

print('Percentage accuracy on testing set is: {0:.2f}%'.format(accuracy))

准确度打印为 100%,我很确定这是错误的,但我不确定为什么?


心有法竹
浏览 298回答 3
3回答

蓝山帝景

您的方法的一个明显问题是您以一种相当奇特的方式应用 PCA。您通常应该只估计一个变换——在训练数据上——然后用它来变换任何评估集。通过这种方式,您有点……使用白化批处理规范实现 SVM,这听起来很酷,但至少相当不寻常。所以它需要非常小心。例如,通过这种方式,您无法对单个样本进行分类。尽管如此,它仍然可以作为一种无监督的适应技术。除此之外,如果不访问您的数据就很难判断。你确定测试集和训练集是不相交的吗?

哆啦的时光机

在这种情况下,当务之急是模型过度拟合。任何专业评审员都会立即将其返还给调查员。在这种情况下,我怀疑这是使用的统计方法的结果。我不处理图像,但我会质疑为什么 PCA 被堆叠到 SVM 上。通俗地说,您正在使用两种连续的方法来减少/折叠超维空间。这很可能会导致确定的结果。如果您一次折叠高级维度,为什么要重复它?PCA 是图像的标准,但后面应该有一些非常简单的东西,比如 K-means。当然,另一种代替 PCA 的方法是 NMF,如果您觉得 PCA 没有提供所寻求的解决方案,我会推荐它。否则计算看起来不错。accuracy = np.sum(np.equal(test_labels, y_pred)) / test_labels.shape[0]再想一想,准确度指数可能与过拟合无关,IF(这是一种语法强调类型“IF”),test_labels 包含对图像的预测(其中约 50% 是不正确的)。然而,我只是猜测这就是“test_labels”数据,我们不知道该预测是如何得出的。所以我不确定有足够的信息来回答这个问题。顺便说一句,"shape[0]"请解释一下好吗?需要吗?
随时随地看视频慕课网APP

相关分类

Python
我要回答