示例#1
0
    def _fit_and_assess(self, X_train, X_test, z_train, z_test, md, r_idx,
                        c_idx, d_idx, verbose):
        # fitting model
        time0 = time()
        md.fit(X=X_train, y=z_train)
        time1 = time()
        elapsed_value = time1 - time0

        if verbose is True:
            print(f'Fitting time: {elapsed_value}')

        # assess training
        z_hat = md.predict(X=X_train)
        r2_train_value = r2(z_train, z_hat)
        mse_train_value = mse(z_train, z_hat)

        # assess testing
        z_tilde = md.predict(X=X_test)
        r2_test_value = r2(z_test, z_tilde)
        mse_test_value = mse(z_test, z_tilde)

        # store results
        if self.prt3 is not None:
            self.r2_train[d_idx, r_idx, c_idx] = r2_train_value
            self.r2_test[d_idx, r_idx, c_idx] = r2_test_value
            self.mse_train[d_idx, r_idx, c_idx] = mse_train_value
            self.mse_test[d_idx, r_idx, c_idx] = mse_test_value
            self.elapsed[d_idx, r_idx, c_idx] = elapsed_value
            self.models[d_idx, r_idx, c_idx] = md
            self.score[d_idx, r_idx, c_idx] = md.costs[-1]

        else:
            self.r2_train[r_idx, c_idx] = r2_train_value
            self.r2_test[r_idx, c_idx] = r2_test_value
            self.mse_train[r_idx, c_idx] = mse_train_value
            self.mse_test[r_idx, c_idx] = mse_test_value
            self.elapsed[r_idx, c_idx] = elapsed_value
            self.models[r_idx, c_idx] = md
            self.score[r_idx, c_idx] = md.costs[-1]
