使用PCA时如何决定是使用训练数据还是测试数据?

How to decide whether to use train data or test data when using PCA?

我是 PCA 的新手,在拟合和转置方面对可视化有疑问。我有两个数据,分别是训练和测试。这里有四种方法:

# Method 1)
pca = myPCA(n_components = 5) # Conduct myPCA with 5 principal components.
pca.fit(X_train) # Calculate 5 principal components on the training dataset
X_train_pca = pca.transform(X_train)

# Method 2)
pca = myPCA(n_components = 5) # Conduct myPCA with 5 principal components.
pca.fit(X_test)
X_test_pca = pca.transform(X_test)

# Method 3)
pca = myPCA(n_components = 5) # Conduct myPCA with 5 principal components.
pca.fit(X_train)
X_test_pca = pca.transform(X_train)

# Method 4)
pca = myPCA(n_components = 5) # Conduct myPCA with 5 principal components.
pca.fit(X_train)
X_test_pca = pca.transform(X_test)

以上4种方法中,哪一种是使用PCA进行可视化的正确方法?虽然PCA的教程明明说要运行上考数据,但是,我似乎无法为此编写正确的方法。

这是我的代码:

class myPCA():
"""
Principal Component Analysis (A Linear Dimension Reduction Method).
"""

def __init__(self, n_components = 2):
    """
    Conduct myPCA with 2 principal components(the principal and orthogonal modes of variation).
    """
    self.n_c = n_components


def fit(self,X):
    """
    The procedure of computing the covariance matrix.
    """
    cov_mat = np.cov(X.T) # Covariance matrix
    eig_val, eig_vec = np.linalg.eigh(cov_mat) # Eigen-values and orthogonal eigen-vectors in ascending order.
    eig_val = np.flip(eig_val) # Reverse the order, now it is descending.
    eig_vec = np.flip(eig_vec,axis=1) # reverse the order
    self.eig_values = eig_val[:self.n_c] # select the top eigen-vals
    self.principle_components = eig_vec[:,:self.n_c] # select the top eigen-vecs
    self.variance_ratio = self.eig_values/eig_val.sum() # variance explained by each PC

def transform(self,X):
    """
    Compute the score matrix.
    """
    return np.matmul(X-X.mean(axis = 0),self.principle_components) #project the data (centered) on PCs

可视化代码(仍然不确定是使用下面的X_train还是X_test):

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
figure = plt.figure(dpi=100)
plt.scatter(X_test_pca[:, 0], X_test_pca[:, 1],c=y_test, s=15,edgecolor='none', alpha=0.5,cmap=plt.cm.get_cmap('tab10', 10))
plt.xlabel('component 1')
plt.ylabel('component 2')
plt.colorbar();

如果任务只是在 2 个维度上可视化数据以识别观测值的分布,那么适合或转换哪一个维度并不重要。您甚至可以拟合整个数据集,然后对其进行转换。

但我猜您想将其用作某些模型开发管道的一部分,并想看看转换是否能很好地概括两个数据集。如果是这种情况,您应该始终在训练数据上进行转换,并使用它来转换训练和测试数据。

这将有助于推广转换以及随后在新数据集上的模型。