Skip to content

Conversation

@kevinmessiaen
Copy link
Member

Description

Put all BaseMode.meta fields into @property methods

Related Issue

GSK-1957

Type of Change

  • 📚 Examples / docs / tutorials / dependencies update
  • 🔧 Bug fix (non-breaking change which fixes an issue)
  • 🥂 Improvement (non-breaking change which improves an existing feature)
  • 🚀 New feature (non-breaking change which adds functionality)
  • 💥 Breaking change (fix or feature that would cause existing functionality to change)
  • 🔐 Security fix

Checklist

  • I've read the CODE_OF_CONDUCT.md document.
  • I've read the CONTRIBUTING.md guide.
  • I've updated the code style using make codestyle.
  • I've written tests for all new methods and classes that I created.
  • I've written the docstring in Google format for all the methods and classes that I used.
Copy link
Contributor

@rabah-khalek rabah-khalek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: can we also propagate the change to the other daughter classes?

python-client/giskard/models/huggingface.py
255:            return [[p[label] for label in self.meta.classification_labels] for p in _predictions]

python-client/giskard/models/langchain.py
62:            model_type=self.meta.model_type,
67:            classification_threshold=self.meta.classification_threshold,
68:            classification_labels=self.meta.classification_labels,

python-client/giskard/models/base/wrapper.py
176:        if raw_predictions.shape[-1] != len(self.meta.classification_labels):
179:                f"where `n_classes` is the number of classes in your model output ({len(self.meta.classification_labels)} in this case)."

and all of these occurrences?

python-client/tests/test_statistical.py
22:        classification_label=model.meta.classification_labels[label],
46:        classification_label=model.meta.classification_labels[label],
69:        classification_label=model.meta.classification_labels[label],

python-client/tests/models/test_sklearn_wrapper.py
25:        gsk_model.meta.model_type = "unknown"

python-client/tests/models/test_model_postprocess.py
14:    model.meta = meta

python-client/tests/models/test_model_explanation.py
41:        for label in model.meta.classification_labels:

python-client/tests/models/test_catboost_wrapper.py
26:    assert model.meta.feature_names == ["feature_1", "feature_2"]
27:    assert model.meta.classification_labels == ["target1", "target2"]

python-client/tests/scan/test_overconfidence_detector.py
27:    model.meta.classification_labels = ["A", "B", "C"]

python-client/tests/scan/test_scanner.py
68:    german_credit_model.meta.feature_names = None

python-client/tests/scan/test_underconfidence_detector.py
27:    model.meta.classification_labels = ["A", "B", "C"]

python-client/tests/integrations/test_mlflow.py
20:        model_type=mlflow_model_types[model.meta.model_type],
60:    evaluator_config = {"model_config": {"classification_labels": model.meta.classification_labels}}
69:    evaluator_config = {"model_config": {"classification_labels": model.meta.classification_labels}}
98:    cl = model.meta.classification_labels

python-client/tests/test_metamorphic_direction.py
50:        classification_label=model.meta.classification_labels[0],
69:        classification_label=model.meta.classification_labels[0],

python-client/tests/test_upload.py
72:                model_type=model.meta.model_type,
75:                classification_labels=model.meta.classification_labels,
84:                    model_type=model.meta.model_type,
85:                    feature_names=model.meta.feature_names,

python-client/giskard/ml_worker/websocket/utils.py
271:    if i.type == "Model" and i.model_meta is not None:
272:        return ModelInput(i.name, i.model_meta.model_type)

python-client/giskard/llm/talk/talk.py
62:        required_features = set() if self.model.meta.feature_names is None else set(self.model.meta.feature_names)
202:            name=self.spec.model.meta.name,
203:            model_type=self.spec.model.meta.model_type,
204:            feature_names=self.spec.model.meta.feature_names,
205:            classification_threshold=self.spec.model.meta.classification_threshold,
206:            classification_labels=self.spec.model.meta.classification_labels,

