Principal Component Regression vs Partial Least Squares Regression#

Dieses Beispiel vergleicht Principal Component Regression (PCR) und Partial Least Squares Regression (PLS) auf einem Spiel-Datensatz. Unser Ziel ist es zu veranschaulichen, wie PLS PCR übertreffen kann, wenn das Ziel stark mit einigen Richtungen in den Daten korreliert ist, die eine geringe Varianz aufweisen.

PCR ist ein Regressor, der aus zwei Schritten besteht: Zuerst wird PCA auf die Trainingsdaten angewendet, was möglicherweise eine Dimensionsreduktion durchführt; dann wird ein Regressor (z. B. ein linearer Regressor) auf die transformierten Stichproben trainiert. Bei PCA ist die Transformation rein unüberwacht, d. h. es werden keine Informationen über die Zielwerte verwendet. Infolgedessen kann PCR bei einigen Datensätzen, bei denen das Ziel stark mit *Richtungen* mit geringer Varianz korreliert ist, schlecht abschneiden. Tatsächlich projiziert die Dimensionsreduktion von PCA die Daten in einen niedrigdimensionaleren Raum, in dem die Varianz der projizierten Daten gierig entlang jeder Achse maximiert wird. Obwohl sie die höchste Vorhersagekraft für das Ziel haben, werden die Richtungen mit geringerer Varianz verworfen, und der endgültige Regressor kann sie nicht nutzen.

PLS ist sowohl ein Transformer als auch ein Regressor und ähnelt PCR stark: Es wendet ebenfalls eine Dimensionsreduktion auf die Stichproben an, bevor ein linearer Regressor auf die transformierten Daten angewendet wird. Der Hauptunterschied zu PCR besteht darin, dass die PLS-Transformation überwacht ist. Daher leidet sie, wie wir in diesem Beispiel sehen werden, nicht unter dem gerade erwähnten Problem.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Die Daten#

Wir beginnen mit der Erstellung eines einfachen Datensatzes mit zwei Merkmalen. Bevor wir uns überhaupt mit PCR und PLS beschäftigen, passen wir einen PCA-Schätzer an, um die beiden Hauptkomponenten dieses Datensatzes anzuzeigen, d. h. die beiden Richtungen, die die meiste Varianz in den Daten erklären.

import matplotlib.pyplot as plt
import numpy as np

from sklearn.decomposition import PCA

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)
pca = PCA(n_components=2).fit(X)


plt.scatter(X[:, 0], X[:, 1], alpha=0.3, label="samples")
for i, (comp, var) in enumerate(zip(pca.components_, pca.explained_variance_)):
    comp = comp * var  # scale component by its variance explanation power
    plt.plot(
        [0, comp[0]],
        [0, comp[1]],
        label=f"Component {i}",
        linewidth=5,
        color=f"C{i + 2}",
    )
plt.gca().set(
    aspect="equal",
    title="2-dimensional dataset with principal components",
    xlabel="first feature",
    ylabel="second feature",
)
plt.legend()
plt.show()
2-dimensional dataset with principal components

Zu diesem Zweck definieren wir nun das Ziel y so, dass es stark mit einer Richtung mit kleiner Varianz korreliert ist. Zu diesem Zweck projizieren wir X auf die zweite Komponente und fügen ihr etwas Rauschen hinzu.

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()
plot pcr vs pls

Projektion auf eine Komponente und Vorhersagekraft#

Wir erstellen nun zwei Regressoren: PCR und PLS, und zu Illustrationszwecken setzen wir die Anzahl der Komponenten auf 1. Bevor die Daten in den PCA-Schritt von PCR eingespeist werden, standardisieren wir sie zunächst, wie es die gute Praxis empfiehlt. Der PLS-Schätzer verfügt über integrierte Skalierungsfunktionen.

Für beide Modelle plotten wir die auf die erste Komponente projizierten Daten gegen das Ziel. In beiden Fällen sind dies die projizierten Daten, die die Regressoren als Trainingsdaten verwenden werden.

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

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)

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()
PCR / PCA, PLS

Wie erwartet, hat die unüberwachte PCA-Transformation von PCR die zweite Komponente, d. h. die Richtung mit der geringsten Varianz, verworfen, obwohl sie die vorhersagbarste Richtung ist. Dies liegt daran, dass PCA eine vollständig unüberwachte Transformation ist und die projizierten Daten eine geringe Vorhersagekraft für das Ziel haben.

Andererseits gelingt es dem PLS-Regressor, den Einfluss der Richtung mit der geringsten Varianz zu erfassen, dank seiner Nutzung von Zielinformationen während der Transformation: Er kann erkennen, dass diese Richtung tatsächlich die vorhersagbarste ist. Wir stellen fest, dass die erste PLS-Komponente negativ mit dem Ziel korreliert ist, was aus der Tatsache resultiert, dass die Vorzeichen von Eigenvektoren beliebig sind.

Wir geben auch die R-squared-Werte beider Schätzer aus, was weiter bestätigt, dass PLS in diesem Fall eine bessere Alternative als PCR ist. Ein negatives R-squared deutet darauf hin, dass PCR schlechter abschneidet als ein Regressor, der einfach den Mittelwert des Ziels vorhersagen würde.

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 r-squared -0.026
PLS r-squared 0.658

Als abschließende Bemerkung stellen wir fest, dass PCR mit 2 Komponenten genauso gut abschneidet wie PLS: Dies liegt daran, dass PCR in diesem Fall die zweite Komponente nutzen konnte, die die meiste Vorhersagekraft für das Ziel hat.

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 r-squared with 2 components 0.673

Gesamtlaufzeit des Skripts: (0 Minuten 0,443 Sekunden)

Verwandte Beispiele

Vergleich von Kreuzzerlegungsmethoden

Vergleich von Kreuzzerlegungsmethoden

Bedeutung der Merkmalskalierung

Bedeutung der Merkmalskalierung

Principal Component Analysis (PCA) auf dem Iris-Datensatz

Principal Component Analysis (PCA) auf dem Iris-Datensatz

Daten auf eine Normalverteilung abbilden

Daten auf eine Normalverteilung abbilden

Galerie generiert von Sphinx-Gallery