Побудова Поліноміальної Регресії
Завантаження файлу
У цьому розділі використовується файл з назвою poly.csv
, який спочатку завантажимо та переглянемо його вміст:
123456import 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))
Отже, тут маємо одну ознаку та цільову змінну. Далі побудуємо діаграму розсіювання, щоб зрозуміти взаємозв'язок між ознакою та ціллю:
123456789import 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)
.
12345678910111213141516171819import 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. Це буде розглянуто у наступному розділі.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Запитайте мені питання про цей предмет
Сумаризуйте цей розділ
Покажіть реальні приклади
Awesome!
Completion rate improved to 5.26
Побудова Поліноміальної Регресії
Свайпніть щоб показати меню
Завантаження файлу
У цьому розділі використовується файл з назвою poly.csv
, який спочатку завантажимо та переглянемо його вміст:
123456import 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))
Отже, тут маємо одну ознаку та цільову змінну. Далі побудуємо діаграму розсіювання, щоб зрозуміти взаємозв'язок між ознакою та ціллю:
123456789import 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)
.
12345678910111213141516171819import 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. Це буде розглянуто у наступному розділі.
Дякуємо за ваш відгук!