def train(regress_type='hybrid', seed=1, **kwargs):
    X_obs = kwargs['X_obs']
    y_obs = kwargs['y_obs']
    Kds = kwargs['Kds']

    kwargs['regress_type'] = regress_type

    # Debug.
    #X_obs = X_obs[:10]
    #y_obs = y_obs[:10]

    # Fit the model.

    if regress_type == 'baseline':
        from baseline import Baseline
        regressor = Baseline()

    elif regress_type == 'mlper1':
        regressor = mlp_ensemble(
            n_neurons=200,
            n_regressors=1,
            n_epochs=50,
            seed=seed,
        )
    elif regress_type == 'dmlper1':
        regressor = mlp_ensemble(
            n_neurons=1000,
            n_regressors=1,
            n_hidden_layers=15,
            n_epochs=300,
            seed=seed,
        )
    elif regress_type == 'mlper1g':
        regressor = mlp_ensemble(
            n_neurons=100,
            n_regressors=1,
            n_epochs=100,
            loss='gaussian_nll',
            seed=seed,
        )

    elif regress_type == 'mlper5':
        regressor = mlp_ensemble(
            n_neurons=200,
            n_regressors=5,
            n_epochs=100,
            seed=seed,
        )
    elif regress_type == 'mlper5g':
        regressor = mlp_ensemble(
            n_neurons=200,
            n_regressors=5,
            n_epochs=50,
            loss='gaussian_nll',
            seed=seed,
        )

    elif regress_type == 'bayesnn':
        from bayesian_neural_network import BayesianNN
        regressor = BayesianNN(
            n_hidden1=200,
            n_hidden2=200,
            n_iter=1000,
            n_posterior_samples=100,
            random_state=seed,
            verbose=True,
        )

    elif regress_type == 'cmf':
        from cmf_regressor import CMFRegressor
        regressor = CMFRegressor(
            n_components=30,
            seed=seed,
        )
        regressor.fit(
            kwargs['chems'],
            kwargs['prots'],
            kwargs['chem2feature'],
            kwargs['prot2feature'],
            kwargs['Kds'],
            kwargs['idx_obs'],
        )

    elif regress_type == 'gp':
        from gaussian_process import GPRegressor
        from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C
        regressor = GPRegressor(
            kernel=C(10000., 'fixed') * RBF(1., 'fixed'),
            backend='sklearn',
            n_jobs=10,
            verbose=True
        )
    elif regress_type == 'gpfactorized':
        from gaussian_process import GPRegressor
        from sklearn.gaussian_process.kernels import ConstantKernel as C
        from kernels import FactorizedRBF

        n_features_chem = kwargs['n_features_chem']
        n_features_prot = kwargs['n_features_prot']

        regressor = GPRegressor(
            kernel=C(1., 'fixed') * FactorizedRBF(
                [ 1.1, 1. ], [ n_features_chem, n_features_prot ], 'fixed'
            ),
            backend='sklearn',
            n_restarts=0,
            n_jobs=10,
            verbose=True
        )
    elif regress_type == 'sparsegp':
        from gaussian_process import SparseGPRegressor
        regressor = SparseGPRegressor(
            method='geosketch',
            n_inducing=8000,
            backend='sklearn',
            n_restarts=10,
            n_jobs=10,
            verbose=True
        )

    elif regress_type == 'hybrid':
        from gaussian_process import GPRegressor
        from hybrid import HybridMLPEnsembleGP
        regressor = HybridMLPEnsembleGP(
            mlp_ensemble(
                n_neurons=200,
                n_regressors=1,
                n_epochs=50,
                seed=seed,
            ),
            GPRegressor(
                backend='sklearn',#'gpytorch',
                n_restarts=10,
                n_jobs=10,
                verbose=True,
            ),
        )
    elif regress_type == 'dhybrid':
        from gaussian_process import GPRegressor
        from hybrid import HybridMLPEnsembleGP
        regressor = HybridMLPEnsembleGP(
            mlp_ensemble(
                n_neurons=1000,
                n_regressors=1,
                n_hidden_layers=15,
                n_epochs=300,
                seed=seed,
            ),
            GPRegressor(
                backend='sklearn',#'gpytorch',
                n_restarts=10,
                n_jobs=10,
                verbose=True,
            ),
        )
    elif regress_type == 'sparsehybrid':
        from gaussian_process import SparseGPRegressor
        from hybrid import HybridMLPEnsembleGP
        from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C
        regressor = HybridMLPEnsembleGP(
            mlp_ensemble(
                n_neurons=200,
                n_regressors=1,
                n_epochs=50,
                seed=seed,
            ),
            SparseGPRegressor(
                method='geosketch',
                n_inducing=8000,
                backend='sklearn',
                n_restarts=10,
                n_jobs=10,
                verbose=True
            ),
        )

    if regress_type not in { 'cmf' }:
        regressor.fit(X_obs, y_obs)

    #print(regressor.model_.kernel_.get_params()) # Debug.

    kwargs['regressor'] = regressor

    return kwargs