Регирессия с неотрицательными наименьшими квадратами

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

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

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

Введение

В этом лабораторном занятии мы узнаем о методе неотрицательных наименьших квадратов (Non-negative least squares regression), типе линейной регрессии, который ограничивает коэффициенты регрессии быть неотрицательными. Мы будем использовать библиотеку scikit-learn для Python для реализации этого алгоритма и сравнить его с классической линейной регрессией.

Советы по использованию ВМ

После запуска виртуальной машины (VM) нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/metrics("Metrics") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49228{{"Регирессия с неотрицательными наименьшими квадратами"}} sklearn/model_selection -.-> lab-49228{{"Регирессия с неотрицательными наименьшими квадратами"}} sklearn/metrics -.-> lab-49228{{"Регирессия с неотрицательными наименьшими квадратами"}} ml/sklearn -.-> lab-49228{{"Регирессия с неотрицательными наименьшими квадратами"}} end

Генерация случайных данных

Мы сгенерируем некоторые случайные данные для тестирования нашего алгоритма. Мы создадим 200 выборок с 50 признаками и применим истинный коэффициент 3 для каждого признака. Затем мы установим порог для коэффициентов, чтобы сделать их неотрицательными. Наконец, мы добавим некоторый шум к выборкам.

import numpy as np

np.random.seed(42)

n_samples, n_features = 200, 50
X = np.random.randn(n_samples, n_features)
true_coef = 3 * np.random.randn(n_features)
true_coef[true_coef < 0] = 0
y = np.dot(X, true_coef)
y += 5 * np.random.normal(size=(n_samples,))

Разделение данных на обучающую и тестовую выборки

Мы разделим наши данные на обучающую и тестовую выборки, при этом в каждой выборке будет по 50% данных.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)

Применение неотрицательных наименьших квадратов для регрессии

Теперь мы применим неотрицательные наименьшие квадраты для регрессии к нашим данным. Это делается с использованием класса LinearRegression из scikit-learn с параметром positive=True. Затем мы предскажем значения для нашей тестовой выборки и вычислим показатель R2.

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

reg_nnls = LinearRegression(positive=True)
y_pred_nnls = reg_nnls.fit(X_train, y_train).predict(X_test)
r2_score_nnls = r2_score(y_test, y_pred_nnls)
print("NNLS R2 score", r2_score_nnls)

Применение классической линейной регрессии

Теперь мы применим классическую линейную регрессию к нашим данным. Это делается с использованием класса LinearRegression из scikit-learn. Затем мы предскажем значения для нашей тестовой выборки и вычислим показатель R2.

reg_ols = LinearRegression()
y_pred_ols = reg_ols.fit(X_train, y_train).predict(X_test)
r2_score_ols = r2_score(y_test, y_pred_ols)
print("OLS R2 score", r2_score_ols)

Сравнение коэффициентов регрессии

Теперь мы сравним коэффициенты регрессии между неотрицательными наименьшими квадратами и классической линейной регрессией. Мы построим график коэффициентов друг против друга и заметим, что они сильно коррелируют. Однако неотрицательное ограничение сужает некоторые коэффициенты до 0. Это происходит потому, что неотрицательные наименьшие квадраты по своей природе дают разреженные результаты.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(reg_ols.coef_, reg_nnls.coef_, linewidth=0, marker=".")

low_x, high_x = ax.get_xlim()
low_y, high_y = ax.get_ylim()
low = max(low_x, low_y)
high = min(high_x, high_y)
ax.plot([low, high], [low, high], ls="--", c=".3", alpha=0.5)
ax.set_xlabel("OLS regression coefficients", fontweight="bold")
ax.set_ylabel("NNLS regression coefficients", fontweight="bold")

Резюме

В этом практическом занятии мы изучили неотрицательные наименьшие квадраты для регрессии и то, как они отличаются от классической линейной регрессии. Мы использовали scikit-learn для реализации этого алгоритма и сравнили его с классической линейной регрессией, создав случайные данные и разделив их на обучающую и тестовую выборки. Затем мы подобрали оба модели к данным, предсказали значения для тестовой выборки и вычислили показатель R2. Наконец, мы сравнили коэффициенты регрессии между двумя моделями и заметили, что неотрицательные наименьшие квадраты для регрессии дают разреженные результаты.