Source code for PermutationImportance.result

"""The ``ImportanceResult`` is an object which keeps track of the full context 
and scoring determined by a variable importance method. Because the variable 
importance methods iteratively determine the next most important variable, this
yields a sequence of pairs of "contexts" (i.e. the previous ranks/scores of 
variables) and "results" (i.e. the current ranks/scores of variables). This
object keeps track of those pairs and additionally provides methods for the easy
retrieve of both the results with empty context (singlepass, Breiman) and the
most complete context (multipass, Lakshmanan). Further, it enables iteration 
over the ``(context, results)`` pairs and for indexing into the list of pairs.
"""

import warnings

try:
    from itertools import izip as zip
except ImportError:  # python3
    pass

from .error_handling import FullImportanceResultWarning


[docs]class ImportanceResult(object): """Houses the result of any importance method, which consists of a sequence of contexts and results. An individual result can only be truly interpreted correctly in light of the corresponding context. This object allows for indexing into the contexts and results and also provides convenience methods for retrieving the results with no context and the most complete context"""
[docs] def __init__(self, method, variable_names, original_score): """Initializes the results object with the method used and a list of variable names :param method: string for the type of variable importance used :param variable_names: a list of names for variables :param original_score: the score of the model when no variables are important """ self.method = method self.variable_names = variable_names self.original_score = original_score # The initial context is "empty" self.contexts = [{}] self.results = list() self.complete = False
[docs] def add_new_results(self, new_results, next_important_variable=None): """Adds a new round of results. Warns if the ImportanceResult is already complete :param new_results: a dictionary with keys of variable names and values of ``(rank, score)`` :param next_important_variable: variable name of the next most important variable. If not given, will select the variable with the smallest rank """ if not self.complete: if next_important_variable is None: next_important_variable = min( new_results.keys(), key=lambda key: new_results[key][0]) self.results.append(new_results) new_context = self.contexts[-1].copy() self.contexts.append(new_context) __, score = new_results[next_important_variable] self.contexts[-1][next_important_variable] = ( len(self.results) - 1, score) # Check to see if this result could constitute the last possible one if len(self.results) == len(self.variable_names): self.results.append(dict()) self.complete = True else: warnings.warn( "Cannot add new result to full ImportanceResult", FullImportanceResultWarning)
[docs] def retrieve_singlepass(self): """Returns the singlepass results as a dictionary with keys of variable names and values of ``(rank, score)``.""" return self.results[0]
[docs] def retrieve_multipass(self): """Returns the multipass results as a dictionary with keys of variable names and values of ``(rank, score)``.""" return self.contexts[-1]
[docs] def __iter__(self): """Iterates over pairs of contexts and results""" return zip(self.contexts, self.results)
[docs] def __getitem__(self, index): """Retrieves the ith pair of ``(context, result)``""" if index < 0: index = len(self.results) + index return (self.contexts[index], self.results[index])
[docs] def __len__(self): """Returns the total number of results computed""" return len(self.results)