示例#2
0
def two_hidden_layer_relu(X_train, X_test, z_train, z_test):
    """
    In this test we study:
        1. Searching best parameters for 'NEURONSxETAS';
        2. Printing best metric and its localization;
        3. Plotting heat-maps for different metrics;
        4. Plotting Train MSE x Test MSE for a given eta;
        5. Tuning eta x decay and lambda;
        6. Tuning Eta=0.05 Vs Decays;
        7. Tuning Eta=0.05 and Decay=0 Vs Lambdas;
    """
    n_neurons = [7, 8, 9, 10, 14, 15]
    etas = [
        0.001, 0.0009, 0.0008, 0.0007, 0.0006, 0.0005, 0.0004, 0.0003, 0.0002,
        0.0001
    ]

    gs = SearchParametersDNN(params='NEURONSxETAS', random_state=10)

    # searching best parameters for 'NEURONSxETAS'
    gs.run(X_train=X_train,
           X_test=X_test,
           z_train=z_train,
           z_test=z_test,
           model=MLP,
           epochs=500,
           batch_size=len(X_train),
           etas=etas,
           learning_rate='constant',
           decays=0.0,
           lmbds=0.0,
           bias0=0.01,
           init_weights='normal',
           act_function='relu',
           output_act_function='identity',
           cost_function='mse',
           random_state=10,
           verbose=True,
           layers=2,
           neurons=n_neurons,
           hidden_layers=None)

    # printing best metric and its localization
    print(f"Best testing MSE is {gs.mse_test[gs.argbest('mse_test')]} at "
          f"indexes {gs.argbest('mse_test')}, with parameters:\n"
          f"n_neurons: {gs.prt1[gs.argbest('mse_test')[1]]}\n"
          f"Learning rate (eta): {gs.prt2[gs.argbest('mse_test')[0]]}")

    # plotting heat-maps for different metrics
    heat_maps = [
        "r2_train", "r2_test", "mse_train", "mse_test", "loss_score", "time"
    ]
    title = [
        "Training R2-Score X (Neurons x Etas) for 2 hidden-layer",
        "Testing R2-Score X (Neurons x Etas) for 2 hidden-layer",
        "Training MSE-Score X (Neurons x Etas) for 2 hidden-layer",
        "Testing MSE-Score X (Neurons x Etas) for 2 hidden-layer",
        "Last loss-Error (MSE) obtained by the training for 2 hidden-layer",
        "Elapsed time for training in seconds for 2 hidden-layer"
    ]

    for h, t in zip(heat_maps, title):
        gs.heat_map_2d(metric_arr=h,
                       title=t,
                       ylabel='Learning rate $\eta$ values',
                       xlabel='Number of Neurons in each hidden layers')

    # plotting loss-error, Train MSE and Test MSE for a given eta.
    plt.plot(n_neurons[:-1], gs.score[5][:-1], "-.", label="Loss-error")
    plt.plot(n_neurons[:-1], gs.mse_test[5][:-1], "--", label="MSE test")
    plt.plot(n_neurons[:-1], gs.mse_train[5][:-1], label="MSE train")
    plt.ylabel("MSE scores")
    plt.xlabel("Number of neurons in the hidden-layers.")
    plt.title("Training MSE and Testing MSE as a function of nr. of neurons")
    plt.ylim([0, 50])
    plt.legend()
    plt.grid()
    plt.show()

    # analysing batch_size=100
    md = MLP(hidden_layers=[9, 9],
             epochs=500,
             batch_size=100,
             eta0=0.0005,
             learning_rate='constant',
             decay=0.0,
             lmbd=0.0,
             bias0=0.01,
             init_weights='normal',
             act_function='relu',
             output_act_function='identity',
             cost_function='mse',
             random_state=10,
             verbose=True)

    md.fit(X=X_train, y=z_train)

    # plotting loss x epochs for batch_size=100
    plt.plot(np.arange(500), md.costs, "-.", label="Batch_size = 100")
    # batch_size = length of training samples
    plt.plot(np.arange(500),
             gs.models[(5, 2)].costs,
             "--",
             label="Batch_size = length of training samples")

    plt.ylabel("Cost/Loss (MSE) scores for every training epoch")
    plt.xlabel("Epochs / Number of interactions")
    plt.title("Loss (MSE) scores as a function of epochs")
    plt.legend()
    plt.grid()
    plt.ylim([0, 600])
    plt.show()

    # tuning eta x decay and lambda
    etas = [0.0006, 0.0005, 0.0004]
    decays = [0, 10**-8, 10**-7, 10**-6, 10**-5, 10**-4]
    lmbds = [0, 0.01, 0.1, 0.5, 0.9, 0.95, 0.99]

    gs1 = SearchParametersDNN(params='ETASxDECAYSxLAMBDAS', random_state=10)

    # searching best parameters for ETASxDECAYSxLAMBDAS'
    gs1.run(X_train=X_train,
            X_test=X_test,
            z_train=z_train,
            z_test=z_test,
            model=MLP,
            epochs=500,
            batch_size=len(X_train),
            etas=etas,
            learning_rate='decay',
            decays=decays,
            lmbds=lmbds,
            bias0=0.01,
            init_weights='normal',
            act_function='relu',
            output_act_function='identity',
            cost_function='mse',
            random_state=10,
            verbose=True,
            layers=None,
            neurons=None,
            hidden_layers=[9, 9])

    # printing best metric and its localization
    print(f"Best testing MSE is {gs1.mse_test[gs1.argbest('mse_test')]} at "
          f"indexes {gs1.argbest('mse_test')}, with parameters:\n"
          f"Eta: {gs1.prt1[gs1.argbest('mse_test')[2]]}\n"
          f"Decay: {gs1.prt2[gs1.argbest('mse_test')[1]]}\n"
          f"Lambda: {gs1.prt3[gs1.argbest('mse_test')[0]]}")

    # tuning Eta=0.0005 Vs Decays:
    decays = [0, 10**-7, 10**-6, 10**-5]

    mse_te = []
    mse_tr = []
    loss_error = []

    for d in decays:
        md1 = MLP(hidden_layers=[9, 9],
                  epochs=500,
                  batch_size=len(X_train),
                  eta0=0.0005,
                  learning_rate='decay',
                  decay=d,
                  lmbd=0.0,
                  bias0=0.01,
                  init_weights='normal',
                  act_function='relu',
                  output_act_function='identity',
                  cost_function='mse',
                  random_state=10,
                  verbose=True)

        md1.fit(X=X_train, y=z_train)
        y_hat = md1.predict(X_train)
        mse_tr.append(mse(y_true=z_train, y_hat=y_hat))
        y_tilde = md1.predict(X_test)
        mse_te.append(mse(y_true=z_test, y_hat=y_tilde))
        loss_error.append(md1.costs[-1])

    plt.plot(decays, mse_tr, label='MSE Train')
    plt.plot(decays, mse_te, "--", label='MSE Test')
    plt.plot(decays,
             loss_error,
             "-.",
             label='Loss-error in the last '
             'training epoch')
    plt.ylabel("MSE scores")
    plt.xlabel("Decay values")
    plt.title("Training and Testing MSE Vs Decays")
    plt.legend()
    plt.grid()
    plt.ylim([0, 100])
    plt.show()

    # tuning Eta=0.0005 and Decay=1e-5 Vs Lambdas;
    lmbds = [0, 0.01, 0.1, 0.5, 0.9, 0.95, 0.99]

    mse_te = []
    mse_tr = []
    loss_error = []

    for l in lmbds:
        md2 = MLP(hidden_layers=[9, 9],
                  epochs=500,
                  batch_size=len(X_train),
                  eta0=0.0005,
                  learning_rate='decay',
                  decay=1e-6,
                  lmbd=l,
                  bias0=0.01,
                  init_weights='normal',
                  act_function='relu',
                  output_act_function='identity',
                  cost_function='mse',
                  random_state=10,
                  verbose=True)

        md2.fit(X=X_train, y=z_train)
        y_hat = md2.predict(X_train)
        mse_tr.append(mse(y_true=z_train, y_hat=y_hat))
        y_tilde = md2.predict(X_test)
        mse_te.append(mse(y_true=z_test, y_hat=y_tilde))
        loss_error.append(md2.costs[-1])

    plt.plot(lmbds, mse_tr, label='MSE Train')
    plt.plot(lmbds, mse_te, "--", label='MSE Test')
    plt.plot(lmbds,
             loss_error,
             "-.",
             label='Loss-error in the last '
             'training epoch')
    plt.ylabel("MSE scores")
    plt.xlabel("Lambdas values")
    plt.title("Training & Testing MSE Vs lambds")
    plt.legend()
    plt.ylim([0, 100])
    plt.grid()
    plt.show()
