【问题标题】:Confused about standardization before PCA对 PCA 之前的标准化感到困惑
【发布时间】:2025-12-30 22:35:17
【问题描述】:

我正在尝试训练线性回归模型。使用 GridSearchCV,我想研究模型在 PCA 之后在不同维度上的表现。我还发现了一个 sklearn tutorial,它的功能几乎相同。

但首先,我的代码:

import pandas as pd
import sklearn.linear_model as skl_linear_model
import sklearn.pipeline as skl_pipeline
import sklearn.model_selection as skl_model_selection
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

model_lr = skl_linear_model.LinearRegression()

pca_lr = PCA()

pipeline = skl_pipeline.Pipeline([
            ('standardize', StandardScaler()),
            ('reduce_dim', pca_lr), 
            ('regressor', model_lr)])

n_components = list(range(1, len(X_train.columns)+1))
param_grid_lr = {'reduce_dim__n_components': n_components}

estimator_lr = skl_model_selection.GridSearchCV(
                pipeline,
                param_grid_lr,
                scoring='neg_root_mean_squared_error',
                n_jobs=2,
                cv=skl_model_selection.KFold(n_splits=25, shuffle=False, random_state=None),
                error_score=0,
                verbose=1,
                refit=True)

estimator_lr.fit(X_train, y_train)
grid_results_lr = pd.DataFrame(estimator_lr.cv_results_)

顺便说一下,我的训练数据是 8548x7 数组形状的不同单位的测量值。 到目前为止,该代码似乎有效,这些是cv_results。对于问题的复杂性,线性回归的结果是可以的(我也在使用其他性能更好的模型)。

如果我理解正确,图像显示,主成分 1 和 2 应该解释数据的主要部分,因为这两个损失几乎最小化。添加更多主成分并不能真正改善结果,因此它们对解释方差的贡献可能相当低。

为了证明这一点,我手动进行了 PCA,这引起了混乱:

X_train_scaled = StandardScaler().fit_transform(X_train)

pca = PCA()

PC_list = []
for i in range(1,len(X_train.columns)+1): PC_list.append(''.join('PC'+str(i)))

PC_df = pd.DataFrame(data=pca.fit_transform(X_train_scaled), columns=PC_list)

PC_loadings_df = pd.DataFrame(pca.components_.T,
                            columns=PC_list,
                            index=X_train.columns.values.tolist())

PC_var_df = pd.DataFrame(data=pca.explained_variance_ratio_,
                         columns=['explained_var'],
                         index=PC_list)

That's解释的方差比。

这似乎有点意外,所以我检查了我开始提到的教程。如果我没有忽略某些事情,那么这个人所做的几乎相同,除了一件事:

在拟合 PCA 时,他们没有缩放数据,即使他们在管道中使用了 StandardScaler。无论如何,他们得到的结果看起来还不错。

所以我尝试了相同的方法,并且没有标准化,解释的方差比看起来像 this。似乎这可以更好地解释我的 cv_results,因为 PC 1 和 2 解释了超过 90% 的方差。

但我想知道为什么他们没有在 PCA 之前对数据进行缩放。我找到的关于 PCA 的每一条信息都表明输入需要标准化。这是有道理的,因为我拥有的数据是不同单位的测量值。

那么我错过了什么?我最初的方法实际上是否正确,而我只是误解了结果?前两个主成分是否有可能几乎使损失最小化,即使它们只解释了大约 50% 的方差?或者甚至可能是,管道中的 PCA 并没有真正扩展数据,这就是为什么 CV 的结果与非标准化的手动 PCA 相关性更好?

【问题讨论】:

    标签: python machine-learning scikit-learn pca


    【解决方案1】:

    我没有检查代码的正确性,只是阅读了文本并查看了图表。我会假设你的分析是正确的。

    我只会尝试解决

    但我想知道为什么他们没有在 PCA 之前扩展数据

    我建议对此持保留态度,因为不久前我开始考虑同样的问题,这就是我想出的。以下内容我没有参考。


    什么时候应该或不应该扩展数据?

    如果

    ,您应该缩放数据
    1. 您的数据是不同单位的测量值。
    2. 您的列具有完全不同的尺度(因此很明显,一个会主导方差)。
    3. 您的数据是不同传感器的测量结果

    如果

    ,您不应该缩放数据
    1. 您的数据是相同测量的不同维度,例如 3d 点 - 因为如果所有轴的比例相同,您希望(例如)x 轴主导方差。
    2. 您的数据是同一多维传感器的测量值,例如图像。

    本教程中的最后一点似乎是 - 8x8 数字实际上是一个 64 通道传感器。每个像素在传感器中已经归一化(因为我相信数据集是干净的)。


    PCA 不起作用如果

    1. 您的数据具有不同(恒定)的比例,但您希望保持数据中的绝对差异。
    2. 您的数据有不同的尺度。
    3. 还有很多这里没有提到的原因。

    当 PCA 不起作用时,不难找到示例。毕竟它只是一个线性模型。


    这并没有说明您应该如何处理自己的 8548x7 数据。仅通过形状,我假设您在这种情况下应该正常化。

    我希望这能给进一步思考带来一些启发。


    让我添加一个关于不缩放图像的旁注:由于光照、深度或其他可能在图像之间发生变化的影响,多张图像可以被视为由不同的传感器拍摄。对于测试数据库的 8x8 扫描,这不太可能。

    【讨论】:

    • 感谢您的回答!就我而言,我绝对需要缩放,因为所有三个建议缩放的点都是正确的。老实说,我没有检查教程中的数据,并盲目地假设它需要缩放,因为他们将 StandardScaler 放入了他们的管道中。我认为他们可能只是在手动 PCA 之前忘记了扩展,但也许他们只是不一致,并且由于数据没有影响。
    • 我希望得到一个答案,它要么告诉我我的方法是正确的并试图解释我的结果,要么证明我做错了什么。您的第一个答案证实我的数据确实需要缩放,但我仍然想知道 CV 结果和解释的方差比如何结合在一起。