Cursusinhoud
Lineaire Regressie Met Python
Lineaire Regressie Met Python
Polynomiale Regressie Opbouwen
Bestand laden
Voor dit hoofdstuk hebben we een bestand genaamd poly.csv
, dat we eerst zullen laden en de inhoud ervan bekijken:
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))
Hier hebben we dus één kenmerk en de target. Vervolgens maken we een spreidingsdiagram om de relatie tussen het kenmerk en de target te begrijpen:
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()
Het is moeilijk voor te stellen dat een rechte lijn deze gegevens goed kan benaderen, dus een polynomiale regressie is een veel betere keuze.
X̃-matrix opbouwen
We gebruiken opnieuw de OLS
-klasse. Toch moeten we een X̃-matrix creëren. Dit doen we handmatig door een gekwadrateerde kolom 'Feature'
toe te voegen aan de DataFrame als volgt:
df['Feature_squared'] = df['Feature'] ** 2
Maar als we een polynomiale regressie van hoge graad willen bouwen, vereist dat het toevoegen van veel van zulke kolommen. Gelukkig biedt Scikit-Learn een minder omslachtige manier met de PolynomialFeatures
-klasse.
fit_transform(X)
-methode verwacht dat X een 2-d array of een pandas DataFrame is.
Als je X een 1-d numpy array is, zal de methode reshape(-1,1)
deze omzetten naar een 2-d array met dezelfde inhoud:
X = X.reshape(-1,1)
Als je X een kolom uit een DataFrame is, kun je X = df[['col1']]
gebruiken om een DataFrame te verkrijgen in plaats van een pandas Series, wat niet geschikt is voor fit_transform()
:
X = df['Feature'] # X is a pandas Series
X = df[['Feature']] # X is a pandas DataFrame
Om een X̃ te construeren voor de Polynomial Regression van graad n
, gebruiken we:
from sklearn.preprocessing import PolynomialFeatures # Import the class
poly = PolynomialFeatures(n) # Initialize a PolynomialFeatures object
X_tilde = poly.fit_transform(X)
De klasse PolynomialFeatures
voegt ook een kolom met 1'en toe, dus het is niet nodig om sm.add_constant()
te gebruiken.
Het bouwen van de polynomiale regressie en het maken van voorspellingen
Nu we weten hoe we een X̃ verkrijgen, zijn we klaar om de polynomiale regressie op dezelfde manier te bouwen als de eerdere modellen:
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()
Voor het voorspellen van nieuwe waarden moet X_new
ook worden getransformeerd met behulp van PolynomialFeatures
.
X_new_tilde = PolynomialFeatures(n).fit_transform(X_new)
y_pred = regression_model.predict(X_new_tilde)
Het volgende uitvoerbare voorbeeld toont het volledige proces van het bouwen van een polynomiale regressie. X_new
is hier een 1-d array van punten tussen -0.1 en 1.5. Deze zijn nodig voor visualisatie. En omdat het een 1-d array is, moet de methode reshape(-1,1)
worden toegepast voordat deze wordt gebruikt in de PolynomialFeatures-klasse.
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()
Voel je vrij om te experimenteren met de waarden van n
in de achtste regel. Je zult zien hoe de grafiek verandert afhankelijk van de graad van de polynomiale regressie. Als je goed oplet, kun je merken hoe verschillend de voorspellingen zijn voor featurewaarden lager dan 0 of groter dan 1.4. Dat is het onderwerp van het volgende hoofdstuk.
Bedankt voor je feedback!