首页 > 解决方案 > 使用 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();

标签: pythonnumpyscikit-learnpcadimensionality-reduction

解决方案


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

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

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


推荐阅读