我需要为训练数据和测试数据分别执行PCA吗?

3

我考虑对我的稀疏矩阵进行PCA(截断SVD)以减少维度数量。

我将数据分为训练集和测试集。

X_train , X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

我需要单独为X_train和X_test进行PCA吗?
pca = PCA()
X_train = pca.fit_transform(X_train)
X_test = pca.fit_transform(X_test)

或者我只需要适配训练数据,然后转换训练和测试数据。哪种方法更好?
pca.fit(X_train)
train = pca.transform(X_train)
test = pca.transform(X_test)

编辑:

我正在进行一个分类任务。我有一列叫做project_description的数据集,对其应用了BoW(CountVectorizer)并将其转换为计数向量,然后在其上应用PCA来降低维度。

我的实际数据集还有其他列,例如price、place、date、share%等

现在,在连接应用了PCA的Bow向量之前,我是否需要对我的实际数据集(即其他列)应用PCA?


4
我们绝不会在测试集上进行任何拟合;对训练数据进行 fit_transform,然后对测试数据进行 transform - desertnaut
2
第二种情况更可取。您的测试数据不应泄漏到您应用的任何转换中,因此您应仅使用训练数据来计算主成分。 - sdcbr
2
如果你对模型的真正泛化能力感兴趣,那么你应该只在训练数据上拟合模型,然后将其应用到测试集上。 - Sergey Bushmanov
1
这些问题是非常开放和泛泛而谈的,实际上不能用一般化的方式回答(与您最初的问题相比);PCA用于创建特征,在特征工程中,至少理论上讲,您可以做任何想做的事情(即任何能为您的具体问题带来更好结果的事情)... - desertnaut
3
@SergeyBushmanov,你的观点很清晰,从原则上讲它总是成立的;但话说回来,如果你在实际场景中工作(这可能是最“一般”的情况),并且你有兴趣提供一个可行的模型(而不是像 Kaggle 中那样只是为了超过一个指标),那么最好的做法可能是假装根本没有测试集的存在... - desertnaut
显示剩余5条评论
1个回答

0

你不应该使用整个数据集进行任何预处理方法,如降维或归一化。因此:

首先,您应该拆分数据集, 然后您可以使用仅训练集来标准化(或根据您的条件进行归一化)数据集 之后,您可以使用适合的缩放器对测试集进行转换。 如果要应用像PCA这样的降维方法,则现在应该:
仅对训练集执行PCA 然后也要转换测试集 (因此,只有在问题中提到的第二段代码是正确的。) 以这种方式,我们以后可以使用测试集来评估我们的模型对未见过的数据点的泛化情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接