我目前正在使用机器学习进行图像识别项目。
- 训练集有 1600 张尺寸为 300x300 的图像,因此每张图像有 90000 个特征。
- 为了加快训练速度,我使用
n_components = 50
应用 PCA
- 测试集有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)
最佳答案
您还需要在测试集上应用 PCA。
您需要考虑 PCA 的作用:
PCA 构建一个新的特征集(包含比原始特征空间更少的特征),然后您随后在这个新特征集上进行训练。您需要为测试集构建这个新功能集,以使您的模型有效!
重要的是要注意,“缩减”功能集中的每个功能都是原始功能的线性组合,其中对于给定数量的新功能(n_components
),它们是功能集最大化新空间中保留的原始空间的方差。
实际上要对测试集执行相关转换,您需要执行以下操作:
# X_test - your untransformed test set
X_test_reduced = pca.transform(X_test)
其中 pca
是在您的训练集上训练的 PCA()
的实例。本质上,您正在构建一个到低维空间的转换,并且您希望这个转换对于训练集和测试集是相同的!如果您在训练集和测试集上独立训练 pca
,您(几乎可以肯定)将数据嵌入到不同的低维表示中并具有不同的特征集。
关于python - 将 PCA 应用于一个样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55933306/