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

Beginner

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. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

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

Мы сгенерируем некоторые случайные данные для тестирования нашего алгоритма. Мы создадим 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. Наконец, мы сравнили коэффициенты регрессии между двумя моделями и заметили, что неотрицательные наименьшие квадраты для регрессии дают разреженные результаты.