La regressió polinòmica és un model de regressió que intenta ajustar les dades
que no segueixen una relació lineal mitjançant un polinomi.
Un pàmetre important en la regressió polinòmica és el grau del polinomi,
que determina el nombre de coeficients per cada variable independent
que tindrà el model.
La fórmula general d'un polinomi de grau \(n\) per a una variable independent \(X_1\) és:
L'objectiu de la regressió polinòmica és trobar els valors dels coeficients que
millor s'ajusten a les dades.
Preparació de les dades
A partir del polinomi:
\[
Y = -100 - 5X + 5X^2 + 0.1X^3
\]
Anem a generar un conjunt de dades que s'ajusten a aquest polinomi
amb una lleugera desviació.
importnumpyasnpfromsklearn.model_selectionimporttrain_test_splitdeff(x):return-100-5*x+5*np.power(x,2)+0.1*np.power(x,3)np.random.seed(42)n_samples=100X=np.random.uniform(-50,50,n_samples)Y=f(X)+np.random.randn(n_samples)*1000X=X.reshape(-1,1)# Convertim X en una matriu de 1 columnaX_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.2,random_state=42)X_test,Y_test=zip(*sorted(zip(X_test,Y_test)))# Ordenem les dades de test per visualitzar-les correctament
Figura 1. Dades generades a partir del polinomi
Regressió lineal
Si intentem ajustar les dades amb un model de regressió lineal,
obtenim un model incapaç de generalitzar les dades de manera correcta.
#!/usr/bin/env pythonimportnumpyasnpfromsklearn.model_selectionimporttrain_test_splitdeff(x):return-100-5*x+5*np.power(x,2)+0.1*np.power(x,3)np.random.seed(42)n_samples=100X=np.random.uniform(-50,50,n_samples)Y=f(X)+np.random.randn(n_samples)*1000X=X.reshape(-1,1)# Convertim X en una matriu de 1 columnaX_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.2,random_state=42)X_test,Y_test=zip(*sorted(zip(X_test,Y_test)))# Ordenem les dades de test per visualitzar-les correctamentimportmatplotlib.pyplotaspltplt.scatter(X_train,Y_train,color='blue')plt.scatter(X_test,Y_test,color='orange')plt.show()fromsklearn.linear_modelimportLinearRegressionfromsklearn.metricsimportmean_squared_errorfromsklearn.metricsimportr2_scoremodel=LinearRegression()model.fit(X_train,Y_train)pred_Y=model.predict(X_test)rmse=mean_squared_error(Y_test,pred_Y)r2=r2_score(Y_test,pred_Y)print(f'RMSE linear: {rmse:.2f}')print(f'R^2 linear: {r2:.2f}')plt.scatter(X_train,Y_train,color='blue')plt.scatter(X_test,Y_test,color='orange')plt.plot(X_test,pred_Y,color='red')plt.show()fromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.pipelineimportmake_pipelinedegree=3polynomial_features=PolynomialFeatures(degree=degree,include_bias=False)model=make_pipeline(polynomial_features,LinearRegression())model.fit(X_train,Y_train)print(f'Coeficients: {model.named_steps["linearregression"].coef_}')print(f'Intercept: {model.named_steps["linearregression"].intercept_}')pred_Y=model.predict(X_test)rmse=mean_squared_error(Y_test,pred_Y)r2=r2_score(Y_test,pred_Y)print(f'RMSE polinòmica: {rmse:.2f}')print(f'R^2 polinòmica: {r2:.2f}')plt.scatter(X_train,Y_train,color='blue')plt.scatter(X_test,Y_test,color='orange')plt.plot(X_test,pred_Y,color='red')plt.show()