Query Quickstart#

To access information about a model’s performance, drift, bias, or other enabled enrichments, write a query object and submit it with the Arthur SDK using arthur_model.query(query)

For a general overview of this endpoint, including a more thorough descriptions of its rules, power, and customizability, see the Endpoint Overview page.

In each of the following examples, let our model be a binary classifier, and let GT1 and PRED1 be the names of our model’s grouth truth attribute and predicted value, respectively.

Accuracy#

This is usually the simplest way to check for classifier performance. We can fetch a model’s accuracy rate by querying a select on the function accuracyRate using the typical threshold 0.5.

Given the following query:

GT1 = 'gt_isFraud'
PRED1 = 'pred_isFraud'

query = {
    "select": [
        {
            "function": "accuracyRate",
            "parameters": 
                {
                    "threshold" : 0.5,
                    "ground_truth_property" : GT1,
                    "predicted_property" : PRED1
                }
        }
    ]
}
query_result = arthur_model.query(query)

The query_result will be:

[{'accuracyRate': 0.999026947368421}]

Accuracy by batch#

To expand the accuracy query by batch, add the batch_id property to the query’s select, and add a group_by to the query using batch_id.

Given the following query:

GT1 = 'gt_isFraud'
PRED1 = 'pred_isFraud'

query = {
    "select": [
        {
            "function": "accuracyRate",
            "parameters": 
                {
                    "threshold" : 0.5,
                    "ground_truth_property" : GT1,
                    "predicted_property" : PRED1
                }
        },
        {
            "property": "batch_id"
        }
    ],
    "group_by": [
        {
            "property": "batch_id"
        }
    ]
}
query_result = arthur_model.query(query)

The query_result will be:

[{'accuracyRate': 0.999704, 'batch_id': 'newbatch3'},
 {'accuracyRate': 0.999744, 'batch_id': 'newbatch0'},
 {'accuracyRate': 0.992952, 'batch_id': 'newbatch19'},
 {'accuracyRate': 0.999616, 'batch_id': 'newbatch5'},
 {'accuracyRate': 0.999144, 'batch_id': 'newbatch6'},
 ...]

Batch IDs#

Querying accuracy by batch includes the batch_id values in the query result. But to query the batch_ids on their own, only select and group_by the batch_id.

Given the following query:

query = {
    "select": [
        {
            "property": "batch_id"
        }
    ],
    "group_by": [
        {
            "property": "batch_id"
        }
    ]
}

query_result = arthur_model.query(query)

The query_result will be:

[{'batch_id': 'newbatch19'},
 {'batch_id': 'newbatch18'},
 {'batch_id': 'newbatch13'},
 {'batch_id': 'newbatch12'},
 {'batch_id': 'newbatch16'},
...]

Accuracy (single batch)#

To query the accuracy for only one batch, add a filter to the query according to the rule batch_id == BATCHNAME

Given the following query (for a specified batch name):

GT1 = 'gt_isFraud'
PRED1 = 'pred_isFraud'
BATCHNAME = "newbatch19"

query = {
    "select": [
        {
            "function": "accuracyRate",
            "parameters": 
                {
                    "threshold" : 0.5,
                    "ground_truth_property" : GT1,
                    "predicted_property" : PRED1
                }
        },
        {
            "property": "batch_id"
        }
    ],
    "group_by": [
        {
            "property": "batch_id"
        }
    ],
    "filter": [
        {
            "property": "batch_id",
            "comparator": "eq",
            "value": BATCHNAME
        }
    ]
}
query_result = arthur_model.query(query)

The query_result will be:

[{'accuracyRate': 0.992952, 'batch_id': 'newbatch19'}]

Confusion Matrix#

A confusion matrix counts the number of true positive, true negative, false positive, and false negative classifications; knowing these values is usually more useful than just accuracy when it is time to improve your model.

To query a confusion matrix, we use the confusionMatrix function in our query’s select.

Note

For the confusionMatrix function, the ground_truth_property and predicted_property parameters are optional.

Given the following query:

query = {
    "select": [
        {
            "function": "confusionMatrix",
            "parameters": 
                {
                    "threshold" : 0.5
                }
        }
    ]
}
query_result = arthur_model.query(query)

The query_result will be:

[{'confusionMatrix': 
 {'false_negative': 4622,
  'false_positive': 0,
  'true_negative': 4745195,
  'true_positive': 183}}]

Confusion Matrix (single batch)#

