Kursinhalt
Lineare Regression mit Python
Lineare Regression mit Python
Interpolation vs. Extrapolation
Im vorherigen Kapitel haben wir festgestellt, dass unsere Vorhersagen mit verschiedenen Modellen an den Rändern immer unterschiedlicher werden.
Genauer gesagt werden die Vorhersagen merkwürdig, sobald wir den Wertebereich des Trainingsdatensatzes überschreiten. Die Vorhersage von Werten außerhalb des Trainingsbereichs wird als Extrapolation bezeichnet, während die Vorhersage von Werten innerhalb des Bereichs als Interpolation gilt.
Die Regression eignet sich nicht gut für die Extrapolation. Sie wird für die Interpolation verwendet und kann zu absurden Vorhersagen führen, wenn neue Instanzen außerhalb des Trainingsbereichs liegen.
Konfidenzintervalle
Mit der OLS
-Klasse können auch die Konfidenzintervalle für die Regressionslinie an jedem Punkt ermittelt werden. Die Syntax ist jedoch etwas kompliziert:
lower = regression_model.get_prediction(X_new_tilde).summary_frame(alpha)['mean_ci_lower']
upper = regression_model.get_prediction(X_new_tilde).summary_frame(alpha)['mean_ci_upper']
Dabei ist alpha
das Konfidenzniveau, üblicherweise auf 0.05
gesetzt.
Mit dem obigen Code erhält man die unteren und oberen Grenzen des Konfidenzintervalls der Regressionslinie am Punkt X_new_tilde
(oder ein Array von oberen und unteren Grenzen, falls X_new_tilde
ein Array ist).
Damit kann nun die Regressionslinie zusammen mit ihrem Konfidenzintervall dargestellt werden:
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 = 4 # 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) # 1-d array of new feature values X_new_tilde = PolynomialFeatures(n).fit_transform(X_new.reshape(-1,1)) # Transform X_new for predict() method y_pred = regression_model.predict(X_new_tilde) lower = regression_model.get_prediction(X_new_tilde).summary_frame(0.05)['mean_ci_lower'] # Get lower bound for each point upper = regression_model.get_prediction(X_new_tilde).summary_frame(0.05)['mean_ci_upper'] # get upper bound for each point plt.scatter(X, y) # Build a scatterplot plt.plot(X_new, y_pred) # Build a Polynomial Regression graph plt.fill_between(X_new, lower, upper, alpha=0.4) plt.show()
Ohne Kenntnis der Verteilung des Zielwerts kann die exakte Regressionslinie nicht bestimmt werden. Es wird lediglich versucht, diese auf Basis der vorhandenen Daten zu approximieren. Das Konfidenzintervall der Regressionslinie ist das Intervall, in dem die exakte Regressionslinie mit dem Konfidenzniveau alpha
liegt.
Es ist erkennbar, dass das Intervall umso größer wird, je weiter es sich vom Wertebereich des Trainingsdatensatzes entfernt.
Die Konfidenzintervalle werden unter der Annahme erstellt, dass das Modell korrekt gewählt wurde (z. B. einfache lineare Regression oder Polynomregression vierten Grades).
Wenn das Modell schlecht gewählt ist, ist das Konfidenzintervall unzuverlässig und ebenso die Regressionslinie selbst. Wie Sie das beste Modell auswählen, erfahren Sie im nächsten Abschnitt.
Danke für Ihr Feedback!