'Perform a replacement, insertion, or shrink mutation on an individual.
Parameters
individual: DEAP individual
A list of pipeline operators and model parameters that can be
compiled by DEAP into a callable function
Returns
mut_ind: DEAP individual
Returns the individual with one of the mutations applied to it'

@_pre_test
def _random_mutation_operator(self, individual):

    mutation_techniques = [partial(gp.mutInsert, pset=self._pset), partial(mutNodeReplacement, pset=self._pset), partial(gp.mutShrink)]
    return np.random.choice(mutation_techniques)(individual)
