Kursinnehåll
Linjär Regression med Python
Linjär Regression med Python
Interpolation kontra Extrapolation
I föregående kapitel märkte vi att våra förutsägelser med olika modeller blir mer varierande vid kanterna.
För att vara mer exakt blir förutsägelserna märkliga när vi passerar värdeintervallet från träningsuppsättningen. Att förutsäga värden utanför träningsuppsättningens intervall kallas extrapolering, och att förutsäga värden inom intervallet kallas interpolering.
Regression hanterar inte extrapolering särskilt bra. Den används för interpolering och kan ge orimliga förutsägelser när nya instanser ligger utanför träningsuppsättningens intervall.
Konfidensintervall
Med hjälp av OLS
-klassen kan du även erhålla konfidensintervall för regressionslinjen vid varje punkt. Syntaxen är dock något komplicerad:
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']
Där alpha
är en konfidensnivå, vanligtvis satt till 0.05
.
Med ovanstående kod får du de nedre och övre gränserna för regressionslinjens konfidensintervall vid punkten X_new_tilde
(eller en array av övre och nedre gränser om X_new_tilde
är en array).
Med detta kan vi nu visualisera regressionslinjen tillsammans med dess konfidensintervall:
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()
Utan att känna till fördelningen för ett mål kan vi inte hitta den exakta regressionslinjen. Allt vi gör är att försöka approximera den baserat på våra data. Konfidensintervallet för regressionslinjen är det intervall där den exakta regressionslinjen ligger med konfidensnivån alpha
.
Du kan se att intervallet blir större ju längre bort från träningsmängdens intervall man kommer.
Konfidensintervallen är konstruerade under antagandet att vi har valt rätt modell (t.ex. Enkel linjär regression eller polynomregression av grad 4).
Om modellen är felaktigt vald är konfidensintervallet opålitligt, liksom själva linjen. Du kommer att lära dig hur du väljer den bästa modellen i nästa avsnitt.
Tack för dina kommentarer!