def choose_models_with_recall(models_df, group_min_recalls, labels_col='label',
                              recall_col='recall', algorithm_col='algorithm',
                              hyperparameters_col='hyperparameters'):
    """
    Selects algorithm and hyperparameters of best model for a specific
    recall value for each review group according to user input.

    Parameters
    ==========
    models_df : pd.DataFrame
        Dataframe where each row contains information about the best hyperparameters
        for each group and each value of recall evaluated in the ML pipeline.
    group_min_recalls : dict
        Dictionary where keys=review group labels and values=minimum value of recall.
    labels_col : str
        Name of column corresponding to review group labels in models_df.
    recall_col : str
        Name of column corresponding to recall value in models_df.
    algorithm_col : str
        Name of column corresponding to algorithm in models_df.
    hyperparameters_col : str
        Name of column corresponding to hyperparameters in models_df.

    Returns
    =======
    best_models : dict
        Dictionary where key=review group and value=dictionary with best algorithm
        and hyperparameters for that group and specified minimum recall value.
    """

    best_models = {}

    # grab best model hyperparameters for specified value of recall for each label
    for label in group_min_recalls:

        # initialize new dict to store hyperparameters
        best_model = {}

        best_model['algorithm'] = models_df[(models_df[labels_col]==label) & (models_df[recall_col]==group_min_recalls[label])][algorithm_col].values[0]
        best_model['hyperparameters'] = models_df[(models_df[labels_col]==label) & (models_df[recall_col]==group_min_recalls[label])][hyperparameters_col].values[0]

        best_models[label] = best_model

    return best_models