def test_anchor_text(): skmodel = SKLearnServer(MOVIE_MODEL_URI) skmodel.load() movies = fetch_movie_sentiment() anchor_text = AnchorText(skmodel.predict, None) np.random.seed(0) explanation = anchor_text.explain(movies.data[4:5]) exp_json = json.loads(explanation.to_json()) assert exp_json["meta"]["name"] == "AnchorText"
def test_anchor_text(): os.environ.clear() skmodel = SKLearnModel("adult", MOVIE_MODEL_URI) skmodel.load() predictor = Predictor(skmodel) anchor_text = AnchorText(predictor.predict_fn, None) movies = fetch_movie_sentiment() np.random.seed(0) explanation = anchor_text.explain(movies.data[4:5]) exp_json = json.loads(explanation.to_json()) print(exp_json["data"]["anchor"])
def test_anchor_text(): os.environ.clear() skmodel = SKLearnServer(MOVIE_MODEL_URI) skmodel.load() movies = fetch_movie_sentiment() anchor_text = AnchorText(skmodel.predict, None) np.random.seed(0) explanation = anchor_text.explain(movies.data[4:5]) exp_json = json.loads(explanation.to_json()) print(exp_json["data"]["anchor"])
def __init__(self, name: str, predictor_host: str, method: ExplainerMethod, config: Mapping, explainer: object = None, protocol: Protocol = Protocol.seldon_grpc, tf_data_type: str = None, keras_model: keras.Model = None): super().__init__(name) self.predictor_host = predictor_host logging.info("Predict URL set to %s", self.predictor_host) self.method = method self.protocol = protocol self.tf_data_type = tf_data_type logging.info("Protocol is %s", str(self.protocol)) # Add type for first value to help pass mypy type checks if self.method is ExplainerMethod.anchor_tabular: self.wrapper: ExplainerWrapper = AnchorTabular( self._predict_fn, explainer, **config) elif self.method is ExplainerMethod.anchor_images: self.wrapper = AnchorImages(self._predict_fn, explainer, **config) elif self.method is ExplainerMethod.anchor_text: self.wrapper = AnchorText(self._predict_fn, explainer, **config) elif self.method is ExplainerMethod.kernel_shap: self.wrapper = KernelShap(self._predict_fn, explainer, **config) elif self.method is ExplainerMethod.integrated_gradients: self.wrapper = IntegratedGradients(keras_model, **config) elif self.method is ExplainerMethod.tree_shap: self.wrapper = TreeShap(explainer, **config) else: raise NotImplementedError
class AlibiExplainer(kfserving.KFModel): def __init__(self, name: str, predictor_host: str, protocol: Protocol, method: ExplainerMethod, config: Mapping, explainer: object = None): super().__init__(name) self.protocol = protocol if self.protocol == Protocol.tensorflow_http: self.predict_url = PREDICTOR_URL_FORMAT.format(predictor_host, name) else: self.predict_url = SELDON_PREDICTOR_URL_FORMAT.format(predictor_host) logging.info("Predict URL set to %s", self.predict_url) self.method = method if self.method is ExplainerMethod.anchor_tabular: self.wrapper = AnchorTabular(self._predict_fn, explainer, **config) elif self.method is ExplainerMethod.anchor_images: self.wrapper = AnchorImages(self._predict_fn, explainer, **config) elif self.method is ExplainerMethod.anchor_text: self.wrapper = AnchorText(self._predict_fn, explainer, **config) else: raise NotImplementedError def load(self): pass def _predict_fn(self, arr: Union[np.ndarray, List]) -> np.ndarray: if self.protocol == Protocol.seldon_http: resp = SeldonRequestHandler.predict(arr, self.predict_url) return np.array(resp) elif self.protocol == Protocol.tensorflow_http: inputs = [] for req_data in arr: if isinstance(req_data, np.ndarray): inputs.append(req_data.tolist()) else: inputs.append(str(req_data)) resp = TensorflowRequestHandler.predict(inputs, self.predict_url) return np.array(resp) else: raise NotImplementedError def explain(self, inputs: List) -> Any: if self.method is ExplainerMethod.anchor_tabular or self.method is ExplainerMethod.anchor_images or self.method is ExplainerMethod.anchor_text: explanation = self.wrapper.explain(inputs) logging.info("Explanation: %s", explanation) return json.loads(json.dumps(explanation, cls=NumpyEncoder)) else: raise NotImplementedError
def __init__( # pylint:disable=too-many-arguments self, name: str, predictor_host: str, method: ExplainerMethod, config: Mapping, explainer: object = None, ): super().__init__(name) self.predictor_host = predictor_host logging.info("Predict URL set to %s", self.predictor_host) self.method = method if self.method is ExplainerMethod.anchor_tabular: self.wrapper: ExplainerWrapper = AnchorTabular( self._predict_fn, explainer, **config) elif self.method is ExplainerMethod.anchor_images: self.wrapper = AnchorImages(self._predict_fn, explainer, **config) elif self.method is ExplainerMethod.anchor_text: self.wrapper = AnchorText(self._predict_fn, explainer, **config) else: raise NotImplementedError
class AlibiExplainer(kserve.Model): def __init__( # pylint:disable=too-many-arguments self, name: str, predictor_host: str, method: ExplainerMethod, config: Mapping, explainer: object = None, ): super().__init__(name) self.predictor_host = predictor_host logging.info("Predict URL set to %s", self.predictor_host) self.method = method if self.method is ExplainerMethod.anchor_tabular: self.wrapper: ExplainerWrapper = AnchorTabular( self._predict_fn, explainer, **config ) elif self.method is ExplainerMethod.anchor_images: self.wrapper = AnchorImages(self._predict_fn, explainer, **config) elif self.method is ExplainerMethod.anchor_text: self.wrapper = AnchorText(self._predict_fn, explainer, **config) else: raise NotImplementedError def load(self) -> bool: pass def _predict_fn(self, arr: Union[np.ndarray, List]) -> np.ndarray: instances = [] for req_data in arr: if isinstance(req_data, np.ndarray): instances.append(req_data.tolist()) else: instances.append(req_data) loop = asyncio.get_running_loop() # type: ignore resp = loop.run_until_complete(self.predict({"instances": instances})) return np.array(resp["predictions"]) def explain(self, request: Dict) -> Any: if ( self.method is ExplainerMethod.anchor_tabular or self.method is ExplainerMethod.anchor_images or self.method is ExplainerMethod.anchor_text ): explanation = self.wrapper.explain(request["instances"]) explanationAsJsonStr = explanation.to_json() logging.info("Explanation: %s", explanationAsJsonStr) return json.loads(explanationAsJsonStr) raise NotImplementedError
def __init__(self, name: str, predictor_host: str, protocol: Protocol, method: ExplainerMethod, config: Mapping, explainer: object = None): super().__init__(name) self.protocol = protocol if self.protocol == Protocol.tensorflow_http: self.predict_url = PREDICTOR_URL_FORMAT.format(predictor_host, name) else: self.predict_url = SELDON_PREDICTOR_URL_FORMAT.format(predictor_host) logging.info("Predict URL set to %s", self.predict_url) self.method = method if self.method is ExplainerMethod.anchor_tabular: self.wrapper = AnchorTabular(self._predict_fn, explainer, **config) elif self.method is ExplainerMethod.anchor_images: self.wrapper = AnchorImages(self._predict_fn, explainer, **config) elif self.method is ExplainerMethod.anchor_text: self.wrapper = AnchorText(self._predict_fn, explainer, **config) else: raise NotImplementedError