lambdas =  np.logspace(-10, 10, 50)

    
pipe_lasso = make_pipeline(StandardScaler(), Lasso(random_state=1)) #Pipe
      
#Grid search
gs = GridSearchCV(estimator=pipe_lasso, 
                  param_grid=[{'lasso__alpha':lambdas}], #Now two hyperparameters
                  scoring='neg_mean_squared_error', 
                  cv=10, n_jobs=-1)

gs = gs.fit(X_train, y_train) #fits
print(gs.best_params_) # prints best parameters

lasso_alpha=gs.best_params_.get('lasso__alpha') #extract best parameters

#Builds final pipeline with best parameters
pipe_lasso_final = make_pipeline(StandardScaler(), Lasso(alpha=lasso_alpha,random_state=1)) 
pipe_lasso_final.fit(X_train, y_train)

#Stores performance using the prefered parameter from the cross validation
mseCVlasso_train=mse(y_train,pipe_lasso_final.predict(X_train))    #predict on train
mseCVlasso_test=mse(y_test,pipe_lasso_final.predict(X_test))   #predict on test

print('train MSE:' + str(mseCVlasso_train))
print('test MSE:' + str(mseCVlasso_test))