File size: 2,643 Bytes
070061f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# Migrated and adapted from XAgent/Agent/answer.py for adult-only use
import pandas as pd
import os
import json
import matplotlib.pyplot as plt
import numpy as np
from xai_methods import (
    explain_with_shap, explain_with_dice, explain_with_anchor,
    explain_with_shap_advanced, explain_with_dtreeviz
)
from constraints import *

class Answers:
    def __init__(self, list_node, clf, clf_display, current_instance, question, l_exist_classes, l_exist_features,

                 l_instances, data, df_display_instance, predicted_class, preprocessor=None):
        self.list_node = list_node
        self.clf = clf
        self.clf_display = clf_display
        self.question = question
        self.current_instance = current_instance
        self.l_exist_classes = l_exist_classes
        self.l_exist_features = l_exist_features
        self.l_instances = l_instances
        self.l_classes = data['classes']
        self.l_features = data['features']
        self.data = data
        self.df_display_instance = df_display_instance
        self.predicted_class = predicted_class
        self.preprocessor = preprocessor

    def answer(self, intent, conversations=[], instance_df=None, **kwargs):
        """

        Route to the correct XAI method based on dynamic intent/label from NLU.

        intent: predicted label from NLU (e.g., 'predict', 'shap_explain', 'dice_explain', 'anchor_explain', 'cf_proto', 'shap_advanced', 'dtreeviz')

        """
        if intent == 'predict':
            return f"Based on your input, the predicted income is {self.predicted_class}."
        elif intent == 'shap_explain':
            return explain_with_shap(self)
        elif intent == 'dice_explain':
            return explain_with_dice(self)
        elif intent == 'anchor_explain':
            return explain_with_anchor(self)
        elif intent == 'cf_proto':
            # CounterfactualProto (alibi) removed; optionally replace with dice-ml or handle gracefully
            return None
        elif intent == 'shap_advanced':
            if instance_df is not None:
                return explain_with_shap_advanced(self, instance_df)
            else:
                return {'type': 'error', 'explanation': 'No instance provided for SHAP advanced.'}
        elif intent == 'dtreeviz':
            if instance_df is not None:
                return explain_with_dtreeviz(self, instance_df)
            else:
                return {'type': 'error', 'explanation': 'No instance provided for dtreeviz.'}
        else:
            return "Sorry, I can't answer that question yet."