【问题标题】:Apply pca to the test data将 pca 应用于测试数据
【发布时间】:2017-11-02 23:50:03
【问题描述】:

我正在尝试使用 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

但是,当我尝试运行整个脚本时,我收到以下消息:

文件“\Anaconda2\lib\site-packages\sklearn\decomposition\base.py”,第 132 行,在转换中 X = X - self.mean_

有什么问题?如何将 pca 应用于测试数据?

这里是mod1的pca调试示例:

转换后的数据集 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???

【问题讨论】:

    标签: python math matrix pca


    【解决方案1】:

    您不应该在拟合函数中转置矩阵,或者如果必须,您必须在变换函数中转置矩阵:

    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())
    

    【讨论】:

    • 尝试了这两种方法,我在两种情况下都收到了错误。如果我不将转置放在训练数据中,那么 pca 不会在特征中执行,而是在样本中执行,这是无用的。对于第二个解决方案,当我尝试使用转置转换测试数据时,我收到相同的消息。ValueError:操作数无法与形状一起广播(5000,360)(733,)
    • 第一种方法有效,但结果是,降维发生在样本中,而不是发生在矩阵的特征中。
    • @konstantin 如果我理解你的问题,当我们使用 .fit 它只是找到变换矩阵而不变换数据,你可以先使用 .transform 或 .fit_transform 来变换你的数据,祝你好运兄弟
    • 老兄这是我的错误,我认为 pca2.components_ 是转换后的火车数据,但事实并非如此。
    • @konstantin 我以为你以后想用它:D
    猜你喜欢
    • 2019-08-21
    • 2016-07-22
    • 2022-06-27
    • 2016-04-24
    • 2019-10-20
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2014-09-24
    相关资源
    最近更新 更多