绘制主成分回归(PCR)与偏最小二乘回归(PLS)对比图

Machine LearningMachine LearningBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

主成分回归(Principal Component Regression,PCR)和偏最小二乘回归(Partial Least Squares Regression,PLS)是回归分析中使用的两种方法。PCR 涉及对训练数据应用主成分分析(PCA),然后在变换后的样本上训练回归器。PCA 变换是无监督的,这意味着不使用关于目标的任何信息。因此,在某些目标与低方差方向高度相关的数据集中,PCR 的性能可能较差。

PLS 既是一个变换器又是一个回归器,它与 PCR 非常相似。它也在对变换后的数据应用线性回归器之前对样本进行降维。与 PCR 的主要区别在于,PLS 变换是有监督的。因此,它不会受到上述问题的影响。

在本实验中,我们将在一个简单的数据集上比较 PCR 和 PLS。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作的验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将为你迅速解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/pipeline("Pipeline") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/cross_decomposition("Cross decomposition") sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/decomposition("Matrix Decomposition") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49243{{"绘制主成分回归(PCR)与偏最小二乘回归(PLS)对比图"}} sklearn/preprocessing -.-> lab-49243{{"绘制主成分回归(PCR)与偏最小二乘回归(PLS)对比图"}} sklearn/pipeline -.-> lab-49243{{"绘制主成分回归(PCR)与偏最小二乘回归(PLS)对比图"}} sklearn/model_selection -.-> lab-49243{{"绘制主成分回归(PCR)与偏最小二乘回归(PLS)对比图"}} sklearn/cross_decomposition -.-> lab-49243{{"绘制主成分回归(PCR)与偏最小二乘回归(PLS)对比图"}} sklearn/decomposition -.-> lab-49243{{"绘制主成分回归(PCR)与偏最小二乘回归(PLS)对比图"}} ml/sklearn -.-> lab-49243{{"绘制主成分回归(PCR)与偏最小二乘回归(PLS)对比图"}} end

创建一个数据集

我们首先创建一个具有两个特征的简单数据集。我们使用 numpy 库来创建数据集,并使用 matplotlib 库来绘制它。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.RandomState(0)
n_samples = 500
cov = [[3, 3], [3, 4]]
X = rng.multivariate_normal(mean=[0, 0], cov=cov, size=n_samples)
plt.scatter(X[:, 0], X[:, 1], alpha=0.3, label="samples")
plt.gca().set(
    aspect="equal",
    title="2-dimensional dataset with principal components",
    xlabel="first feature",
    ylabel="second feature",
)
plt.legend()
plt.show()

定义目标

出于本示例的目的,我们定义目标 y,使其与一个方差较小的方向高度相关。我们将 X 投影到第二个主成分上,并给它添加一些噪声。

y = X.dot(pca.components_[1]) + rng.normal(size=n_samples) / 2

fig, axes = plt.subplots(1, 2, figsize=(10, 3))

axes[0].scatter(X.dot(pca.components_[0]), y, alpha=0.3)
axes[0].set(xlabel="Projected data onto first PCA component", ylabel="y")
axes[1].scatter(X.dot(pca.components_[1]), y, alpha=0.3)
axes[1].set(xlabel="Projected data onto second PCA component", ylabel="y")
plt.tight_layout()
plt.show()

创建回归器

我们创建两个回归器:主成分回归(PCR)和偏最小二乘回归(PLS)。为了便于说明,我们将主成分数量设置为 1。在将数据输入到 PCR 的主成分分析(PCA)步骤之前,按照良好实践的建议,我们首先对其进行标准化。PLS 估计器具有内置的缩放功能。

from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cross_decomposition import PLSRegression

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=rng)

pcr = make_pipeline(StandardScaler(), PCA(n_components=1), LinearRegression())
pcr.fit(X_train, y_train)
pca = pcr.named_steps["pca"]  ## retrieve the PCA step of the pipeline

pls = PLSRegression(n_components=1)
pls.fit(X_train, y_train)

比较回归器

我们针对主成分回归(PCR)和偏最小二乘回归(PLS)这两种回归器,绘制出投影到第一个主成分上的数据与目标值的关系图。在这两种情况下,这种投影数据就是回归器将用作训练数据的数据。

fig, axes = plt.subplots(1, 2, figsize=(10, 3))
axes[0].scatter(pca.transform(X_test), y_test, alpha=0.3, label="ground truth")
axes[0].scatter(
    pca.transform(X_test), pcr.predict(X_test), alpha=0.3, label="predictions"
)
axes[0].set(
    xlabel="Projected data onto first PCA component", ylabel="y", title="PCR / PCA"
)
axes[0].legend()
axes[1].scatter(pls.transform(X_test), y_test, alpha=0.3, label="ground truth")
axes[1].scatter(
    pls.transform(X_test), pls.predict(X_test), alpha=0.3, label="predictions"
)
axes[1].set(xlabel="Projected data onto first PLS component", ylabel="y", title="PLS")
axes[1].legend()
plt.tight_layout()
plt.show()

我们打印出这两种估计器的决定系数(R 平方)分数,这进一步证实了在这种情况下,PLS 比 PCR 是更好的选择。

print(f"PCR r-squared {pcr.score(X_test, y_test):.3f}")
print(f"PLS r-squared {pls.score(X_test, y_test):.3f}")

使用具有两个主成分的主成分回归(PCR)

我们使用具有两个主成分的主成分回归(PCR)来与偏最小二乘回归(PLS)进行比较。

pca_2 = make_pipeline(PCA(n_components=2), LinearRegression())
pca_2.fit(X_train, y_train)
print(f"PCR r-squared with 2 components {pca_2.score(X_test, y_test):.3f}")

总结

在本实验中,我们在一个简单的数据集上比较了主成分回归(PCR)和偏最小二乘回归(PLS)。我们发现,当目标与方差较小的方向高度相关时,偏最小二乘回归(PLS)的表现优于主成分回归(PCR)。