As we did with accuracy, to get a confusion matrix for a single batch we add the property batch_id to the query’s select, add a group_by using batch_id, and then add a filter according to the rule batch_id == BATCHNAME

Given the following query (for a specified batch name):

BATCHNAME = 'newbatch19'

query = {
    "select": [
        {
            "function": "confusionMatrix",
            "parameters": 
                {
                    "threshold" : 0.5
                }
        },
        {
            "property": "batch_id"
        }
    ],
    "group_by": [
        {
            "property": "batch_id"
        }
    ],
    "filter": [
        {
            "property": "batch_id",
            "comparator": "eq",
            "value": BATCHNAME
        }
    ]
}
query_result = arthur_model.query(query)

The query_result will be:

[{'batch_id': 'newbatch19',
  'confusionMatrix': 
 {'false_negative': 1762,
  'false_positive': 0,
  'true_negative': 248238,
  'true_positive': 0}}]

Confusion Matrix (by group)#

Instead of querying for metrics and grouping by batch, we can group by other groupings as well. Here, we use the model’s non-input attribute race so that we can compare model performance across different demographics. To do this, we add the group name race to our query’s select and to its group_by

Given the following query:

GROUP = 'race'

query = {
    "select": [
        {
            "function": "confusionMatrix",
            "parameters": {
                "threshold" : 0.5
            }
        },
        {
            "property": GROUP
        }
    ],
    "group_by": [
        {
            "property": GROUP
        }
    ]
}
query_result = arthur_model.query(query)

The query_result will be:

[{'confusionMatrix': {'false_negative': 1162,
   'false_positive': 0,
   'true_negative': 1184707,
   'true_positive': 44},
  'race': 'hispanic'},
 {'confusionMatrix': {'false_negative': 1145,
   'false_positive': 0,
   'true_negative': 1186659,
   'true_positive': 49},
  'race': 'asian'},
 {'confusionMatrix': {'false_negative': 1137,
   'false_positive': 0,
   'true_negative': 1187500,
   'true_positive': 38},
  'race': 'black'},
 {'confusionMatrix': {'false_negative': 1178,
   'false_positive': 0,
   'true_negative': 1186329,
   'true_positive': 52},
  'race': 'white'}]

Predictions#

Here we aren’t querying any metrics - we are just accessing all the predictions that have output by the model.

Given the following query:

PRED1 = 'pred_isFraud'
query = {
    "select": [
        {
            "property": PRED1
        }
    ]
}
query_result = arthur_model.query(query)

The query_result will be:

[{'pred_isFraud_1': 0.005990342859493804},
 {'pred_isFraud_1': 0.02271116879043313},
 {'pred_isFraud_1': 0.15305224676085477},
 {'pred_isFraud_1': 0},
 {'pred_isFraud_1': 0.03280797449330532},
...]

Predictions (average)#

To only query the average value across all these predictions (since querying all predictions and then averaging locally can be slow for production-sized query results), we only need to add the avg function to our query’s select, with our predicted value PRED1 now being a parameter of avg instead of a property we directly select.

Given the following query:

PRED1 = 'pred_isFraud'
query = {
    "select": [
        {
            "function": "avg",
            "parameters": {
                "property": PRED1
            }
        }
    ]
}
query_result = arthur_model.query(query)

The query_result will be:

[{'avg': 0.016030786000398464}]

Predictions (average over time)#

To get the average predictions on each day, we add the function roundTimestamp to our select using a time_interval of day - this groups the timestamp information according to day instead of options like hour or week. Then, we add a group_by to the query using the alias (DAY) specified in the roundTimestamp function.

Given the following query:

PRED1 = 'pred_isFraud'
query = {
    "select": [
        {
            "function": "avg",
            "parameters": {
                "property": PRED1
            }
        },
        {
            "function": "roundTimestamp",
            "alias": "DAY",
            "parameters": {
                "property": "inference_timestamp",
                "time_interval": "day"
            }
        }
    ],
    "group_by": [
        {
            "alias": "DAY"
        }
    ]
}
query_result = arthur_model.query(query)

The query_result will be:

[{'avg': 0.016030786000359423, 'DAY': '2022-07-11T00:00:00Z'},
 {'avg': 0.018723459201003300, 'DAY': '2022-07-12T00:00:00Z'},
 {'avg': 0.014009919280009284, 'DAY': '2022-07-13T00:00:00Z'},
 {'avg': 0.016663649020394829, 'DAY': '2022-07-14T00:00:00Z'},
 {'avg': 0.017791902929210039, 'DAY': '2022-07-15T00:00:00Z'},
 ...]