【发布时间】: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