python-client/giskard/core/model_validation.py
39:    model_type = model.meta.model_type
47:    validate_classification_labels(model.meta.classification_labels, model_type)
50:        validate_classification_threshold_label(model.meta.classification_labels, model.meta.classification_threshold)
52:    assert model.meta.feature_names is None or isinstance(
53:        model.meta.feature_names, list
58:        validate_features(feature_names=model.meta.feature_names, validate_df=validate_ds.df)
67:                model.meta.name, model.meta.classification_labels, target_values, validate_ds.target
73:        if model.meta.model_type == SupportedModelTypes.CLASSIFICATION and validate_ds.target is not None:
89:        features = model.meta.feature_names if model.meta.feature_names is not None else validation_ds.df.columns
125:    validate_prediction_output(validation_ds, model.meta.model_type, prediction.raw)
127:        validate_classification_prediction(model.meta.classification_labels, prediction.raw)
153:            with open(f + "/giskard-model-meta.yaml") as yaml_f:
314:    num_classes = len(model.meta.classification_labels)

python-client/giskard/ml_worker/websocket/listener.py
255:    labels = {k: v for k, v in enumerate(model.meta.classification_labels)}
257:    if len(model.meta.classification_labels) > 2 or model.meta.classification_threshold is None:
265:        diff = prediction_results.all_predictions.iloc[:, 1] - model.meta.classification_threshold
419:    if model.meta.feature_names:
420:        input_df = input_df[model.meta.feature_names]
422:    map_features_weight = dict(zip(model.meta.classification_labels, list_weights))

python-client/giskard/ml_worker/testing/utils.py
29:            and isinstance(model.meta.classification_labels[0], numbers.Number)
41:                f'{model.meta.classification_labels} and not the target: "{target}". '
46:            model.meta.model_type != SupportedModelTypes.CLASSIFICATION
47:            or classification_label in model.meta.classification_labels
48:        ), f'"{classification_label}" is not part of model labels: {model.meta.classification_labels}'

python-client/giskard/utils/analytics_collector.py
59:        [anonymize(n) for n in model.meta.feature_names]
60:        if model.meta.feature_names
66:        "model_type": model.meta.model_type.value,

python-client/giskard/models/model_explanation.py
71:    features_names = model.meta.feature_names
200:    feature_names = model.meta.feature_names or list(dataset.df.columns.drop(dataset.target, errors="ignore"))
204:    return ShapResult(shap_explanations, feature_types, model.meta.model_type, only_highest_proba)
229:    feature_names = model.meta.feature_names or list(dataset.df.columns.drop(dataset.target, errors="ignore"))
237:            class_names=model.meta.classification_labels,
240:        raise ValueError(f"Prediction task is not supported: {model.meta.model_type}")

python-client/giskard/models/_precooked.py
50:            model.meta.model_type,
51:            model.meta.feature_names,
52:            model.meta.classification_labels,

python-client/giskard/models/base/model.py
31:META_FILENAME = "giskard-model-meta.yaml"
382:                client.save_model_meta(project_key, self.id, self.meta, platform.python_version(), get_size(f))
409:            meta_response = client.load_model_meta(project_key, model_id)

python-client/giskard/testing/tests/statistic.py
153:        raise ValueError(f"Prediction task is not supported: {model.meta.model_type}")
238:    if isinstance(model.meta.classification_labels[0], numbers.Number):
244:    if positive_outcome not in list(model.meta.classification_labels):
246:            f"The positive outcome chosen {positive_outcome} is not part of the dataset target values {list(model.meta.classification_labels)}."

python-client/giskard/integrations/mlflow/giskard_evaluator_utils.py
34:    module = pyfunc_model.metadata.flavors["python_function"]["loader_module"]
37:        return flavor.load_model(pyfunc_model.metadata.get_model_info().model_uri)

python-client/giskard/testing/tests/performance.py
51:    is_binary_classification = len(model.meta.classification_labels) == 2
55:        metric = score_fn(targets, prediction, pos_label=model.meta.classification_labels[1])
215:    if len(model.meta.classification_labels) == 2:

python-client/giskard/testing/tests/metamorphic.py
186:    passed_idx, failed_idx = _compare_prediction(results_df, model.meta.model_type, direction, output_sensitivity)
432:        _, failed_idx = _compare_prediction(result_df, model.meta.model_type, direction, None)

