La regularització és un mètode que permet evitar el sobreajustament
dels models de regressió.
Aquest mètode consisteix en afegir un terme a la funció de cost
que penalitza els pesos del model, evitant que aprenguen massa
els valors de les dades d'entrenament.
Aquest exemple utilitza el procés de Normalització de les dades
mitjançant la classe StandardScaler, que encara no hem estudiat.
descens_gradient.py
#!/usr/bin/env pythonimportnumpyasnpfromsklearn.model_selectionimporttrain_test_splitdeff(x):return3*x+100np.random.seed(42)n_samples=50X=np.random.uniform(-50,50,n_samples)Y=f(X)+np.random.randn(n_samples)*10X=X.reshape(-1,1)# Convertim X en una matriu de 1 columnaY[10]=1000fromsklearn.preprocessingimportStandardScalerscaler=StandardScaler()X=scaler.fit_transform(X)Y=scaler.fit_transform(Y.reshape(-1,1)).ravel()X_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 correctamentfromsklearn.linear_modelimportSGDRegressormax_iter=1000models={"huber_small_e":SGDRegressor(loss='huber',max_iter=max_iter,epsilon=0.1),"huber_large_e":SGDRegressor(loss='huber',max_iter=max_iter,epsilon=2.5),"epsilon_insensitive":SGDRegressor(loss='epsilon_insensitive',max_iter=max_iter,epsilon=0.1),"squared_error":SGDRegressor(loss='squared_error',max_iter=max_iter),}colors=['red','green','cyan','magenta']importmatplotlib.pyplotaspltplt.scatter(X_train,Y_train,color='blue')plt.scatter(X_test,Y_test,color='orange')fori,(title,model)inenumerate(models.items()):model.fit(X_train,Y_train)pred_Y=model.predict(X_test)fromsklearn.metricsimportroot_mean_squared_errorfromsklearn.metricsimportr2_scorermse=root_mean_squared_error(Y_test,pred_Y)r2=r2_score(Y_test,pred_Y)print(f'RMSE {title}: {rmse:.2f}')print(f'R^2 {title}: {r2:.2f}')X_plot=[X.min(),X.max()]Y_plot=model.predict(np.array(X_plot).reshape(-1,1))plt.plot(X_plot,Y_plot,color=colors[i],lw=2)plt.legend(["train","test"]+list(models.keys()))plt.show()