lime icon indicating copy to clipboard operation
lime copied to clipboard

How to use lime with 3 dim time series data and lstm

Open CynthiaLong opened this issue 1 year ago • 0 comments

Hi,

I am trying to use lime on my lstm model which is a classifier based on 3 dimensional numerical time series data (num_samples, num_time_length (varying depending on sample), num_features). Is there any existing method that can fits my model?

I modified code based on this tutorial. It seems that it only accepts string or bytes-like object.

code:

save_dir = './lstm_240324.pt'
model = torch.load(save_dir)
from lime.lime_text import LimeTextExplainer
class_names=['negative','positive']
explainer= LimeTextExplainer(class_names=class_names)
def predict_proba(arr):
    pred = model(arr.to(torch.float32))
    # print(pred.detach().numpy().shape)
    return pred.detach().numpy()
predict_proba(test_sentences[0]).shape

explainer.explain_instance(test_sentences[0].detach().numpy(), predict_proba).show_in_notebook(text=True)

error:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[17], line 1
----> 1 explainer.explain_instance(test_sentences[:1],predict_proba).show_in_notebook(text=True)

File E:\Anaconda\envs\lime_env\Lib\site-packages\lime\lime_text.py:409, in LimeTextExplainer.explain_instance(self, text_instance, classifier_fn, labels, top_labels, num_features, num_samples, distance_metric, model_regressor)
    368 def explain_instance(self,
    369                      text_instance,
    370                      classifier_fn,
   (...)
    375                      distance_metric='cosine',
    376                      model_regressor=None):
    377     """Generates explanations for a prediction.
    378 
    379     First, we generate neighborhood data by randomly hiding features from
   (...)
    403         explanations.
    404     """
    406     indexed_string = (IndexedCharacters(
    407         text_instance, bow=self.bow, mask_string=self.mask_string)
    408                       if self.char_level else
--> 409                       IndexedString(text_instance, bow=self.bow,
    410                                     split_expression=self.split_expression,
    411                                     mask_string=self.mask_string))
    412     domain_mapper = TextDomainMapper(indexed_string)
    413     data, yss, distances = self.__data_labels_distances(
    414         indexed_string, classifier_fn, num_samples,
    415         distance_metric=distance_metric)

File E:\Anaconda\envs\lime_env\Lib\site-packages\lime\lime_text.py:114, in IndexedString.__init__(self, raw_string, split_expression, bow, mask_string)
    110 else:
    111     # with the split_expression as a non-capturing group (?:), we don't need to filter out
    112     # the separator character from the split results.
    113     splitter = re.compile(r'(%s)|$' % split_expression)
--> 114     self.as_list = [s for s in splitter.split(self.raw) if s]
    115     non_word = splitter.match
    117 self.as_np = np.array(self.as_list)

TypeError: expected string or bytes-like object, got 'list'

Any suggestions are welcome. Thanks.

CynthiaLong avatar Apr 01 '24 06:04 CynthiaLong