使用SVC分类可达到100%的精度,这肯定有问题吗?

时间:2018-12-08 22:53:35

标签: python machine-learning scikit-learn

与我要实现的目标的上下文:

我对使用scikit进行图像分类有问题。我有Cifar 10数据,培训和测试图像。有10000个训练图像和1000个测试图像。每个测试/训练图像均以4-d矩阵(高度,宽度,rgb,样本)存储在测试/训练npy文件中。我也有测试/训练标签。我有一个“ 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%,我很确定这是错误的,但是我不确定为什么?

3 个答案:

答案 0 :(得分:1)

首先

pca = PCA(n_components = 2)
tstModel = pca.fit_transform(tstArray)

这是错误的。您必须使用:

tstModel = pca.transform(tstArray)

第二,您如何选择PCA的尺寸?为什么是2?为什么不25或100? 2 PC的图像可能很少。另外,据我所知,数据集不会在PCA之前进行缩放。

只是出于兴趣,请检查班级余额。

关于“我们是否应该在SVM之前使用PCA”:在很大程度上取决于数据。尝试检查两种情况,然后决定。 SVC的计算速度可能很慢,因此PCA(或其他降维技术)可能会加快速度。但是您需要检查两种情况。

答案 1 :(得分:0)

在这种情况下,我们最关心的是模型过度拟合。任何专业的审稿人都会立即将其退还给调查人员。在这种情况下,我怀疑这是所使用的统计方法的结果。

我不使用图像,但是我会质疑为什么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]"可以解释一下吗?需要吗?

答案 2 :(得分:0)

您的方法的一个明显问题是您以一种非常特殊的方式应用了PCA。通常,您只应根据训练数据估算一次转换,然后再将其用于转换任何评估集。

这样,您就可以...用增白批处理规范实现SVM,这听起来很酷,但至少很不寻常。因此,它需要非常小心。例如。这样,您无法对单个样本进行分类。尽管如此,它仍然可以作为一种无监督的适应技术。

除此之外,如果不访问数据就很难分辨。您确定测试集和训练集不相交吗?