Kursinhalt
Lineare Regression mit Python
Lineare Regression mit Python
Erstellung der Polynomialregression
Datei laden
Für dieses Kapitel haben wir eine Datei namens poly.csv
, die wir zunächst laden und deren Inhalt wir uns ansehen:
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 haben wir also ein Merkmal und das Ziel. Als Nächstes erstellen wir ein Streudiagramm, um die Beziehung zwischen Merkmal und Ziel zu verstehen:
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()
Es ist schwer vorstellbar, dass eine Gerade diese Daten gut abbilden kann, daher ist eine Polynomregression die deutlich bessere Wahl.
Aufbau der X̃-Matrix
Wir verwenden erneut die OLS
-Klasse. Dennoch müssen wir eine X̃-Matrix erstellen. Dies geschieht manuell, indem wir eine quadrierte Spalte 'Feature'
zum DataFrame hinzufügen:
df['Feature_squared'] = df['Feature'] ** 2
Wenn jedoch eine Polynomregression höheren Grades erstellt werden soll, müssten viele solcher Spalten hinzugefügt werden. Glücklicherweise bietet Scikit-Learn mit der Klasse PolynomialFeatures
eine weniger aufwendige Möglichkeit.
Die Methode fit_transform(X)
erwartet, dass X entweder ein 2D-Array oder ein pandas DataFrame ist.
Wenn Ihr X ein 1D-numpy-Array ist, wandelt die Methode reshape(-1,1)
es in ein 2D-Array mit denselben Inhalten um:
X = X.reshape(-1,1)
Wenn Ihr X eine Spalte aus einem DataFrame ist, können Sie X = df[['col1']]
verwenden, um ein DataFrame anstelle einer pandas Series zu erhalten, da eine Series für fit_transform()
nicht geeignet ist:
X = df['Feature'] # X is a pandas Series
X = df[['Feature']] # X is a pandas DataFrame
Um also ein X̃ für die Polynomialregression vom Grad n
zu erstellen, verwenden wir:
from sklearn.preprocessing import PolynomialFeatures # Import the class
poly = PolynomialFeatures(n) # Initialize a PolynomialFeatures object
X_tilde = poly.fit_transform(X)
Die Klasse PolynomialFeatures
fügt außerdem eine Spalte mit Einsen hinzu, daher ist die Verwendung von sm.add_constant()
nicht erforderlich.
Aufbau der Polynomialregression und Durchführung von Vorhersagen
Nachdem wir wissen, wie man ein X̃ erhält, sind wir bereit, die Polynomialregression auf die gleiche Weise wie die vorherigen Modelle zu erstellen:
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()
Für die Vorhersage neuer Werte muss auch X_new
mit PolynomialFeatures
transformiert werden.
X_new_tilde = PolynomialFeatures(n).fit_transform(X_new)
y_pred = regression_model.predict(X_new_tilde)
Das folgende ausführbare Beispiel zeigt den gesamten Prozess des Aufbaus einer Polynomialregression. X_new
ist hier ein 1-dimensionales Array von Punkten zwischen -0.1 und 1.5. Diese werden für die Visualisierung benötigt. Da es sich um ein 1-dimensionales Array handelt, sollte die Methode reshape(-1,1)
angewendet werden, bevor es in der PolynomialFeatures-Klasse verwendet wird.
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()
Experimentieren Sie gerne mit den Werten von n
in der achten Zeile. Sie werden sehen, wie sich die Grafik je nach Grad der Polynomregression verändert. Wenn Sie genau hinsehen, werden Sie feststellen, wie unterschiedlich die Vorhersagen für Merkmalswerte kleiner als 0 oder größer als 1,4 sind. Das ist das Thema des nächsten Kapitels.
Danke für Ihr Feedback!