将 pca 应用于测试数据
Apply pca to the test data
我正在尝试使用 sklearn 执行 PCA 的 python 实现。我创建了以下函数:
def dimensionality_reduction(train_dataset_mod1, train_dataset_mod2, test_dataset_mod1, test_dataset_mod2):
pca = PCA(n_components= 200)
pca.fit(train_dataset_mod1.transpose())
mod1_features_train = pca.components_
pca2 = PCA(n_components=200)
pca2.fit(train_dataset_mod2.transpose())
mod2_features_train = pca2.components_
mod1_features_test = pca.transform(test_dataset_mod1)
mod2_features_test = pca2.transform(test_dataset_mod2)
return mod1_features_train.transpose(), mod2_features_train.transpose(), mod1_features_test, mod2_features_test
我的矩阵大小如下:
train_dataset_mod1 733x5000
test_dataset_mod1 360x5000
mod1_features_train 200x733
train_dataset_mod2 733x8000
test_dataset_mod2 360x8000
mod2_features_train 200x733
然而,当我尝试 运行 整个脚本时,我收到以下消息:
File "\Anaconda2\lib\site-packages\sklearn\decomposition\base.py", line 132, in transform
X = X - self.mean_
这是什么问题?如何将 pca 应用于测试数据?
这里是调试pca for mod1的例子:
转换后的数据集 mod1_features_train 和 mod1_features_train 都具有正确的大小,均为 500x733。但是我不能对 test_dataset_mod1 和 test_dataset_mod2 做同样的事情,为什么?
编辑: 在调试过程中我注意到 pca 的 base.py 文件中有一个操作 X = X - self.mean 其中 X 是我的测试数据和 self_mean 从适合训练集计算的平均值(slf_mean 的大小为 733,与 X 不匹配)。如果我在训练过程中删除 transpose() pca 正常工作没有错误,test_dataset_mod1 和 test_dataset_mod2 具有正确的大小 360x500,但是,train_dataset_mod1 和 train_dataset_mod2尺寸错误 5000x500???
你不应该在拟合函数中转置你的矩阵,或者如果你必须,你必须在变换函数中转置你的矩阵:
pca.fit(train_dataset_mod1)
pca2.fit(train_dataset_mod2)
mod1_features_test = pca.transform(test_dataset_mod1)
mod2_features_test = pca2.transform(test_dataset_mod2)
或:
pca.fit(train_dataset_mod1.transpose())
pca2.fit(train_dataset_mod2.transpose())
mod1_features_test = pca.transform(test_dataset_mod1.transpose())
mod2_features_test = pca2.transform(test_dataset_mod2.transpose())
我正在尝试使用 sklearn 执行 PCA 的 python 实现。我创建了以下函数:
def dimensionality_reduction(train_dataset_mod1, train_dataset_mod2, test_dataset_mod1, test_dataset_mod2):
pca = PCA(n_components= 200)
pca.fit(train_dataset_mod1.transpose())
mod1_features_train = pca.components_
pca2 = PCA(n_components=200)
pca2.fit(train_dataset_mod2.transpose())
mod2_features_train = pca2.components_
mod1_features_test = pca.transform(test_dataset_mod1)
mod2_features_test = pca2.transform(test_dataset_mod2)
return mod1_features_train.transpose(), mod2_features_train.transpose(), mod1_features_test, mod2_features_test
我的矩阵大小如下:
train_dataset_mod1 733x5000
test_dataset_mod1 360x5000
mod1_features_train 200x733
train_dataset_mod2 733x8000
test_dataset_mod2 360x8000
mod2_features_train 200x733
然而,当我尝试 运行 整个脚本时,我收到以下消息:
File "\Anaconda2\lib\site-packages\sklearn\decomposition\base.py", line 132, in transform X = X - self.mean_
这是什么问题?如何将 pca 应用于测试数据?
这里是调试pca for mod1的例子:
转换后的数据集 mod1_features_train 和 mod1_features_train 都具有正确的大小,均为 500x733。但是我不能对 test_dataset_mod1 和 test_dataset_mod2 做同样的事情,为什么?
编辑: 在调试过程中我注意到 pca 的 base.py 文件中有一个操作 X = X - self.mean 其中 X 是我的测试数据和 self_mean 从适合训练集计算的平均值(slf_mean 的大小为 733,与 X 不匹配)。如果我在训练过程中删除 transpose() pca 正常工作没有错误,test_dataset_mod1 和 test_dataset_mod2 具有正确的大小 360x500,但是,train_dataset_mod1 和 train_dataset_mod2尺寸错误 5000x500???
你不应该在拟合函数中转置你的矩阵,或者如果你必须,你必须在变换函数中转置你的矩阵:
pca.fit(train_dataset_mod1)
pca2.fit(train_dataset_mod2)
mod1_features_test = pca.transform(test_dataset_mod1)
mod2_features_test = pca2.transform(test_dataset_mod2)
或:
pca.fit(train_dataset_mod1.transpose())
pca2.fit(train_dataset_mod2.transpose())
mod1_features_test = pca.transform(test_dataset_mod1.transpose())
mod2_features_test = pca2.transform(test_dataset_mod2.transpose())