Robert
Robert

Reputation: 73

LIME explanation with Watson Assistant on Python

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?

Upvotes: 0

Views: 52

Answers (0)

Related Questions