Побудова Поліноміальної Регресії
Завантаження файлу
У цьому розділі використовується файл з назвою poly.csv
, який спочатку завантажимо та переглянемо його вміст:
import pandas as pd file_link = 'https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b22d1166-efda-45e8-979e-6c3ecfc566fc/poly.csv' df = pd.read_csv(file_link) print(df.head(5))
Отже, тут маємо одну ознаку та цільову змінну. Далі побудуємо діаграму розсіювання, щоб зрозуміти взаємозв'язок між ознакою та ціллю:
import pandas as pd import matplotlib.pyplot as plt file_link = 'https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b22d1166-efda-45e8-979e-6c3ecfc566fc/poly.csv' df = pd.read_csv(file_link) X = df['Feature'] y = df['Target'] plt.scatter(X,y) plt.show()
Важко уявити, що пряма лінія добре апроксимує ці дані, тому поліноміальна регресія буде значно кращим вибором.
Побудова матриці X̃
Ми знову використаємо клас OLS
. Однак нам потрібно створити матрицю X̃. Це робиться вручну шляхом додавання стовпця квадрату 'Feature'
до DataFrame наступним чином:
df['Feature_squared'] = df['Feature'] ** 2
Але якщо потрібно побудувати поліноміальну регресію високого ступеня, доведеться додавати багато подібних стовпців. На щастя, Scikit-Learn надає спосіб зробити це простіше за допомогою класу PolynomialFeatures
.
fit_transform(X)
очікує, що X буде або двовимірним масивом, або pandas DataFrame.
Якщо ваш X — це одномірний numpy масив, метод reshape(-1,1)
перетворить його на двовимірний масив із тим самим вмістом:
X = X.reshape(-1,1)
Якщо ваш X — це стовпець із DataFrame, ви можете використати X = df[['col1']]
, щоб отримати DataFrame замість pandas Series, яка не підходить для fit_transform()
:
X = df['Feature'] # X is a pandas Series
X = df[['Feature']] # X is a pandas DataFrame
Щоб побудувати X̃ для поліноміальної регресії ступеня n
, використовується:
from sklearn.preprocessing import PolynomialFeatures # Import the class
poly = PolynomialFeatures(n) # Initialize a PolynomialFeatures object
X_tilde = poly.fit_transform(X)
Клас PolynomialFeatures
також додає стовпець з 1, тому немає потреби використовувати sm.add_constant()
.
Побудова поліноміальної регресії та здійснення прогнозів
Знаючи, як отримати X̃, ми готові побудувати поліноміальну регресію так само, як і попередні моделі:
y = df['Target']
# Prepare X_tilde
X = df[['Feature']]
X_tilde = PolynomialFeatures(n).fit_transform(X)
# Initialize the OLS object and train it
regression_model = sm.OLS(y, X_tilde).fit()
Для прогнозування нових значень також потрібно трансформувати X_new
за допомогою PolynomialFeatures
.
X_new_tilde = PolynomialFeatures(n).fit_transform(X_new)
y_pred = regression_model.predict(X_new_tilde)
Наступний виконуваний приклад демонструє повний процес побудови поліноміальної регресії. X_new
тут — це одновимірний масив точок у діапазоні від -0.1 до 1.5. Вони потрібні для візуалізації. Оскільки це одновимірний масив, перед використанням у класі PolynomialFeatures слід застосувати метод reshape(-1,1)
.
import pandas as pd import numpy as np import matplotlib.pyplot as plt import statsmodels.api as sm from sklearn.preprocessing import PolynomialFeatures # Import PolynomialFeatures class file_link = 'https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b22d1166-efda-45e8-979e-6c3ecfc566fc/poly.csv' df = pd.read_csv(file_link) n = 2 # A degree of the polynomial regression X = df[['Feature']] # Assign X as a DataFrame y = df['Target'] # Assign y X_tilde = PolynomialFeatures(n).fit_transform(X) # Get X_tilde regression_model = sm.OLS(y, X_tilde).fit() # Initialize and train the model X_new = np.linspace(-0.1, 1.5, 80).reshape(-1,1) # 2-d array of new feature values X_new_tilde = PolynomialFeatures(n).fit_transform(X_new) # Transform X_new for predict() method y_pred = regression_model.predict(X_new_tilde) plt.scatter(X, y) # Build a scatterplot plt.plot(X_new, y_pred) # Build a Polynomial Regression graph plt.show()
Можна змінювати значення n
у восьмому рядку. Ви побачите, як змінюється графік залежно від ступеня поліноміальної регресії. Якщо звернути увагу, можна помітити, наскільки відрізняються передбачення для значень ознаки менших за 0 або більших за 1.4. Це буде розглянуто у наступному розділі.
Дякуємо за ваш відгук!