python-client/giskard/testing/tests/drift.py
796:    if classification_label is not None and isinstance(model.meta.classification_labels[0], numbers.Number):
892:    if classification_label is not None and isinstance(model.meta.classification_labels[0], numbers.Number):

python-client/giskard/testing/tests/calibration.py
19:    label2id = {label: n for n, label in enumerate(model.meta.classification_labels)}
31:    n = len(model.meta.classification_labels)

python-client/giskard/push/perturbation.py
261:    if model.meta.model_type == SupportedModelTypes.CLASSIFICATION:
270:    elif model.meta.model_type == SupportedModelTypes.REGRESSION:

python-client/giskard/push/contribution.py
40:    if model.meta.model_type == SupportedModelTypes.CLASSIFICATION:
48:    elif model.meta.model_type == SupportedModelTypes.REGRESSION:
80:        model_type=model.meta.model_type,
110:    if model.meta.model_type == SupportedModelTypes.CLASSIFICATION:
124:            model_type=model.meta.model_type,
257:    if model.meta.model_type == SupportedModelTypes.CLASSIFICATION:
258:        return explain(model, ds, df.iloc[0])["explanations"][model.meta.classification_labels[0]]
259:    elif model.meta.model_type == SupportedModelTypes.REGRESSION:

python-client/giskard/scanner/scanner.py
77:        num_features = len(model.meta.feature_names) if model.meta.feature_names else len(dataset.columns)
91:        detectors = self.get_detectors(tags=[model.meta.model_type.value])
188:            raise ValueError(f"Dataset must be provided for {model.meta.model_type.value} models.")

python-client/giskard/scanner/issues.py
105:        return self.model.meta.feature_names or self.dataset.columns.tolist()

python-client/giskard/scanner/robustness/base_detector.py
40:        if model.meta.feature_names:
41:            features = [f for f in features if f in model.meta.feature_names]

python-client/giskard/scanner/correlation/spurious_correlation_detector.py
27:        features = model.meta.feature_names or dataset.columns.drop(dataset.target, errors="ignore")

python-client/giskard/scanner/common/examples.py
50:                num_labels_to_print = min(len(issue.model.meta.classification_labels), int(with_prediction))
55:                        "\n".join([f"{issue.model.meta.classification_labels[i]} (p = {ps[i]:.2f})" for i in label_idx])

python-client/giskard/scanner/common/loss_based_detector.py
41:        max_data_size = self.MAX_DATASET_SIZE // len(model.meta.feature_names or dataset.columns)
78:        features = model.meta.feature_names or dataset.columns.drop(dataset.target, errors="ignore")

python-client/giskard/scanner/performance/metrics.py
81:                labels=model.meta.classification_labels,
82:                pos_label=model.meta.classification_labels[1],
86:        return metric_fn(y_true, y_pred, labels=model.meta.classification_labels, average="micro")
97:            neg = model.meta.classification_labels[0]
111:            return (y_pred == model.meta.classification_labels[1]).sum()
123:            return (y_true == model.meta.classification_labels[1]).sum()
140:            y_true, y_score, multi_class="ovo", labels=model.meta.classification_labels

python-client/giskard/scanner/performance/performance_bias_detector.py
86:                    metrics.log_loss([true_label], [probs], labels=model.meta.classification_labels)
@kevinmessiaen kevinmessiaen force-pushed the feature/gsk-1957-put-all-the-modelmeta-fields-into-properties branch from 7cf09e0 to a5c636b Compare January 4, 2024 06:51
Copy link
Contributor

@rabah-khalek rabah-khalek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@rabah-khalek rabah-khalek merged commit 3e257bb into main Jan 5, 2024
@rabah-khalek rabah-khalek deleted the feature/gsk-1957-put-all-the-modelmeta-fields-into-properties branch January 5, 2024 13:46
andreybavt added a commit that referenced this pull request Jan 8, 2024
* Put all `BaseMode.meta` fields into `@property` methods

* Moved model.meta.property to model.property

* Moved model.meta.property to model.property

* Import reorganization

---------

Co-authored-by: Andrey Avtomonov <andreybavt@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

4 participants