Spaces:
Sleeping
Sleeping
| import sys | |
| import numpy as np | |
| from src.core.logger import logging | |
| from src.core.exception import AppException | |
| from src.app.monitoring.service_metrics import EXPLAINER_REQUEST_SUCCESS, EXPLAINER_REQUEST_FAILED | |
| class ExplainerService: | |
| def __init__(self, explainer, model_booster, vectorizer): | |
| """ | |
| Initializes an instance of LimeExplainer explaination service. | |
| Args: | |
| explainer (LimeTextExplainer) : An instance of LimeTextExplainer. | |
| model_booster (xgb.XGBClassifier) : An instance of the XGBoost model. | |
| vectorizer : An instance of the vectorizer to transform input text into numerical features. | |
| """ | |
| self.explainer = explainer | |
| self.booster = model_booster | |
| self.vectorizer = vectorizer | |
| def _get_prediction(self, text) -> np.ndarray: | |
| """ | |
| Internal function to get class probability scores for lime explainer. | |
| """ | |
| X = self.vectorizer.transform(text) | |
| prob = self.booster.inplace_predict(X) | |
| if len(prob.shape) == 1: | |
| prob = np.vstack([1 - prob, prob]).T | |
| return prob | |
| def explain(self, text: str): | |
| """ | |
| Generate an explanation of the prediction made by the model for a given text. | |
| Returns: | |
| HTML content of the explanation which is rendered in the UI | |
| """ | |
| try: | |
| explanation = self.explainer.explain_instance( | |
| text, | |
| self._get_prediction, | |
| num_features=10, | |
| num_samples=20 | |
| ) | |
| html_content = explanation.as_html() | |
| EXPLAINER_REQUEST_SUCCESS.inc() | |
| return html_content | |
| except Exception as e: | |
| EXPLAINER_REQUEST_FAILED.inc() | |
| logging.error(f"Explainer service failed: {e}", exc_info=True) | |
| raise AppException(e, sys) |