{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.rtemis.org/classificationmetrics/v1/schema.json",
  "title": "rtemis ClassificationMetrics",
  "description": "Classification metrics for one sample: the confusion matrix in long form (one row per cell), overall metrics, and per-class metrics. Which overall columns are present depends on the task, so only the invariant ones are required.",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "sample": {
      "type": ["string", "null"],
      "enum": [
        "Training",
        "Validation",
        "Test",
        "Calibrated Training",
        "Calibrated Validation",
        "Calibrated Test",
        null
      ],
      "description": "Sample the metrics describe.",
      "readOnly": true,
      "x-rtemis": {
        "type": "string",
        "role": "state"
      }
    },
    "confusion_long": {
      "type": ["array", "null"],
      "items": {
        "type": "object",
        "properties": {
          "reference": {
            "type": "string",
            "description": "True outcome level.",
            "x-rtemis": {
              "type": "string"
            }
          },
          "predicted": {
            "type": "string",
            "description": "Predicted outcome level.",
            "x-rtemis": {
              "type": "string"
            }
          },
          "n": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of cases.",
            "x-rtemis": {
              "type": "integer"
            }
          }
        },
        "additionalProperties": false,
        "required": ["reference", "predicted", "n"]
      },
      "description": "Confusion matrix, one row per cell.",
      "readOnly": true,
      "x-rtemis": {
        "type": "object",
        "role": "state",
        "container": "table"
      }
    },
    "metrics": {
      "type": ["object", "null"],
      "properties": {
        "overall": {
          "type": ["array", "null"],
          "items": {
            "type": "object",
            "properties": {
              "balanced_accuracy": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "f1": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "accuracy": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "sensitivity": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "specificity": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "ppv": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "npv": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "auc": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "brier_score": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              }
            },
            "additionalProperties": false,
            "required": ["balanced_accuracy", "f1", "accuracy"]
          },
          "description": "Overall metrics, one row.",
          "x-rtemis": {
            "type": "object",
            "container": "table"
          }
        },
        "class": {
          "type": ["array", "null"],
          "items": {
            "type": "object",
            "properties": {
              "level": {
                "type": ["string", "null"],
                "x-rtemis": {
                  "type": "string"
                }
              },
              "sensitivity": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "specificity": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "balanced_accuracy": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "ppv": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "npv": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              },
              "f1": {
                "type": ["number", "null"],
                "minimum": 0,
                "maximum": 1,
                "x-rtemis": {
                  "type": "number"
                }
              }
            },
            "additionalProperties": false,
            "required": ["level", "sensitivity", "specificity", "balanced_accuracy", "ppv", "npv", "f1"]
          },
          "description": "Per-class metrics, one row per outcome level.",
          "x-rtemis": {
            "type": "object",
            "container": "table"
          }
        },
        "positive_class": {
          "type": ["string", "null"],
          "description": "Outcome level treated as positive.",
          "x-rtemis": {
            "type": "string"
          }
        }
      },
      "additionalProperties": false,
      "required": ["overall", "class"],
      "description": "Classification metrics.",
      "readOnly": true,
      "x-rtemis": {
        "type": "object",
        "role": "state",
        "container": "struct"
      }
    }
  }
}
