将PCA应用于一个样本

时间:2019-05-01 08:10:48

标签: python machine-learning scikit-learn computer-vision pca

我目前正在通过机器学习进行图像识别项目。

  • 火车组有1600张图像,尺寸为300x300,因此每张图像有90000个特征。
  • 为了加快培训速度,我将PCA与n_components = 50
  • 一起使用
  • 测试集有450张图像,我可以在该测试集中成功测试模型。

现在,我想预测网络摄像头捕获的单个图像。问题是我应该将PCA应用于该图像吗?

  • 如果我不申请PCA,我会得到ValueError: X.shape[1] = 90000 should be equal to 50, the number of features at training time
  • 如果我申请PCA,我将得到ValueError: n_components=50 must be between 0 and min(n_samples, n_features)=1 with svd_solver='full'

我使用Python 3,scikit-learn 0.20.3,这就是我应用PCA的方式:

from sklearn.decomposition import PCA
pca = PCA(50)
pca.fit_transform(features)

2 个答案:

答案 0 :(得分:3)

您还需要在测试集上应用PCA。

您需要考虑PCA的作用:

PCA构造一个新的功能集(包含的功能少于原始功能空间),然后您将在此新功能集上进行训练。您需要为模型的测试构造有效的新功能集!

请务必注意,“精简”特征集中的每个特征都是原始特征的线性组合,其中对于给定数量的新特征(n_components),它们是最大化方差的特征集保留在新空间中的原始空间。

实际上是要对测试集执行相关的转换,您需要执行以下操作:

# X_test - your untransformed test set

X_test_reduced = pca.transform(X_test)

其中pca是在您的训练集中训练的PCA()的实例。本质上,您正在构建到低维空间的转换,并且您希望此转换对于训练和测试集相同!如果您分别在训练集和测试集上训练pca,那么(几乎可以肯定)您会将数据嵌入到不同的低维表示形式中,并且具有不同的功能集。

答案 1 :(得分:1)

是的,您需要按照在训练和测试期间对数据进行相同操作的原则来应用PCA。

但是,关键是您不能再次“重新训练” /安装PCA。使用PCA transform

pca.transform(X_test) #where X_test is a collection of images for testing, should be similar to your features.

想法fit_transform是一个两步过程,包括拟合PCA,然后相应地转换数据集。