Contenuti del Corso
Regressione Lineare con Python
Regressione Lineare con Python
Costruzione della Regressione Polinomiale
Caricamento del file
Per questo capitolo, abbiamo un file chiamato poly.csv
, che caricheremo per primo e ne osserveremo il contenuto:
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))
Qui abbiamo quindi una caratteristica e il target. Successivamente, costruiremo un diagramma a dispersione per comprendere la relazione tra la caratteristica e il target:
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()
È difficile immaginare che una retta possa adattarsi bene a questi dati, quindi una regressione polinomiale sarà una scelta molto migliore.
Costruzione della matrice X̃
Utilizzeremo nuovamente la classe OLS
. Tuttavia, è necessario creare manualmente una matrice X̃ aggiungendo una colonna 'Feature'
al DataFrame come segue:
df['Feature_squared'] = df['Feature'] ** 2
Tuttavia, se si desidera costruire una regressione polinomiale di grado elevato, sarà necessario aggiungere molte colonne in questo modo. Fortunatamente, Scikit-Learn offre un modo meno laborioso per farlo utilizzando la classe PolynomialFeatures
.
Il metodo fit_transform(X)
si aspetta che X sia un array bidimensionale o un DataFrame di pandas.
Se X è un array numpy monodimensionale, il metodo reshape(-1,1)
lo trasformerà in un array bidimensionale con lo stesso contenuto:
X = X.reshape(-1,1)
Se X è una colonna di un DataFrame, puoi usare X = df[['col1']]
per ottenere un DataFrame invece di una Series di pandas, che non è adatta per fit_transform()
:
X = df['Feature'] # X is a pandas Series
X = df[['Feature']] # X is a pandas DataFrame
Per costruire una X̃ per la Regressione Polinomiale di grado n
, si utilizza:
from sklearn.preprocessing import PolynomialFeatures # Import the class
poly = PolynomialFeatures(n) # Initialize a PolynomialFeatures object
X_tilde = poly.fit_transform(X)
La classe PolynomialFeatures
aggiunge anche una colonna di 1, quindi non è necessario utilizzare sm.add_constant()
.
Costruzione della Regressione Polinomiale e Predizione dei Valori
Avendo appreso come ottenere una X̃, siamo pronti a costruire la Regressione Polinomiale nello stesso modo dei modelli precedenti:
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()
Per prevedere nuovi valori, anche X_new
deve essere trasformato utilizzando PolynomialFeatures
.
X_new_tilde = PolynomialFeatures(n).fit_transform(X_new)
y_pred = regression_model.predict(X_new_tilde)
Il seguente esempio eseguibile mostra l'intero processo di costruzione della regressione polinomiale. X_new
qui è un array monodimensionale di punti compresi tra -0.1 e 1.5. Questi sono necessari per la visualizzazione. E poiché si tratta di un array monodimensionale, è necessario applicare il metodo reshape(-1,1)
prima di utilizzarlo nella classe PolynomialFeatures.
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()
Sentiti libero di modificare i valori di n
all'ottava riga. Potrai osservare come il grafico cambia a seconda del grado della regressione polinomiale. Se presti attenzione, potresti notare quanto siano diverse le previsioni per valori della variabile indipendente inferiori a 0 o superiori a 1.4. Questo sarà l'argomento del prossimo capitolo.
Grazie per i tuoi commenti!