Может ли линейная регрессия соответствовать нелинейным данным?

Как мы узнали с самого начала, линейная регрессия — это такая регрессия, которая соответствует прямой линии в форме y = wx + b для каждой пары (x, y) наилучшим образом.

Но что, если я покажу вам нелинейную кривую, соответствующую приведенным ниже точкам данных?

Давайте разберемся.

Я не буду объяснять линейную регрессию, так как об этом уже есть много ресурсов. Я запущу код и быстро перейду к биннингу и полиномиальной регрессии.

! pip install mglearn -q
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import mglearn
from sklearn.linear_model import LinearRegression

Создайте набор данных

X, y = mglearn.datasets.make_wave(n_samples = 100)
plt.scatter(X[:, 0], y)

Вот так выглядят наши данные. Теперь давайте подгоним линейную модель и построим ее.

reg = LinearRegression().fit(X, y)
# The data ranges from -3 to 3. Lets create points 1000 points which # will be used for prediction
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)
line_predict = reg.predict(line)
plt.plot(X[:, 0], y, 'o')
plt.plot(line, line_predict)

Биннинг

Итак, как мы видим, линейная регрессия не соответствует данным. Другими словами, мы можем сказать, что модель не смогла хорошо понять данные. Что, если мы преобразуем данные таким образом, чтобы это помогло модели хорошо понять данные?

Биннинг означает разделение данных на интервалы для создания бинов. Мы заменяем значение данных на бин, в который они попадают. В основном мы оцифровываем данные.

from sklearn.preprocessing import OneHotEncoder, LabelEncoder
# create 10 bins
bins = np.linspace(-3, 3, 11)
X_binned = np.digitize(X, bins = bins)
# X_binned now has values from 1 to 10
# One hot encode the data
encoder = OneHotEncoder(sparse=False)
encoder.fit(X_binned)
X_binned = encoder.transform(X_binned)
# Lets fit linear model now
reg = LinearRegression().fit(X_binned, y)
# transform the line on which model will predict
line_binned = encoder.transform(np.digitize(line, bins = bins))
#plot
plt.plot(line, reg.predict(line_binned), c = 'r', label = 'linear regression binned')
plt.plot(X[:, 0], y, 'o')
plt.title('Binning')
plt.legend(loc = 'best')

Полиномиальная линейная регрессия

Биннинг оцифровывает данные. Возможно, это не лучший вариант. Так что же нам делать? мы создаем такие функции, как X ** 2, X ** 3 и т. д., из X. Посмотрим, что произойдет.

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=10, include_bias=False)
X_poly = poly.fit_transform(X)
reg  = LinearRegression()
reg.fit(X_poly, y)
line_poly = poly.transform(line)
plt.plot(X[:,0], y, 'o')
plt.plot(line, reg.predict(line_poly), c = 'r', label = 'polynomial regression' )
plt.legend(loc = 'best')

Вывод

Так как же линейная модель соответствует нелинейным данным? Почему тогда это называется линейной регрессией?

Давайте еще раз напишем уравнение линейной регрессии:

Как мы видим, для множественной/полиномиальной регрессии мы создаем новые полиномиальные функции из X. С нашей точки зрения, это те же самые данные, которые были возведены в квадрат, утроены и т. д., но для модели это просто новая функция.

Eg: X1 = X, X2 = X **2, X3 =X** 3

Таким образом, мы создаем количество измерений. Для одномерных измерений линейная регрессия представляет собой прямую линию. Для 2-мерного измерения это плоскость, и по мере увеличения числа измерений мы не можем построить ее, и ее трудно представить. Но математически это все еще линейная регрессия.

То же самое происходит, когда мы занимаемся биннингом. Мы создаем 10 новых функций из каждой точки данных, помещая их в ячейки. В более высоком измерении регрессия может лучше сопоставлять входные данные с выходными.

Итак, когда мы отображаем исходную функцию с выходными данными, нелинейная форма выходных данных заставляет нас чувствовать, что это не линейная регрессия. Но это действительно!!

Кроме того, это не означает, что регрессия сможет соответствовать всем видам нелинейных данных. Линейная регрессия может работать лучше с такими данными только в том случае, если она способна отображать выходные данные в более высоких измерениях.

Вы можете найти полный код на моем github здесь

Дайте мне знать ваши мысли и исправления, если таковые имеются.

Справочник

Замечательная книга «Введение в машинное обучение с помощью Python», один из авторов которой сам является основным участником библиотеки scikit-learn. Это замечательная книга для начинающих, чтобы интуитивно понимать концепции машинного обучения.

Это все ребята. Счастливого обучения.