我目前正在通过机器学习进行图像识别项目。
n_components = 50
现在,我想预测网络摄像头捕获的单个图像。问题是我应该将PCA应用于该图像吗?
ValueError: X.shape[1] = 90000 should be equal to 50, the number of features at training time
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)
答案 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,然后相应地转换数据集。