This repository has been archived by the owner on Dec 18, 2023. It is now read-only.
/
pipeline_creator.py
91 lines (78 loc) · 2.96 KB
/
pipeline_creator.py
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"""
Classes responsible for programatically creating pipelines of evaluators
"""
import inspect
from collections import defaultdict
from typing import List
import credoai.evaluators
from connect.evidence import EvidenceRequirement
from connect.governance import Governance
from credoai.evaluators import *
from credoai.evaluators.utils import name2evaluator
from credoai.utils.common import remove_suffix
class PipelineCreator:
@staticmethod
def generate_all_evaluators():
all_evaluators = build_list_of_evaluators()
return all_evaluators
@staticmethod
def generate_from_governance(governance: Governance):
evidence_requirements = governance.get_evidence_requirements()
governance_pipeline = process_evidence_requirements(evidence_requirements)
return governance_pipeline
def process_evidence_requirements(evidence_requirements: List[EvidenceRequirement]):
evaluators = set()
kwargs: dict = defaultdict(dict)
for e in evidence_requirements:
labels = e.label
evaluator_name = labels.get("evaluator")
if evaluator_name is None:
continue
evaluators.add(evaluator_name)
if evaluator_name in ["ModelFairness", "Performance"]:
if "metrics" not in kwargs[evaluator_name]:
kwargs[evaluator_name]["metrics"] = extract_metrics(labels)
else:
kwargs[evaluator_name]["metrics"] |= extract_metrics(labels)
if evaluator_name == "FeatureDrift":
if "table_name" in labels:
if labels["table_name"] == "Characteristic Stability Index":
kwargs[evaluator_name]["csi_calculation"] = True
pipeline = []
for evaluator_name in evaluators:
evaltr_class = name2evaluator(evaluator_name)
evaltr_kwargs = kwargs.get(evaluator_name, {})
initialized_evaltr = evaltr_class(**evaltr_kwargs)
pipeline.append(initialized_evaltr)
return pipeline
def extract_metrics(labels):
"""Extract metrics from a single evidence requirement"""
metrics = set()
if "metric_type" in labels:
metrics.add(remove_suffix(labels["metric_type"], "_parity"))
elif "metric_types" in labels:
metrics = metrics.union(labels["metric_types"])
return metrics
def build_list_of_evaluators():
"""
Takes all the evaluator type objects available in Lens package
and converts them to a list of instantiated objects. Only
uses default values.
Returns
-------
List(Evaluator types)
List of instantiated evaluators
"""
all_evaluators = []
for x in dir(credoai.evaluators):
try:
evaluated = eval(x)
if (
inspect.isclass(evaluated)
and issubclass(evaluated, Evaluator)
and not inspect.isabstract(evaluated)
):
all_evaluators.append(evaluated)
except NameError:
pass
return [x() for x in all_evaluators]