Visualization in Python
To visualize the metrics API response, you can use the following Python code in a Jupyter notebook.
Classification Metrics
This example demonstrates how to plot both a confusion matrix and the performance metrics (e.g., accuracy, F1, precision, recall, specificity) over time.
First, we need to fetch the metrics for a specific time window.
import requests
url = f"http://{CLUSTER_IP}/metrics-server/api/v1/metrics/pipeline/classification"
params = {
'namespace': 'seldon',
'pipelineName': 'iris-model-pipeline',
'modelName': 'iris-model',
'startTime': '2025-02-25T11:51:22Z',
'endTime': '2025-02-25T11:53:22Z',
'interval': '10s'
}
response = requests.get(url, params=params)Expand to see an example of metrics API response
{
"metrics": [
{
"accuracy": 0,
"confusionMatrix": {
"categories": [
"Setosa",
"Versicolor",
"Virginica"
],
"computedConfusionValues": [
{
"falseNegativeCount": 10,
"falsePositiveCount": 0,
"trueNegativeCount": 0,
"truePositiveCount": 0
},
{
"falseNegativeCount": 0,
"falsePositiveCount": 10,
"trueNegativeCount": 0,
"truePositiveCount": 0
},
{
"falseNegativeCount": 0,
"falsePositiveCount": 0,
"trueNegativeCount": 10,
"truePositiveCount": 0
}
],
"values": [
0,
10,
0,
0,
0,
0,
0,
0,
0
]
},
"endTime": "2025-02-25T11:51:32Z",
"f1": 0,
"precision": 0,
"recall": 0,
"specificity": 0.5
},
{
"accuracy": 0,
"confusionMatrix": {
"categories": [
"Setosa",
"Versicolor",
"Virginica"
],
"computedConfusionValues": [
{
"falseNegativeCount": 16,
"falsePositiveCount": 0,
"trueNegativeCount": 0,
"truePositiveCount": 0
},
{
"falseNegativeCount": 0,
"falsePositiveCount": 16,
"trueNegativeCount": 0,
"truePositiveCount": 0
},
{
"falseNegativeCount": 0,
"falsePositiveCount": 0,
"trueNegativeCount": 16,
"truePositiveCount": 0
}
],
"values": [
0,
16,
0,
0,
0,
0,
0,
0,
0
]
},
"endTime": "2025-02-25T11:51:42Z",
"f1": 0,
"precision": 0,
"recall": 0,
"specificity": 0.5
},
{
"accuracy": 0.4375,
"confusionMatrix": {
"categories": [
"Setosa",
"Versicolor",
"Virginica"
],
"computedConfusionValues": [
{
"falseNegativeCount": 9,
"falsePositiveCount": 0,
"trueNegativeCount": 7,
"truePositiveCount": 0
},
{
"falseNegativeCount": 0,
"falsePositiveCount": 9,
"trueNegativeCount": 0,
"truePositiveCount": 7
},
{
"falseNegativeCount": 0,
"falsePositiveCount": 0,
"trueNegativeCount": 16,
"truePositiveCount": 0
}
],
"values": [
0,
9,
0,
0,
7,
0,
0,
0,
0
]
},
"endTime": "2025-02-25T11:51:52Z",
"f1": 0.46666667,
"precision": 0.4375,
"recall": 0.5,
"specificity": 0.6666667
},
{
"accuracy": 0.125,
"confusionMatrix": {
"categories": [
"Setosa",
"Versicolor",
"Virginica"
],
"computedConfusionValues": [
{
"falseNegativeCount": 2,
"falsePositiveCount": 0,
"trueNegativeCount": 6,
"truePositiveCount": 0
},
{
"falseNegativeCount": 0,
"falsePositiveCount": 7,
"trueNegativeCount": 0,
"truePositiveCount": 1
},
{
"falseNegativeCount": 5,
"falsePositiveCount": 0,
"trueNegativeCount": 3,
"truePositiveCount": 0
}
],
"values": [
0,
2,
0,
0,
1,
0,
0,
5,
0
]
},
"endTime": "2025-02-25T11:52:02Z",
"f1": 0.18181819,
"precision": 0.125,
"recall": 0.33333334,
"specificity": 0.6666667
},
{
"accuracy": -1,
"confusionMatrix": {
"categories": [],
"computedConfusionValues": [],
"values": []
},
"endTime": "2025-02-25T11:52:12Z",
"f1": -1,
"precision": -1,
"recall": -1,
"specificity": -1
},
{
"accuracy": -1,
"confusionMatrix": {
"categories": [],
"computedConfusionValues": [],
"values": []
},
"endTime": "2025-02-25T11:52:22Z",
"f1": -1,
"precision": -1,
"recall": -1,
"specificity": -1
},
{
"accuracy": -1,
"confusionMatrix": {
"categories": [],
"computedConfusionValues": [],
"values": []
},
"endTime": "2025-02-25T11:52:32Z",
"f1": -1,
"precision": -1,
"recall": -1,
"specificity": -1
},
{
"accuracy": -1,
"confusionMatrix": {
"categories": [],
"computedConfusionValues": [],
"values": []
},
"endTime": "2025-02-25T11:52:42Z",
"f1": -1,
"precision": -1,
"recall": -1,
"specificity": -1
},
{
"accuracy": -1,
"confusionMatrix": {
"categories": [],
"computedConfusionValues": [],
"values": []
},
"endTime": "2025-02-25T11:52:52Z",
"f1": -1,
"precision": -1,
"recall": -1,
"specificity": -1
},
{
"accuracy": -1,
"confusionMatrix": {
"categories": [],
"computedConfusionValues": [],
"values": []
},
"endTime": "2025-02-25T11:53:02Z",
"f1": -1,
"precision": -1,
"recall": -1,
"specificity": -1
},
{
"accuracy": -1,
"confusionMatrix": {
"categories": [],
"computedConfusionValues": [],
"values": []
},
"endTime": "2025-02-25T11:53:12Z",
"f1": -1,
"precision": -1,
"recall": -1,
"specificity": -1
},
{
"accuracy": -1,
"confusionMatrix": {
"categories": [],
"computedConfusionValues": [],
"values": []
},
"endTime": "2025-02-25T11:53:22Z",
"f1": -1,
"precision": -1,
"recall": -1,
"specificity": -1
}
]
}Next, we can build a confusion matrix for the selected time bucket. For more details on time bucketing, refer to the "Calculating Metrics" page.

Finally, we can plot the Accuracy, Precision, Recall, F1, and Specificity metrics over time.

Regression Metrics
This example demonstrates how to plot such performance metrics as Mean Absolute Error, Mean Squared Error, Root Mean Squared Error over time.
Let's fetch the metrics over specific time window first.
Finally, we can plot the Mean Absolute Error, Mean Squared Error, Root Mean Squared Error over time.

Last updated
Was this helpful?