示例#3
0
def one_hidden_layer_sigmoid(X_train, X_test, z_train, z_test):
    """
    In this test we study:
        1. Searching best parameters for 'NEURONSxETAS';
        2. Printing best metric and its localization;
        3. Plotting heat-maps for different metrics;
        4. Plotting Train MSE x Test MSE for a given eta;
        5. Analysing obtained costs for each epoch when batch_size is the
           length of samples;
        6. Analysing obtained costs for each epoch when batch_size is 100;
        7. Tuning eta x decay and lambda;
        8. Searching Eta Vs Decays;
        9. Searching Eta and Decay=0 Vs Lambdas;
    """
    n_neurons = [10, 20, 30, 40, 50, 75, 100, 125, 150]
    etas = [0.99, 0.9, 0.8, 0.7, 0.6, 0.5]

    gs = SearchParametersDNN(params='NEURONSxETAS', random_state=10)

    # searching best parameters for 'NEURONSxETAS'
    gs.run(X_train=X_train,
           X_test=X_test,
           z_train=z_train,
           z_test=z_test,
           model=MLP,
           epochs=500,
           batch_size=len(X_train),
           etas=etas,
           learning_rate='constant',
           decays=0.0,
           lmbds=0.0,
           bias0=0.01,
           init_weights='normal',
           act_function='sigmoid',
           output_act_function='identity',
           cost_function='mse',
           random_state=10,
           verbose=True,
           layers=1,
           neurons=n_neurons,
           hidden_layers=None)

    # printing best metric and its localization
    print(f"Best testing MSE is {gs.mse_test[gs.argbest('mse_test')]} at "
          f"indexes {gs.argbest('mse_test')}, with parameters:\n"
          f"n_neurons: {gs.prt1[gs.argbest('mse_test')[1]]}\n"
          f"Learning rate (eta): {gs.prt2[gs.argbest('mse_test')[0]]}")

    # plotting heat-maps for different metrics
    heat_maps = [
        "r2_train", "r2_test", "mse_train", "mse_test", "loss_score", "time"
    ]
    title = [
        "Training R2-Score X (Neurons x Etas) for 1 hidden-layer",
        "Testing R2-Score X (Neurons x Etas) for 1 hidden-layer",
        "Training MSE-Score X (Neurons x Etas) for 1 hidden-layer",
        "Testing MSE-Score X (Neurons x Etas) for 1 hidden-layer",
        "Last loss-Error (MSE) obtained by the training.",
        "Elapsed time for training in seconds."
    ]

    for h, t in zip(heat_maps, title):
        gs.heat_map_2d(metric_arr=h,
                       title=t,
                       ylabel='Learning rate $\eta$ values',
                       xlabel='Number of Neurons in each hidden layer')

    # plotting loss-error, Train MSE and Test MSE for a given eta.
    plt.plot(n_neurons, gs.score[1], "-.", label="Loss-error")
    plt.plot(n_neurons, gs.mse_test[1], "--", label="MSE test")
    plt.plot(n_neurons, gs.mse_train[1], label="MSE train")
    plt.ylabel("MSE scores")
    plt.xlabel("Number of neurons in the hidden-layer.")
    plt.title("Loss-error, Training MSE and Testing MSE as a function of nr. "
              "of neurons")
    plt.ylim([0, 50])
    plt.legend()
    plt.grid()
    plt.show()

    # analysing batch_size=100
    md = MLP(hidden_layers=[100],
             epochs=500,
             batch_size=100,
             eta0=0.9,
             learning_rate='constant',
             decay=0.0,
             lmbd=0.0,
             bias0=0.01,
             init_weights='normal',
             act_function='sigmoid',
             output_act_function='identity',
             cost_function='mse',
             random_state=10,
             verbose=True)

    md.fit(X=X_train, y=z_train)

    # plotting loss x epochs for batch_size=100
    plt.plot(np.arange(500), md.costs, "-.", label="Batch_size = 100")
    # batch_size = length of training samples
    plt.plot(np.arange(500),
             gs.models[(1, 6)].costs,
             "--",
             label="Batch_size = length of training samples")

    plt.ylabel("Cost/Loss (MSE) scores for every training epoch")
    plt.xlabel("Epochs / Number of interactions")
    plt.title("Loss (MSE) scores as a function of epochs")
    plt.legend()
    plt.grid()
    plt.ylim([0, 600])
    plt.show()

    # tuning eta x decay and lambda
    etas = [0.99, 0.95, 0.9, 0.85, 0.8, 0.7, 0.6, 0.5]
    decays = [
        0, 10**-9, 10**-8, 10**-7, 10**-6, 10**-5, 10**-4, 10**-3, 10**-2,
        10**-1
    ]
    lmbds = [
        0, 10**-9, 10**-8, 10**-7, 10**-6, 10**-5, 10**-4, 10**-3, 10**-2,
        10**-1
    ]

    gs1 = SearchParametersDNN(params='ETASxDECAYSxLAMBDAS', random_state=10)

    # searching best parameters for ETASxDECAYSxLAMBDAS'
    gs1.run(X_train=X_train,
            X_test=X_test,
            z_train=z_train,
            z_test=z_test,
            model=MLP,
            epochs=500,
            batch_size=len(X_train),
            etas=etas,
            learning_rate='decay',
            decays=decays,
            lmbds=lmbds,
            bias0=0.01,
            init_weights='normal',
            act_function='sigmoid',
            output_act_function='identity',
            cost_function='mse',
            random_state=10,
            verbose=True,
            layers=None,
            neurons=None,
            hidden_layers=[100])

    # printing best metric and its localization
    print(f"Best testing MSE is {gs1.mse_test[gs1.argbest('mse_test')]} at "
          f"indexes {gs1.argbest('mse_test')}, with parameters:\n"
          f"Eta: {gs1.prt1[gs1.argbest('mse_test')[2]]}\n"
          f"Decay: {gs1.prt2[gs1.argbest('mse_test')[1]]}\n"
          f"Lambda: {gs1.prt3[gs1.argbest('mse_test')[0]]}")

    # plotting heat-plot with the best lambda
    gs1.heat_map_3d(metric_arr='mse_test',
                    title='Testing MSE Vs ($\lambda$=0, decay, $\eta$)',
                    ylabel='Decay Values',
                    xlabel='Learning rate $\eta$ values')

    # bar-plotting selected values
    p_idxs = np.array([(p3, p2, p1) for p3 in lmbds[:3] for p1 in etas[:3]
                       for p2 in decays[:3]],
                      dtype=tuple)

    t_mse = np.hstack([
        gs1.mse_test[0, :3, 0], gs1.mse_test[0, :3, 1], gs1.mse_test[0, :3, 2],
        gs1.mse_test[1, :3, 0], gs1.mse_test[1, :3, 1], gs1.mse_test[1, :3, 2],
        gs1.mse_test[2, :3, 0], gs1.mse_test[2, :3, 1], gs1.mse_test[2, :3, 2]
    ])

    tr_mse = np.hstack([
        gs1.mse_train[0, :3, 0], gs1.mse_train[0, :3, 1], gs1.mse_train[0, :3,
                                                                        2],
        gs1.mse_train[1, :3, 0], gs1.mse_train[1, :3, 1], gs1.mse_train[1, :3,
                                                                        2],
        gs1.mse_train[2, :3, 0], gs1.mse_train[2, :3, 1], gs1.mse_train[2, :3,
                                                                        2]
    ])

    df = pd.DataFrame(t_mse, columns=['MSE test'])
    df.index = p_idxs
    df['MSE train'] = tr_mse
    sns.catplot(kind="bar", data=df.transpose())
    plt.title(
        f'(Training and testing MSE scores) X ($\lambda$, decay, $\eta$)')
    plt.ylabel('Training and Testing MSE scores')
    plt.xlabel("('l2' regularization $\lambda$, decay, Learning rate $\eta$) "
               "values")
    plt.xticks(rotation=90)
    plt.show()

    # searching Eta=0.9 Vs Decays:
    decays = [0, 10**-9, 10**-8, 10**-7, 10**-6, 10**-5]

    mse_te = []
    mse_tr = []
    loss_error = []

    for d in decays:
        md1 = MLP(hidden_layers=[100],
                  epochs=500,
                  batch_size=len(X_train),
                  eta0=0.9,
                  learning_rate='decay',
                  decay=d,
                  lmbd=0.0,
                  bias0=0.01,
                  init_weights='normal',
                  act_function='sigmoid',
                  output_act_function='identity',
                  cost_function='mse',
                  random_state=10,
                  verbose=True)

        md1.fit(X=X_train, y=z_train)
        y_hat = md1.predict(X_train)
        mse_tr.append(mse(y_true=z_train, y_hat=y_hat))
        y_tilde = md1.predict(X_test)
        mse_te.append(mse(y_true=z_test, y_hat=y_tilde))
        loss_error.append(md1.costs[-1])

    plt.plot(decays, mse_tr, label='MSE Train')
    plt.plot(decays, mse_te, "--", label='MSE Test')
    plt.plot(decays,
             loss_error,
             "-.",
             label='Loss-error in the last '
             'training epoch')
    plt.ylabel("MSE scores")
    plt.xlabel("Decay values")
    plt.title("Loss-error, Training and Testing MSE Vs Decays for $\eta$=0.9")
    plt.legend()
    plt.grid()
    plt.ylim([0, 13])
    plt.show()

    # searching Eta=0.9 and Decay=0 Vs Lambdas;
    lmbds = [0, 10**-5, 10**-4, 10**-3, 10**-2, 10**-1]

    mse_te = []
    mse_tr = []
    loss_error = []

    for l in lmbds:
        md3 = MLP(hidden_layers=[100],
                  epochs=500,
                  batch_size=len(X_train),
                  eta0=0.9,
                  learning_rate='constant',
                  decay=0.0,
                  lmbd=l,
                  bias0=0.01,
                  init_weights='normal',
                  act_function='sigmoid',
                  output_act_function='identity',
                  cost_function='mse',
                  random_state=10,
                  verbose=True)

        md3.fit(X=X_train, y=z_train)
        y_hat = md3.predict(X_train)
        mse_tr.append(mse(y_true=z_train, y_hat=y_hat))
        y_tilde = md3.predict(X_test)
        mse_te.append(mse(y_true=z_test, y_hat=y_tilde))
        loss_error.append(md3.costs[-1])

    plt.plot(lmbds, mse_tr, label='MSE Train')
    plt.plot(lmbds, mse_te, "--", label='MSE Test')
    plt.plot(lmbds,
             loss_error,
             "-.",
             label='Loss-error in the last '
             'training epoch')
    plt.ylabel("MSE scores")
    plt.xlabel("Lambdas values")
    plt.title("Loss_error, Training & Testing MSE Vs Lambdas")
    plt.legend()
    plt.grid()
    plt.show()
                                                        z,
                                                        test_size=0.2,
                                                        shuffle=True,
                                                        stratify=None,
                                                        random_state=10)

    # scaling X data
    scaler = StandardScaler(with_mean=False, with_std=True)
    scaler.fit(X_train)
    X_test = scaler.transform(X_test)
    X_train = scaler.transform(X_train)

    model.fit(X_train, z_train)
    y_hat = model.predict(X_test)

    print(f'{l}', mse(y_true=z_test, y_hat=y_hat))

    # Testing MSE for OLS model: 1.116780111855389
    # Testing MSE for Ridge model: 1.4407904605093536
