Kursinnhold
Lineær Regresjon med Python
Lineær Regresjon med Python
Interpolasjon vs. Ekstrapolasjon
I forrige kapittel la vi merke til at våre prediksjoner med ulike modeller blir mer varierende i ytterkantene.
For å være mer presis, blir prediksjonene merkelige i det øyeblikket vi beveger oss utenfor verdiene fra treningssettet. Å predikere verdier utenfor treningssettets område kalles ekstrapolasjon, mens å predikere verdier innenfor området kalles interpolasjon.
Regresjon håndterer ikke ekstrapolasjon godt. Den brukes til interpolasjon og kan gi absurde prediksjoner når nye tilfeller ligger utenfor treningssettets område.
Konfidensintervaller
Ved å bruke OLS
-klassen kan du også hente ut konfidensintervaller for regresjonslinjen ved ethvert punkt. Men syntaksen er litt komplisert:
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']
Her er alpha
et konfidensnivå, vanligvis satt til 0.05
.
Med koden over får du nedre og øvre grenser for regresjonslinjens konfidensintervall ved punktet X_new_tilde
(eller et array av øvre og nedre grenser hvis X_new_tilde
er et array).
Med dette kan vi nå plotte regresjonslinjen sammen med dens 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()
Uten å kjenne fordelingen til en målvariabel, kan vi ikke finne den eksakte regresjonslinjen. Alt vi gjør er å forsøke å tilnærme den basert på våre data. Konfidensintervallet til regresjonslinjen er intervallet hvor den eksakte regresjonslinjen ligger med konfidensnivå alpha
.
Du kan se at intervallet blir større og større jo lenger bort fra treningssettets område det kommer.
Konfidensintervallene er bygget under forutsetning av at vi har valgt riktig modell (for eksempel enkel lineær regresjon eller polynomregresjon av grad 4).
Hvis modellen er dårlig valgt, er konfidensintervallet upålitelig, og det samme gjelder selve linjen. Du vil lære hvordan du velger den beste modellen i neste seksjon.
Takk for tilbakemeldingene dine!