Построение полиномиальной регрессии?

Вопрос или проблема

Я читаю книгу Практическое машинное обучение с использованием Scikit-learn и TensorFlow автора Джерона. Я создаю простую полиномиальную регрессию, используя PolynomialFeatures из sklearn.

Сначала я создаю наборы X и y, используя случайные числа numpy с квадратичной формой:

m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X**2 + X + 2 + np.random.randn(m, 1)

Затем я строю распределение на точечном графике:

plt.plot(X, y, "b.")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([-3, 3, 0, 10])
plt.show()

После этого я использую PolynomialFeatures, чтобы добавить 2-й степенью:

poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.fit_transform(X)

Затем я подгоняю LinearRegression:

lin_reg = LinearRegression()
lin_reg.fit(X_poly, y)
lin_reg.intercept_, lin_reg.coef_

Затем я строю то же самое распределение с полиномиальной регрессионной линией. Мой вопрос касается следующего кода:

X_new=np.linspace(-3, 3, 100).reshape(100, 1)
X_new_poly = poly_features.transform(X_new)
y_new = lin_reg.predict(X_new_poly)
plt.plot(X, y, "b.")
plt.plot(X_new, y_new, "r-", linewidth=2, label="Прогнозы")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.legend(loc="upper left", fontsize=14)
plt.axis([-3, 3, 0, 10])
plt.show()

Почему мы создаем X_new (np.linspace(-3,3,100).reshape(100,1) и X_new_poly? Почему это не работает с уже созданным X_poly? (Я пытался построить его с оригинальным X_poly, и это определенно не работает. Это просто колеблющиеся линии вверх и вниз снова и снова. Мне просто неясно, почему это так.)

Вы могли бы использовать X и lin_reg.predict(X_poly), но

  1. График выведет эти точки в том порядке, в котором они появляются в X, и поскольку вы используете линейный соединитель, это будет выглядеть так, будто он скачет повсюду. Вы могли бы исправить это, используя точечный график вместо этого.
  2. Не совсем честно использовать x-значения обучающего набора для построения подгоняемой кривой; использование np.linspace для получения равномерно распределенных x-значений предпочтительно (даже если ваш оригинальный X был случайно сгенерирован и должен заполнять пространство разумно хорошо).

Seaborn regplot — это мой выбор для визуализации. Он позволяет строить полиномиальную одномерную регрессию. Параметр степени можно установить с помощью ключевого слова ‘order’, также можно указать вид целевой переменной (регрессия или классификация с помощью ключевого слова logistic).

Это очень просто использовать:

import numpy as np
import seaborn as sns

m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X**2 + X + 2 + np.random.randn(m, 1)

sns.regplot(x=X,
            y=y,
            order=2,
            line_kws={'color':'red'}
           );

дает:

enter image description here

Затем он ведет себя как plt график, вы можете настроить его с помощью легенды/заголовков.

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

Ответ или решение

Полиномиальная Регрессия: Подробное Объяснение и Визуализация

Полиномиальная регрессия — это мощный инструмент для моделирования зависимостей, когда отношения между переменными негладкие или нелинейные, например, квадратичные или кубические. В данной статье мы подробно разберем, как правильно выполнить полиномиальную регрессию с использованием библиотеки Scikit-learn и визуализировать результаты с помощью matplotlib.

Этап 1: Генерация Данных

Для начала создадим набор данных с использованием случайных чисел от библиотеки NumPy. Мы создадим случайное значение X в диапазоне [-3, 3] и соответствующее значение y по формуле квадратной функции.

import numpy as np
import matplotlib.pyplot as plt

m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X**2 + X + 2 + np.random.randn(m, 1)

Здесь мы создали 100 объектов данных, используя случайные значения для X и добавив небольшие случайные шумы в y.

Этап 2: Визуализация Исходных Данных

Следующим шагом мы визуализируем исходные данные в виде точечного графика.

plt.plot(X, y, "b.")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([-3, 3, 0, 10])
plt.show()

Этап 3: Преобразование Полиномиальных Признаков

Чтобы выполнить полиномиальную регрессию, мы используем PolynomialFeatures из библиотеки Scikit-learn для добавления дополнительных полиномиальных признаков.

from sklearn.preprocessing import PolynomialFeatures

poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.fit_transform(X)

X_poly теперь содержит исходные значения X, а также их квадратные значения.

Этап 4: Обучение Модели

Создаем модель линейной регрессии и обучаем ее на полиномиальных признаках.

from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()
lin_reg.fit(X_poly, y)

После обучения модели, мы можем получить коэффициенты и свободный член:

lin_reg.intercept_, lin_reg.coef_

Этап 5: Производство Прогнозов и Визуализация Полиномиальной Регрессии

Для визуализации предсказанной кривой регрессии мы создаем новую матрицу признаков X_new, которая содержит равномерные значения по диапазону от -3 до 3. Это делается для порядка X, чтобы избежать "скачков" в визуализации.

X_new = np.linspace(-3, 3, 100).reshape(100, 1)
X_new_poly = poly_features.transform(X_new)
y_new = lin_reg.predict(X_new_poly)

Теперь мы можем построить график предсказаний:

plt.plot(X, y, "b.")
plt.plot(X_new, y_new, "r-", linewidth=2, label="Predictions")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.legend(loc="upper left", fontsize=14)
plt.axis([-3, 3, 0, 10])
plt.show()

Почему Мы Используем X_new и X_new_poly?

  1. Линейное Интерполяция: Для построения гладкой кривой необходимо использовать новые равномерно распределенные значения. Если бы мы использовали X_poly, точки дымились бы в результате того, что они не равномерны. Это приводит к "скачкам" в графике, создавая непредсказуемые линии.

  2. Честная Визуализация: Использование равномерно распределенных значений для новых примеров предоставляет более правдоподобный вид результатов регрессии. Это предоставляет более точное представление о связи между переменными, чем использование старых значений.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...