def METHOD_NAME(params_hpo, params_impution, unit_test=False):
    if params_impution['name'] == 'sklearn.impute.KNNImputer':
        imputer = sklearn.impute.KNNImputer()
    else:
        raise ValueError('unknown imputer with name', params_impution['name'])
    classifier = sklearn.neural_network.MLPClassifier(solver='adam') #, max_iter=400)
    steps = [('imputer', imputer), ('mlp', classifier)]
    if unit_test:
        estimator = sklearn.pipeline.Pipeline(steps=steps)
    else:
        # using memory avoid repeated imputation (with the same impution results) within the HPO
        # and reduces the running time
        # see section 6.1.1.3 in https://scikit-learn.org/stable/modules/compose.html#pipeline-chaining-estimators
        memory = '../tmp'
        estimator = sklearn.pipeline.Pipeline(steps=steps, memory=memory)
    #logging.debug('available parameter keys for MLP=%s', estimator.get_params().keys())
    all_params = params_impution["model_specific"].copy()
    all_params.update(params_hpo)
    params_hpo_mlp = {}
    for key, value in all_params.items():
        if key == 'hidden_layer_sizes':
            # e.g. ['10', '5', '10,5,3']
            current_value = value.copy()
            value = []
            for v in current_value:
                t = tuple(map(int, v.split(',')))
                value.append(t)
        if key in ['n_neighbors', 'weights']:
            # add prefix 'imputer__' because estimator is a pipeline
            params_hpo_mlp['imputer__' + key] = value
        elif key in ['hidden_layer_sizes', 'learning_rate', 'learning_rate_init', 'alpha', 'beta_1', 'beta_2', 'max_iter']:
            # add prefix 'mlp__' because estimator is a pipeline
            params_hpo_mlp['mlp__' + key] = value
        else:
            params_hpo_mlp[key] = value
    return estimator, params_hpo_mlp