Beispiel #1
0
def check_oversamplers_classifiers(oversamplers, classifiers, random_state,
                                   n_runs):
    """Extract estimators and parameters grids."""

    # Create random states
    random_states = check_random_states(random_state, n_runs)

    # Create estimators and parameter grids
    estimators, param_grids = [], []
    for oversampler, classifier in product(oversamplers, classifiers):

        # Unpack oversamplers and classifiers
        ovs_name, ovs, ovs_param_grid = oversampler
        clf_name, clf, clf_param_grid = classifier
        if ovs is None:
            ovs = FunctionTransformer()

        # Create estimator
        name = f'{ovs_name}|{clf_name}'
        ovs_steps = ovs.steps if isinstance(ovs, Pipeline) else [(ovs_name,
                                                                  ovs)]
        clf_steps = clf.steps if isinstance(clf, Pipeline) else [(clf_name,
                                                                  clf)]
        steps = ovs_steps + clf_steps
        estimators.append((name, Pipeline(steps)))

        # Create parameter grid
        ovs_prefix = f'{name}' if isinstance(
            ovs, Pipeline) else f'{name}__{ovs_name}'
        ovs_param_grid = [{
            f'{ovs_prefix}__{param}': val
            for param, val in param_grid.items()
        } for param_grid in ParameterGrid(ovs_param_grid)]
        clf_prefix = f'{name}' if isinstance(
            clf, Pipeline) else f'{name}__{clf_name}'
        clf_param_grid = [{
            f'{clf_prefix}__{param}': val
            for param, val in param_grid.items()
        } for param_grid in ParameterGrid(clf_param_grid)]
        combinations = product(ovs_param_grid, clf_param_grid, random_states)
        for param_grid1, param_grid2, random_state in combinations:
            param_grid1.update(param_grid2)
            param_grid = {'est_name': [name]}
            for param in ovs.get_params().keys():
                if 'random_state' in param:
                    param_grid.update(
                        {f'{ovs_prefix}__{param}': [random_state]})
            for param in clf.get_params().keys():
                if 'random_state' in param:
                    param_grid.update(
                        {f'{clf_prefix}__{param}': [random_state]})
            param_grid.update(
                {param: [val]
                 for param, val in param_grid1.items()})
            param_grids.append(param_grid)

    return estimators, param_grids