Эта статья является продолжением предыдущей: Линейная регрессия.

В этой статье мы поговорим о полиномиальной регрессии.

И… выглядит это примерно так:

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

Не волнуйтесь, позвольте мне объяснить…

Помните формулы линейной регрессии? Ну… формула полиномиальной регрессии аналогична.

Полиномиальная регрессия, очень похожая на линейную регрессию, имеет лишь некоторые незначительные изменения:
 — вместо использования различных функций x мы берем только 1.
 – выбранную нами функцию. , мы добавляем к нему мощность в зависимости от количества коэффициентов наклона.

Но почему некоторые до сих пор называют ее «полиномиальной линейнойрегрессией»?
Что ж, отношения x и y могут быть нелинейными. Но линейный относится к коэффициенту наклона. Мммм! Теперь вы поняли.

В качестве примера используется следующий набор данных:
(Если вам это знакомо, этот набор данных взят с сайта https://www.superdatascience.com/ Кирилла и Хаделина)

Одна характеристика, которую мы собираемся выбрать, скажем, x1, будет столбцом «Уровень», а зависимая переменная, которую мы хотим прогнозировать (y), будет быть «Зарплата».
- Примечание. Одна функция не означает одну строку, а один столбец, одну функцию.

Обучение полиномиальной регрессии модели

Бьюсь об заклад, до этого момента построить модель не так уж и сложно, верно? Конечно… потому что у нас есть Scikit-Learn.

После импорта данных, как мы это делали раньше, мы хотим обучить весь набор данных следующим образом:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

poly_reg = PolynomialFeatures(degree = 2) # The power of x
X_poly = poly_reg.fit_transform(X) # Use only x1 - 'Level Column'

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

С помощью Scikit-Learn мы сначала хотим настроить нашу переменную X, чтобы она соответствовала уравнению полиномиальной регрессии. Но для начала мы добавим только степень числа 2. Мы преобразуем X с помощью PolynomialFeatures, установив для него степень и применив ее к нашему X. Затем мы обучаем нашу модель, как обычно. !

Визуализация нашей обученной полиномиальной модели

Помните матплотлиб? Нам очень полезно делать визуализации.

Между прочим, в Matplotlib есть рекомендуемый способ построения графиков, это «объектно-ориентированный подход». Но пока мы не будем вдаваться в это.

Построить график просто, делаем:

plt.scatter(X, y, color='salmon')
plt.plot(X, poly_lin_reg.predict(X_poly), color='lightblue')
plt.title('Position vs Salary (Polynomial)')
plt.xlabel('Position Level')
plt.ylabel('Salary');

Сначала мы строим диаграмму рассеивания, используя наши значения X и y, затем мы строим полиномиальную линию наилучшего соответствия из преобразованной полиномиальной переменной X, которую мы сделали ранее, и передаем нашу предсказал значения y для него. Просто как тот.

Смотреть! Это легко, не так ли?

Изменение силы X

График выглядит не очень, давайте попробуем применить те же коды, что и выше, но возведем степень X в 4, и мы получим…

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

Представьте, что если мы обучим этот график с помощью обычной линейной регрессии, мы получим график, как показано ниже:

Теперь вы понимаете, почему важно использовать подходящий алгоритм для обучения нашей модели, чтобы иметь лучший прогноз!

Составление прогнозов

На основе того же набора данных попробуем спрогнозировать зарплату для уровня должности 7,5, используя нашу обученную полиномиальную модель.

Точно так же мы сначала преобразуем функцию, чтобы она соответствовала полиномиальному уравнению, а затем:

158862! Похоже, это правильный прогноз.

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

lin_reg.predict([[6.5]]) # Input level
# If we input [6.5], it is a 1D vector
# [[6.5]] is 2D, 1 row, 1 column

И мы получаем значение 330378.
Это слишком далеко от того, что мы ожидали.

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

Далее давайте углубимся в регрессию опорных векторов (SVR).

Продолжить чтение:Регрессия опорных векторов