LIME explanation with Watson Assistant on Python

35 Views Asked by At

I'm trying to use Watson Assistant predictions on LIME for explanation model. Is that work or just with sickit-learn models?

def get_watson_assistant_response(text=''):
    print(text)
    response = assistant.message_stateless(
        input={
            'message_type': 'text',
            'text': text,
            'options': {'alternate_intents': True }
        },
        assistant_id='xxx').get_result()

    return response['output']['intents'] 

text_to_explain = "Gostaria de fazer uma transferência"

watson_response = get_watson_assistant_response(text_to_explain)
watson_response

OUTPUT: 
[{'intent': 'xxa', 'confidence': 0.3107834756374359},
 {'intent': 'xxb', 'confidence': 0.15369020402431488},
 {'intent': 'xxc', 'confidence': 0.15228083729743958},
 {'intent': 'xxd', 'confidence': 0.13980790972709656}]

And the using the LIME library from python:

classes = []
for i in watson_response:
    classes.append(i['intent'])

explainer = LimeTextExplainer(class_names=classes)

explanation = explainer.explain_instance(
    text_to_explain,
    classifier_fn=get_watson_assistant_response(text_to_explain)
)

But there is an error:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[61], line 5
      2 explainer = LimeTextExplainer(class_names=classes)
      4 # Gera uma explicação para o modelo de classificação
----> 5 explanation = explainer.explain_instance(
      6     text_to_explain,
      7     get_watson_assistant_response(text=text_to_explain),
      8 )
     10 # # Imprime a explicação
     11 # # print('Texto original:', text_to_explain)
     12 # # print('Classificação do Watson Assistant:', watson_response)
     13 # # print('\nExplicação LIME:')
     14 # # for i in range(len(explanation.as_list())):
     15 # #     print(explanation.as_list()[i])

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/lime/lime_text.py:413, in LimeTextExplainer.explain_instance(self, text_instance, classifier_fn, labels, top_labels, num_features, num_samples, distance_metric, model_regressor)
    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)
    416 if self.class_names is None:
    417     self.class_names = [str(x) for x in range(yss[0].shape[0])]

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/lime/lime_text.py:482, in LimeTextExplainer.__data_labels_distances(self, indexed_string, classifier_fn, num_samples, distance_metric)
    480     data[i, inactive] = 0
    481     inverse_data.append(indexed_string.inverse_removing(inactive))
--> 482 labels = classifier_fn(inverse_data)
    483 distances = distance_fn(sp.sparse.csr_matrix(data))
    484 return data, labels, distances

TypeError: 'list' object is not callable

On the documentation, I did not understand if LIME could be used just with scikit-learn models, is it?

0

There are 0 best solutions below