예제 #1
0
    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
예제 #2
0
 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
                       })