giskard-tests
Test ML models with Giskard's scan() vulnerability detector + test catalog (performance, robustness, fairness, data leakage, ethical issues) for tabular and NLP models. Wrap a prediction function in giskard.Model + a DataFrame in giskard.Dataset; emit test suites that pass/fail in CI. Use when a trained tabular or NLP model is about to ship with no test suite of its own, or when a feature-engineering or hyperparameter change needs a pre-merge scan for newly introduced vulnerabilities.
Install with skills.sh (any agent)
npx skills add testland/qa --skill giskard-testsgiskard-tests
Giskard wraps any prediction function and DataFrame, then runs a scan() that surfaces "performance biases, unrobustness, data leakage, stochasticity, underconfidence, ethical issues" per the Giskard tabular quickstart (opens in new window).
When to use
Step 1 - Install
pip install giskard --upgradePer the Giskard tabular quickstart (opens in new window).
Step 2 - Wrap the dataset
from giskard import Dataset
giskard_dataset = Dataset(
df=raw_data,
target=TARGET_COLUMN,
name="Titanic dataset",
cat_columns=CATEGORICAL_COLUMNS,
)cat_columns matters - Giskard treats categoricals differently for slicing + drift detection.
Step 3 - Wrap the model
from giskard import Model
import numpy as np
import pandas as pd
def prediction_function(df: pd.DataFrame) -> np.ndarray:
preprocessed_df = preprocessing_function(df)
return classifier.predict_proba(preprocessed_df)
giskard_model = Model(
model=prediction_function,
model_type="classification",
name="Titanic model",
classification_labels=classifier.classes_,
feature_names=FEATURE_NAMES,
)The prediction_function returns probabilities (not class labels) for classification - required by Giskard's calibration checks.
Step 4 - Scan for vulnerabilities
from giskard import scan
results = scan(giskard_model, giskard_dataset)
results.to_html("scan_report.html")Per the Giskard tabular quickstart (opens in new window), scan covers categories: performance bias, unrobustness, data leakage, stochasticity, underconfidence, ethical issues. HTML report is artifact-friendly for CI.
Step 5 - Generate a test suite from scan
test_suite = results.generate_test_suite("My first test suite")
suite_results = test_suite.run()
if not suite_results.passed:
raise SystemExit("Giskard test suite failed; see report")Step 6 - Add specific tests from catalog
from giskard import testing
test_suite.add_test(
testing.test_f1(
model=giskard_model,
dataset=giskard_dataset,
threshold=0.7,
)
)
# Slicing test: F1 must hold on a subset
female_slice = giskard_dataset.slice(lambda df: df[df.sex == "female"])
test_suite.add_test(
testing.test_f1(
model=giskard_model,
dataset=female_slice,
threshold=0.65,
)
)
test_suite.run()Catalog includes test_f1, test_accuracy, test_recall, test_drift_*, metamorphic transformations. Reference the Giskard tabular quickstart (opens in new window) for the current full list.
Step 7 - CI integration
- name: Giskard scan
run: |
python ml/giskard_scan.py
# Script raises SystemExit on failure
- name: Upload Giskard report
uses: actions/upload-artifact@v4
with:
name: giskard-report
path: scan_report.htmlAnti-patterns
| Anti-pattern | Why it fails | Fix |
|---|---|---|
Skip cat_columns parameter | Categorical features treated as numeric; bogus drift | Always pass cat_columns (Step 2) |
Wrap a predict() (classes) instead of predict_proba() (probs) | Calibration tests cannot run | Use predict_proba for classification (Step 3) |
| Run scan once, don't add to suite | One-off finding never re-checked | Generate suite from scan (Step 5); CI gates re-run |
| Block CI on every minor scan finding | Noise; team disables Giskard | Set per-test threshold; gate on critical+major only |
| Reuse training dataset for scan | False sense of robustness; scan needs unseen data | Use held-out test split |
Limitations
References
Related skills
alibi-explainability
Generates model explanations with Alibi Explain - Anchors, Integrated Gradients, Kernel/Tree SHAP, ALE, Counterfactual Instances. Wires explainer.fit + explainer.explain into model-evaluation pipelines so that every flagged prediction ships with a "why" record auditors can reason about. Use when a model decision must be explainable to an auditor, regulator, or affected user, or when a support team cannot answer why a specific prediction was made.
deepchecks-tests
Run Deepchecks suites (data integrity, train-test validation, model evaluation) on tabular / NLP / vision data + models. Pass `result.passed_conditions()` to CI to gate on regressions; the same checks run during research, CI, and production monitoring per the Deepchecks lifecycle posture. Use before training to catch train-test leakage and data-integrity defects in a tabular, NLP, or vision dataset, and to re-run the same suite on production samples to detect drift.
evidently-monitoring
Use Evidently OSS (100+ evaluation metrics, declarative testing API) to detect data drift, target drift, and model-performance regression, wired into CI as a gate (a Report run with include_tests) and into production monitoring as a continuous check; reports as HTML + JSON for both human review and pipeline assertions. Use when you need a drift or quality gate, or a scheduled monitoring job, for a tabular ML model. Built on the Evidently API specifically: for DeepChecks-based validation suites use deepchecks-tests instead.
fairlearn-fairness
Compute group fairness metrics (selection rate, demographic parity, equalized odds) per sensitive feature with `MetricFrame`, then mitigate disparities using Reductions algorithms (`ExponentiatedGradient` with constraint = `DemographicParity`/`EqualizedOdds`). Wire group-disaggregated assertions into the model-evaluation gate. Use when a model's decisions affect people and a stakeholder, auditor, or regulation (ECOA, GDPR Art. 22, EU AI Act high-risk) requires evidence of per-group outcomes, or when someone reports the model treats a specific group worse.
model-performance-regression-gate
Computes held-out metrics (accuracy, F1, AUC, RMSE) for a retrained model and compares them against the current production model, failing promotion when any metric regresses beyond a configured tolerance. Adds per-segment checks via Deepchecks WeakSegmentsPerformance so a model that improves globally but regresses on a key slice is still blocked. Use when a retrained model is a candidate for promotion and the CI pipeline must enforce a per-metric pass/fail gate before the artifact is pushed to the model registry.
model-risk-evidence-matrix
Assigns a machine learning model to a low, medium, or high risk tier from what its predictions decide about people, then derives the fairness and explainability evidence that tier must produce: group metrics per declared sensitive feature, intersectional breakdowns with per-cell counts, vulnerability scan categories, a drift monitoring plan, and per-prediction explanation logs. Supplies conventional demographic parity difference bands, a per-vulnerability-category blocking table, and evidence rules that mark a bundle incomplete or self-contradicting. Use when a model release candidate is up for promotion and someone must decide which fairness artifacts are mandatory rather than nice to have, or when a model card declares a risk tier and the attached evidence bundle has to be checked against what that tier demands.