# ##################################################

# ################################## pre-processing GeoTIF Image
# ################################## for SGD and Mini-SGDM
cd = CreateData(random_state=10)
X, z = cd.fit(nr_samples=15, degree=10, terrain_file=terrain_file)

# splitting data
X_train, X_test, z_train, z_test = train_test_split(X,
                                                    z,
                                                    test_size=0.2,
                                                    shuffle=True,
示例#5
0
    def run(self,
            X_train,
            X_test,
            y_train,
            y_test,
            model,
            epochs,
            etas,
            batch_sizes,
            lambdas,
            decays,
            gammas,
            plot_results=False,
            verbose=False):
        """
        Run the experiment to search the best parameters.
        """
        param1, param2, md = None, None, None

        if self.params == 'ETASxLAMBDAS':
            param1, param2 = etas, lambdas

        elif self.params == 'ETASxEPOCHS':
            param1, param2 = etas, epochs

        elif self.params == 'ETASxBATCHES':
            param1, param2 = etas, batch_sizes

        elif self.params == 'ETASxDECAYS':
            param1, param2 = etas, decays

        elif self.params == 'ETASxGAMMAS':
            param1, param2 = etas, gammas

        mse_train = np.zeros(shape=(len(param2), len(param1)))
        mse_test = np.zeros(shape=(len(param2), len(param1)))
        r2_train = np.zeros(shape=(len(param2), len(param1)))
        r2_test = np.zeros(shape=(len(param2), len(param1)))
        elapsed = np.zeros(shape=(len(param2), len(param1)))
        self.models = np.empty(shape=(len(param2), len(param1)), dtype=object)

        for c_idx, p1 in enumerate(param1):
            for r_idx, p2 in enumerate(param2):

                # set parameters
                if self.params == 'ETASxLAMBDAS':
                    md = model(batch_size=batch_sizes,
                               epochs=epochs,
                               eta0=p1,
                               decay=decays,
                               lambda_=p2,
                               gamma=gammas,
                               regularization=None,
                               random_state=self.random_state)

                elif self.params == 'ETASxEPOCHS':
                    md = model(batch_size=batch_sizes,
                               epochs=p2,
                               eta0=p1,
                               decay=decays,
                               lambda_=lambdas,
                               gamma=gammas,
                               regularization=None,
                               random_state=self.random_state)

                elif self.params == 'ETASxBATCHES':
                    md = model(batch_size=p2,
                               epochs=epochs,
                               eta0=p1,
                               decay=decays,
                               lambda_=lambdas,
                               gamma=gammas,
                               regularization=None,
                               random_state=self.random_state)

                elif self.params == 'ETASxDECAYS':
                    md = model(batch_size=batch_sizes,
                               epochs=epochs,
                               eta0=p1,
                               decay=p2,
                               lambda_=lambdas,
                               gamma=gammas,
                               regularization=None,
                               random_state=self.random_state)

                elif self.params == 'ETASxGAMMAS':
                    md = model(batch_size=batch_sizes,
                               epochs=epochs,
                               eta0=p1,
                               decay=decays,
                               lambda_=lambdas,
                               gamma=p2,
                               regularization=None,
                               random_state=self.random_state)

                # train model
                time0 = time()
                md.fit(X=X_train, z=y_train)
                time1 = time()
                elapsed_value = time1 - time0
                elapsed[r_idx, c_idx] = elapsed_value

                # assess model
                y_hat = md.predict(X=X_train)
                r2_train_value = r2(y_train, y_hat)
                r2_train[r_idx, c_idx] = r2_train_value
                mse_train_value = mse(y_train, y_hat)
                mse_train[r_idx, c_idx] = mse_train_value

                y_tilde = md.predict(X=X_test)
                r2_test_value = r2(y_test, y_tilde)
                r2_test[r_idx, c_idx] = r2_test_value
                mse_test_value = mse(y_test, y_tilde)
                mse_test[r_idx, c_idx] = mse_test_value

                if verbose is True:
                    self._verbose(params=self.params,
                                  p1=p1,
                                  p2=p2,
                                  r2_train_value=r2_train_value,
                                  mse_train_value=mse_train_value,
                                  r2_test_value=r2_test_value,
                                  mse_test_value=mse_test_value,
                                  elapsed=elapsed_value)

                self.models[r_idx, c_idx] = md

        if plot_results is True:
            self._plot_heatmaps(params=self.params,
                                param1=param1,
                                param2=param2,
                                r2_train=r2_train,
                                mse_train=mse_train,
                                r2_test=r2_test,
                                mse_test=mse_test,
                                elapsed=elapsed)

        return r2_train, mse_train, r2_test, mse_test, elapsed, self.models