Custom Check Templates#

This page supplies templates for the different types of custom checks that you can create using the deepchecks package. For more information on custom checks, please see the :doc:`Custom Check Guide. </user-guide/vision/auto_tutorials/plot_custom_checks>`__

Templates:

Single Dataset Check#

Check type for cases when running on a single dataset and optional model, for example integrity checks. When in suite if 2 datasets are supplied it will run on both independently.

from deepchecks.core import CheckResult, ConditionCategory, ConditionResult, DatasetKind
from deepchecks.vision import SingleDatasetCheck, Context, VisionData, Batch


class SingleDatasetCustomCheck(SingleDatasetCheck):
    """Description of the check. The name of the check will be the class name split by upper case letters."""

    # OPTIONAL: we can add different properties in the init
    def __init__(self, prop_a: str, prop_b: str, **kwargs):
        super().__init__(**kwargs)
        self.prop_a = prop_a
        self.prop_b = prop_b

    def initialize_run(self, context: Context, dataset_kind: DatasetKind):
        # Initialize cache
        self.cache = {}
        # OPTIONAL: add validations on inputs and properties like prop_a and prop_b

    def update(self, context: Context, batch: Batch, dataset_kind: DatasetKind):
        # Get the VisionData by its type (train/test)
        dataset: VisionData = context.get_data_by_kind(dataset_kind)
        # Take from the batch the data I need it and save it on the cache
        batch_data_dict = some_calc_on_batch(batch, dataset)
        # Save the data on the cache
        self.cache.update(batch_data_dict)

    def compute(self, context: Context, dataset_kind: DatasetKind) -> CheckResult:
        # LOGIC HERE
        failing_samples = some_calc_on_cache(self.cache, self.prop_a, self.prop_b)

        # Define result value: Adding any info that we might want to know later
        result = {
            'ratio': len(failing_samples) / len(self.cache),
            'indices': failing_samples.keys()
        }

        # Define result display: list of either plotly-figure/dataframe/html
        display = None

        return CheckResult(result, display=display)

    # OPTIONAL: add condition to check
    def add_condition_ratio_less_than(self, threshold: float = 0.01):
        # Define condition function: the function accepts as input the result value we defined in the run_logic
        def condition(result):
            ratio = result['ratio']
            category = ConditionCategory.PASS if ratio < threshold else ConditionCategory.FAIL
            message = f'Found X ratio of {ratio}'
            return ConditionResult(category, message)

        # Define the name of the condition
        name = f'Custom check ratio is less than {threshold}'
        # Now add it on the class instance
        return self.add_condition(name, condition)

Train Test Check#

Check type for cases when running on two datasets and optional model, for example drift checks.

from deepchecks.core import CheckResult, ConditionCategory, ConditionResult, DatasetKind
from deepchecks.vision import TrainTestCheck, Context, VisionData, Batch


class SingleDatasetCustomCheck(TrainTestCheck):
    """Description of the check. The name of the check will be the class name split by upper case letters."""

    # OPTIONAL: we can add different properties in the init
    def __init__(self, prop_a: str, prop_b: str, **kwargs):
        super().__init__(**kwargs)
        self.prop_a = prop_a
        self.prop_b = prop_b

    def initialize_run(self, context: Context):
        # Initialize cache
        self.cache = {
            DatasetKind.TRAIN: {},
            DatasetKind.TEST: {}
        }
        # OPTIONAL: add validations on inputs and properties like prop_a and prop_b

    def update(self, context: Context, batch: Batch, dataset_kind: DatasetKind):
        # Get the VisionData by its type (train/test)
        dataset: VisionData = context.get_data_by_kind(dataset_kind)
        # Take from the batch the data I need it and save it on the cache
        batch_data_dict = some_calc_on_batch(batch, dataset)
        # Save the data on the cache
        self.cache[dataset_kind].update(batch_data_dict)

    def compute(self, context: Context) -> CheckResult:
        # Get the VisionData
        train_vision_data: VisionData = context.train
        test_vision_data: VisionData = context.test

        # LOGIC HERE
        failing_samples = some_calc_on_cache(self.cache, self.prop_a, self.prop_b)

        # Define result value: Adding any info that we might want to know later
        result = {
            'ratio': len(failing_samples) / len(self.cache),
            'indices': failing_samples.keys()
        }

        # Define result display: list of either plotly-figure/dataframe/html
        display = None

        return CheckResult(result, display=display)

    # OPTIONAL: add condition to check
    def add_condition_ratio_less_than(self, threshold: float = 0.01):
        # Define condition function: the function accepts as input the result value we defined in the run_logic
        def condition(result):
            ratio = result['ratio']
            category = ConditionCategory.PASS if ratio < threshold else ConditionCategory.FAIL
            message = f'Found X ratio of {ratio}'
            return ConditionResult(category, message)

        # Define the name of the condition
        name = f'Custom check ratio is less than {threshold}'
        # Now add it on the class instance
        return self.add_condition(name, condition)

Model Only Check#

Check type for cases when running only on a model, for example model parameters check.

from deepchecks.core import CheckResult, ConditionCategory, ConditionResult
from deepchecks.vision import ModelOnlyCheck, Context


class ModelOnlyCustomCheck(ModelOnlyCheck):
    """Description of the check. The name of the check will be the class name split by upper case letters."""

    # OPTIONAL: we can add different properties in the init
    def __init__(self, prop_a: str, prop_b: str, **kwargs):
        super().__init__(**kwargs)
        self.prop_a = prop_a
        self.prop_b = prop_b

    def compute(self, context: Context) -> CheckResult:
        # Get the model
        model = context.model

        # LOGIC HERE - possible to add validations on inputs and properties like prop_a and prop_b
        some_score = some_calc_fn(model, self.prop_a, self.prop_b)

        # Define result value: Adding any info that we might want to know later
        result = some_score

        # Define result display: list of either plotly-figure/dataframe/html, or Nothing if we have no display
        display = None

        return CheckResult(result, display=display)

    # OPTIONAL: add condition to check
    def add_condition_score_more_than(self, threshold: float = 1):
        # Define condition function: the function accepts as input the result value we defined in the run_logic
        def condition(result):
            category = ConditionCategory.PASS if result > 1 else ConditionCategory.FAIL
            message = f'Found X score of {result}'
            return ConditionResult(category, message)

        # Define the name of the condition
        name = f'Custom check score is more than {threshold}'
        # Now add it on the class instance
        return self.add_condition(name, condition)