Graficar PCR vs PLS

Beginner

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

Introducción

La Regresión por Componentes Principales (PCR, por sus siglas en inglés) y la Regresión por Mínimos Cuadrados Parciales (PLS, por sus siglas en inglés) son dos métodos utilizados en el análisis de regresión. La PCR implica aplicar el Análisis de Componentes Principales (PCA, por sus siglas en inglés) a los datos de entrenamiento, seguido del entrenamiento de un regresor en las muestras transformadas. La transformación PCA es no supervisada, lo que significa que no se utiliza ninguna información sobre las variables objetivo. Como resultado, la PCR puede funcionar mal en algunos conjuntos de datos donde la variable objetivo está fuertemente correlacionada con direcciones que tienen una baja varianza.

La PLS es tanto un transformador como un regresor, y es bastante similar a la PCR. También aplica una reducción de dimensionalidad a las muestras antes de aplicar un regresor lineal a los datos transformados. La principal diferencia con la PCR es que la transformación PLS es supervisada. Por lo tanto, no sufre del problema mencionado anteriormente.

En este laboratorio, compararemos la PCR y la PLS en un conjunto de datos de ejemplo.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Crear un conjunto de datos

Comenzamos creando un conjunto de datos simple con dos características. Utilizamos la librería numpy para crear el conjunto de datos y la librería matplotlib para graficarlo.

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="muestras")
plt.gca().set(
    aspecto="igual",
    título="Conjunto de datos bidimensional con componentes principales",
    xlabel="primera característica",
    ylabel="segunda característica",
)
plt.legend()
plt.show()

Definir la variable objetivo

Para este ejemplo, definimos la variable objetivo y de manera que esté fuertemente correlacionada con una dirección que tiene una baja varianza. Proyectamos X sobre el segundo componente y le agregamos algo de ruido.

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="Datos proyectados sobre el primer componente PCA", ylabel="y")
axes[1].scatter(X.dot(pca.components_[1]), y, alpha=0.3)
axes[1].set(xlabel="Datos proyectados sobre el segundo componente PCA", ylabel="y")
plt.tight_layout()
plt.show()

Crear los regresores

Creamos dos regresores: PCR y PLS, y para fines de ilustración, establecemos el número de componentes en 1. Antes de alimentar los datos al paso de PCA de la PCR, los estandarizamos primero, como se recomienda por buenas prácticas. El estimador PLS tiene capacidades de escalado integradas.

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"]  ## recuperar el paso de PCA de la tubería

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

Comparar los regresores

Graficamos los datos proyectados sobre el primer componente en función de la variable objetivo para ambos regresores PCR y PLS. En ambos casos, estos datos proyectados son los que los regresores utilizarán como datos de entrenamiento.

fig, axes = plt.subplots(1, 2, figsize=(10, 3))
axes[0].scatter(pca.transform(X_test), y_test, alpha=0.3, label="verdadero valor")
axes[0].scatter(
    pca.transform(X_test), pcr.predict(X_test), alpha=0.3, label="predicciones"
)
axes[0].set(
    xlabel="Datos proyectados sobre el primer componente PCA", ylabel="y", título="PCR / PCA"
)
axes[0].legend()
axes[1].scatter(pls.transform(X_test), y_test, alpha=0.3, label="verdadero valor")
axes[1].scatter(
    pls.transform(X_test), pls.predict(X_test), alpha=0.3, label="predicciones"
)
axes[1].set(xlabel="Datos proyectados sobre el primer componente PLS", ylabel="y", título="PLS")
axes[1].legend()
plt.tight_layout()
plt.show()

Imprimimos las puntuaciones de coeficiente de determinación (R^2) de ambos estimadores, lo que confirma aún más que la PLS es una mejor alternativa que la PCR en este caso.

print(f"Coeficiente de determinación de PCR {pcr.score(X_test, y_test):.3f}")
print(f"Coeficiente de determinación de PLS {pls.score(X_test, y_test):.3f}")

Usar PCR con 2 componentes

Usamos PCR con 2 componentes para compararlo con PLS.

pca_2 = make_pipeline(PCA(n_components=2), LinearRegression())
pca_2.fit(X_train, y_train)
print(f"Coeficiente de determinación de PCR con 2 componentes {pca_2.score(X_test, y_test):.3f}")

Resumen

En este laboratorio, comparamos PCR y PLS en un conjunto de datos de ejemplo. Encontramos que PLS se comportó mejor que PCR cuando la variable objetivo está fuertemente correlacionada con direcciones que tienen una baja varianza.