gpt4 book ai didi

python - 在PCA之前对标准化感到困惑

转载 作者:行者123 更新时间:2023-12-02 18:21:47 25 4
gpt4 key购买 nike

我正在尝试训练线性回归模型。通过 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 相关性更好的原因?

最佳答案

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

我只会尝试解决

But I'm wondering why they didn't scale the data before PCA

我建议对此持保留态度,因为我不久前开始思考同样的问题,这就是我想到的。以下我没有引用资料。


什么时候应该或不应该缩放数据?

如果出现以下情况,您应该缩放数据

  1. 您的数据是不同单位的测量结果。
  2. 您的列具有完全不同的比例(因此显然其中一个将主导方差)。
  3. 您的数据是不同传感器的测量结果。

如果出现以下情况,您不应该缩放数据

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

看起来最后一点就是教程中的情况 - 8x8 位实际上是一个 64 channel 传感器。传感器中的每个像素已经标准化(因为我相信数据集被假定为干净的)。


PCA 不会工作如果

  1. 您的数据具有不同的(恒定)规模,但您希望保留数据中的绝对差异。
  2. 您的数据存在尺度差异。
  3. 这里未提及的还有更多原因。

不难找到 PCA 不起作用的例子。毕竟,这只是一个线性模型。


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

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


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

关于python - 在PCA之前对标准化感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70785712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com