def build_with_ga(self, X, y): # accuracy fitness function def accuracy_fitness_function(chromosome): # decode the class model from gene aggregation, mus = _decode(self.m, X, y, self.aggregation_rules__, self.mu_factories, self.classes_, chromosome) y_pred = _predict(mus, aggregation, self.classes_, X) return 1.0 - accuracy_score(y, y_pred) # number of genes (2 for the aggregation, 4 for each attribute) n_genes = 2 + (self.m * 5 * len(self.classes_)) logger.info("initializing GA %d iterations" % (self.iterations, )) # initialize ga = GeneticAlgorithm( fitness_function=helper_fitness(accuracy_fitness_function), scaling=1.0, crossover_function=UniformCrossover(0.5), # crossover_points=range(2, n_genes, 5), elitism=5, # no elitism n_chromosomes=100, n_genes=n_genes, p_mutation=0.3, random_state=self.random_state) last_fitness = None # iternum = 0 for generation in range(self.iterations): ga.next() logger.info("GA iteration %d Fitness (top-4) %s" % (generation, str(np.sort(ga.fitness_)[:4]))) chromosomes, fitnesses = ga.best(10) aggregation, protos = _decode(self.m, X, y, self.aggregation_rules__, self.mu_factories, self.classes_, chromosomes[0]) self.aggregation = aggregation self.protos_ = protos # check stopping condition new_fitness = np.mean(fitnesses) if last_fitness is not None: d_fitness = last_fitness - new_fitness if self.epsilon is not None and d_fitness < self.epsilon: logger.info("Early stop d_fitness %f" % (d_fitness, )) break last_fitness = new_fitness iternum = iternum + 1 print("Iteration = ", iternum, "fitness = ", last_fitness) # print learned. logger.info("+- Final: Aggregation %s" % (str(self.aggregation), )) for key, value in self.protos_.items(): logger.info("`- Class-%d" % (key, )) logger.info("`- Membership-fs %s" % (str([x.__str__() for x in value]), ))
def build_for_class(self, X, y, class_idx): y_target = np.zeros(y.shape) # create the target of 1 and 0. y_target[class_idx] = 1.0 n_genes = 5 * self.m def rmse_fitness_function(chromosome): proto = self.decode(chromosome) y_pred = _predict_one(proto, self.aggregation, X) return mean_squared_error(y_target, y_pred) logger.info("initializing GA %d iterations" % (self.iterations, )) # initialize ga = GeneticAlgorithm( fitness_function=helper_fitness(rmse_fitness_function), scaling=1.0, crossover_function=UniformCrossover(0.5), # crossover_points=range(0, n_genes, 5), elitism=5, # no elitism n_chromosomes=100, n_genes=n_genes, p_mutation=0.3) # print "population", ga.population_ # print "fitness", ga.fitness_ chromosomes, fitnesses = ga.best(10) last_fitness = np.mean(fitnesses) proto = None # for generation in range(self.iterations): ga.next() logger.info("GA iteration %d Fitness (top-4) %s" % (generation, str(ga.fitness_[:4]))) chromosomes, fitnesses = ga.best(10) proto = self.decode(chromosomes[0]) # check stopping condition new_fitness = np.mean(fitnesses) d_fitness = last_fitness - new_fitness if self.epsilon is not None and d_fitness < self.epsilon: logger.info("Early stop d_fitness %f" % (d_fitness, )) break last_fitness = new_fitness return proto
def build_for_class(self, X, y, class_idx): # take column-wise min/mean/max for class mins = np.nanmin(X[class_idx], 0) means = np.nanmean(X[class_idx], 0) maxs = np.nanmax(X[class_idx], 0) ds = (maxs - mins) / 2.0 n_genes = 2 * self.m # adjustment for r and shrinking/expanding value for p/q B = np.ones(n_genes) def decode_with_shrinking_expanding(C): def dcenter(j): return min(1.0, max(0.0, C[j])) - 0.5 if self.adjust_center else 1.0 return [ fl.PiSet(r=means[j] * dcenter(j), p=means[j] - (ds[j] * C[j + 1]), q=means[j] + (ds[j] * C[j + 1])) for j in range(self.m) ] y_target = np.zeros(y.shape) # create the target of 1 and 0. y_target[class_idx] = 1.0 def rmse_fitness_function(chromosome): proto = decode_with_shrinking_expanding(chromosome) y_pred = _predict_one(proto, self.aggregation, X) return mean_squared_error(y_target, y_pred) logger.info("initializing GA %d iterations" % (self.iterations, )) # initialize ga = UnitIntervalGeneticAlgorithm( fitness_function=helper_fitness(rmse_fitness_function), crossover_function=UniformCrossover(0.5), elitism=3, n_chromosomes=100, n_genes=n_genes, p_mutation=0.3) ga = helper_n_generations(ga, self.iterations) chromosomes, fitnesses = ga.best(1) return decode_with_shrinking_expanding( chromosomes[0]), decode_with_shrinking_expanding(B)