Kursinnhold
Lineær Regresjon med Python
Lineær Regresjon med Python
Bygge Polynomisk Regresjon
Laster inn fil
I dette kapittelet har vi en fil som heter poly.csv
, som vi først skal laste inn og se på innholdet i:
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))
Her har vi altså én variabel og målet. Deretter skal vi lage et spredningsdiagram for å forstå sammenhengen mellom variabelen og målet:
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()
Det er vanskelig å forestille seg at en rett linje vil tilpasse disse dataene godt, så en polynomisk regresjon vil være et langt bedre valg.
Bygging av X̃-matrisen
Vi vil igjen bruke OLS
-klassen. Likevel må vi opprette en X̃-matrise. Dette gjøres manuelt ved å legge til en kvadrert 'Feature'
-kolonne i DataFrame slik:
df['Feature_squared'] = df['Feature'] ** 2
Men hvis vi ønsker å bygge en polynomisk regresjon av høyere grad, vil det kreve at vi legger til mange slike kolonner. Heldigvis tilbyr Scikit-Learn en mindre tungvint måte å gjøre dette på ved å bruke PolynomialFeatures
-klassen.
Metoden fit_transform(X)
forventer at X enten er et 2-dimensjonalt array eller en pandas DataFrame.
Hvis X-en din er et 1-dimensjonalt numpy-array, vil metoden reshape(-1,1)
gjøre det om til et 2-dimensjonalt array med samme innhold:
X = X.reshape(-1,1)
Hvis X-en din er en kolonne fra en DataFrame, kan du bruke X = df[['col1']]
for å få en DataFrame i stedet for en pandas Series, som ikke passer for fit_transform()
:
X = df['Feature'] # X is a pandas Series
X = df[['Feature']] # X is a pandas DataFrame
For å bygge en X̃ for polynomregresjon av grad n
, bruker vi:
from sklearn.preprocessing import PolynomialFeatures # Import the class
poly = PolynomialFeatures(n) # Initialize a PolynomialFeatures object
X_tilde = poly.fit_transform(X)
Klassen PolynomialFeatures
legger også til en kolonne med 1-ere, så du trenger ikke bruke sm.add_constant()
.
Bygging av polynomisk regresjon og prediksjoner
Når vi vet hvordan vi får en X̃, er vi klare til å bygge polynomisk regresjon på samme måte som tidligere modeller:
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()
For å predikere nye verdier må også X_new
transformeres med PolynomialFeatures
.
X_new_tilde = PolynomialFeatures(n).fit_transform(X_new)
y_pred = regression_model.predict(X_new_tilde)
Eksempelet under viser hele prosessen med å bygge polynomisk regresjon. X_new
her er et 1-d array med punkter mellom -0.1 og 1.5. Disse brukes til visualisering. Siden det er et 1-d array, må vi bruke reshape(-1,1)
-metoden før det brukes i PolynomialFeatures-klassen.
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()
Du kan gjerne eksperimentere med verdiene til n
på den åttende linjen. Du vil se hvordan plottet endrer seg avhengig av graden til polynomregresjonen. Hvis du følger nøye med, kan du legge merke til hvor forskjellige prediksjonene er for funksjonsverdier lavere enn 0, eller høyere enn 1.4. Dette er temaet for neste kapittel.
Takk for tilbakemeldingene dine!