def plot(self): self.pimp.table_for_comparison(self.evaluators, self.out_fn, style='latex') self.logger.info('Creating pimp latex table at %s' % self.out_fn) parameters = [p.name for p in self.cs.get_hyperparameters()] index, values, columns = [], [], [] columns = [e.name for e in self.evaluators] columns_lower = [c.lower() for c in columns] # SORT self.logger.debug("Sort pimp-table by %s" % self.sort_table_by) if self.sort_table_by == "average": # Sort parameters after average importance p_avg = {} for p in parameters: imps = [e.evaluated_parameter_importance[p] for e in self.evaluators if p in e.evaluated_parameter_importance] p_avg[p] = np.mean(imps) if imps else 0 p_order = sorted(parameters, key=lambda p: p_avg[p], reverse=True) elif self.sort_table_by in columns_lower: def __get_key(p): imp = self.evaluators[columns_lower.index(self.sort_table_by)].evaluated_parameter_importance return imp[p] if p in imp else 0 p_order = sorted(parameters, key=__get_key, reverse=True) else: raise ValueError("Trying to sort importance table after {}, which " "was not evaluated.".format(self.sort_table_by)) # PREPROCESS for p in p_order: values_for_p = [p] add_parameter = False # Only add parameters where at least one evaluator shows importance > threshold for e in self.evaluators: if p in e.evaluated_parameter_importance: # Check for threshold value_to_add = e.evaluated_parameter_importance[p] if value_to_add > self.threshold: add_parameter = True # All but forward-selection use values between 0 and 1 if e.name != 'Forward-Selection': value_to_add = value_to_add * 100 # Create string and add uncertainty, if available value_to_add = format(value_to_add, '05.2f') # (leading zeros for sorting!) if (hasattr(e, 'evaluated_parameter_importance_uncertainty') and p in e.evaluated_parameter_importance_uncertainty): value_to_add += ' +/- ' + format(e.evaluated_parameter_importance_uncertainty[p] * 100, '.2f') values_for_p.append(value_to_add) else: values_for_p.append('-') if add_parameter: values.append(values_for_p) # CREATE TABLE self.comp_table = DataFrame(values, columns=['Parameters'] + columns) sortable = {c : True for c in columns} width = {**{'Parameters' : 150}, **{c : 100 for c in columns}} bokeh_table = array_to_bokeh_table(self.comp_table, sortable=sortable, width=width, logger=self.logger) return bokeh_table
def test_array_to_bokeh_table(self): dataframe = DataFrame(self.rng.rand(2, 3), columns=[str(i) for i in range(3)]) self.assertTrue(isinstance(array_to_bokeh_table(dataframe), DataTable)) # Pass logger self.assertTrue( isinstance( array_to_bokeh_table(dataframe, logger=logging.getLogger('test')), DataTable)) # Pass sortable and width self.assertTrue( isinstance( array_to_bokeh_table(dataframe, sortable={ '1': True, '2': True }, width={ '1': 100, '0': 200 }), DataTable)) # Pass invalid specifications self.assertRaises(ValueError, array_to_bokeh_table, dataframe, sortable={ '7': True, '2': True }) self.assertRaises(ValueError, array_to_bokeh_table, dataframe, width={ '1': 100, 10: 200 })