Построение графика PCR против PLS

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Регрессия по главным компонентам (PCR - Principal Component Regression) и частичная наименьших квадратов регрессия (PLS - Partial Least Squares Regression) - это два метода, используемые в анализе регрессии. PCR заключается в применении PCA (Principal Component Analysis) к тренировочным данным, за которым следует обучение регрессора на преобразованных образцах. Преобразование PCA является ненаправленным, что означает, что никакой информации о целевых переменных не используется. В результате PCR может показать плохие результаты в некоторых наборах данных, где целевая переменная сильно коррелирует с направлениями, имеющими низкую дисперсию.

PLS является и трансформером, и регрессором, и он весьма похож на PCR. Он также применяет понижение размерности к образцам перед применением линейного регрессора к преобразованным данным. Основное отличие от PCR заключается в том, что преобразование PLS является направленным. Поэтому он не страдает от вышеупомянутой проблемы.

В этом лабе мы сравним PCR и PLS на наборе данных для экспериментов.

Советы по работе с ВМ

После запуска ВМ кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook, чтобы получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) 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"]) 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. Перед подачей данных на этап PCA в PCR их необходимо стандартизировать, как рекомендует хороший практика. Экстремальный оценщик 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^2) для обоих оценщиков, что дополнительно подтверждает, что в этом случае 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, когда целевая переменная сильно коррелирует с направлениями с малой дисперсией.