- Вопрос или проблема
- Ответ или решение
- Полиномиальная Регрессия: Подробное Объяснение и Визуализация
- Этап 1: Генерация Данных
- Этап 2: Визуализация Исходных Данных
- Этап 3: Преобразование Полиномиальных Признаков
- Этап 4: Обучение Модели
- Этап 5: Производство Прогнозов и Визуализация Полиномиальной Регрессии
- Почему Мы Используем X_new и X_new_poly?
- Заключение
Вопрос или проблема
Я читаю книгу Практическое машинное обучение с использованием 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)
, но
- График выведет эти точки в том порядке, в котором они появляются в
X
, и поскольку вы используете линейный соединитель, это будет выглядеть так, будто он скачет повсюду. Вы могли бы исправить это, используя точечный график вместо этого. - Не совсем честно использовать 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'}
);
дает:
Затем он ведет себя как 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
?
-
Линейное Интерполяция: Для построения гладкой кривой необходимо использовать новые равномерно распределенные значения. Если бы мы использовали
X_poly
, точки дымились бы в результате того, что они не равномерны. Это приводит к "скачкам" в графике, создавая непредсказуемые линии. -
Честная Визуализация: Использование равномерно распределенных значений для новых примеров предоставляет более правдоподобный вид результатов регрессии. Это предоставляет более точное представление о связи между переменными, чем использование старых значений.
Заключение
Полиномиальная регрессия является важным инструментом для анализа данных и создания предсказательных моделей. С помощью PolynomialFeatures
и визуализации в matplotlib
можно эффективно работать с нелинейными связями между переменными. Помните, что правильная визуализация данных является ключом к пониманию результатов анализа.