Kursinnehåll
Linjär Regression med Python
Linjär Regression med Python
Bygga Polynomregression
Laddar fil
För detta kapitel har vi en fil som heter poly.csv
, som vi först kommer att ladda och titta på dess innehåll:
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))
Här har vi alltså en variabel och målet. Nästa steg är att skapa ett spridningsdiagram för att förstå relationen mellan variabeln och 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 är svårt att föreställa sig att en rät linje skulle passa dessa data väl, så en polynomregression är ett mycket bättre val.
Bygga X̃-matrisen
Vi kommer återigen att använda klassen OLS
. Vi behöver dock skapa en X̃-matris. Detta görs manuellt genom att lägga till en kvadrerad kolumn 'Feature'
till DataFrame enligt följande:
df['Feature_squared'] = df['Feature'] ** 2
Men om vi vill bygga en polynomregression av högre grad krävs det att vi lägger till många sådana kolumner. Lyckligtvis erbjuder Scikit-Learn ett enklare sätt att göra detta med klassen PolynomialFeatures
.
fit_transform(X)
-metoden förväntar sig att X är antingen en tvådimensionell array eller en pandas DataFrame.
Om din X är en endimensionell numpy-array, kommer metoden reshape(-1,1)
att omvandla den till en tvådimensionell array med samma innehåll:
X = X.reshape(-1,1)
Om din X är en kolumn från en DataFrame kan du använda X = df[['col1']]
för att få en DataFrame istället för en pandas Series, vilket inte är lämpligt för fit_transform()
:
X = df['Feature'] # X is a pandas Series
X = df[['Feature']] # X is a pandas DataFrame
För att konstruera en X̃ för polynomregression av grad n
används:
from sklearn.preprocessing import PolynomialFeatures # Import the class
poly = PolynomialFeatures(n) # Initialize a PolynomialFeatures object
X_tilde = poly.fit_transform(X)
Klassen PolynomialFeatures
lägger även till en kolumn med 1:or, så det är inte nödvändigt att använda sm.add_constant()
.
Bygga polynomregression och göra prediktioner
När vi vet hur man får en X̃, är vi redo att bygga polynomregressionen på samma sätt som tidigare 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()
För att förutsäga nya värden bör X_new
också transformeras med hjälp av PolynomialFeatures
.
X_new_tilde = PolynomialFeatures(n).fit_transform(X_new)
y_pred = regression_model.predict(X_new_tilde)
Följande körbara exempel visar hela processen för att bygga polynomregression. X_new
här är en endimensionell array av punkter mellan -0.1 och 1.5. Dessa behövs för visualisering. Eftersom det är en endimensionell array bör vi använda metoden reshape(-1,1)
innan den används 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 gärna experimentera med värdena för n
på den åttonde raden. Du kommer att se hur diagrammet förändras beroende på gradtalet för polynomregressionen. Om du är uppmärksam kan du märka hur olika förutsägelserna är för funktionsvärden mindre än 0 eller större än 1,4. Det är ämnet för nästa kapitel.
Tack för dina kommentarer!