{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.rtemis.org/hyperparameters/lightrf/v1/schema.json",
  "title": "rtemis LightRFHyperparameters",
  "description": "LightGBM random forest. See `setup_LightRF`.",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "nrounds": {
      "oneOf": [
        {
          "type": "integer",
          "minimum": 1
        },
        {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1
          },
          "minItems": 1,
          "description": "Tuning search values."
        }
      ],
      "default": 500,
      "description": "Number of boosting rounds (trees)."
    },
    "num_leaves": {
      "oneOf": [
        {
          "type": "integer",
          "minimum": 1
        },
        {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1
          },
          "minItems": 1,
          "description": "Tuning search values."
        }
      ],
      "default": 4096,
      "description": "Maximum number of leaves per tree."
    },
    "max_depth": {
      "oneOf": [
        {
          "type": "integer"
        },
        {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "minItems": 1,
          "description": "Tuning search values."
        }
      ],
      "default": -1,
      "description": "Maximum tree depth. -1 = no limit."
    },
    "feature_fraction": {
      "oneOf": [
        {
          "type": "number",
          "maximum": 1,
          "exclusiveMinimum": 0
        },
        {
          "type": "array",
          "items": {
            "type": "number",
            "maximum": 1,
            "exclusiveMinimum": 0
          },
          "minItems": 1,
          "description": "Tuning search values."
        }
      ],
      "default": 0.7,
      "description": "Fraction of features sampled per tree."
    },
    "subsample": {
      "oneOf": [
        {
          "type": "number",
          "maximum": 1,
          "exclusiveMinimum": 0
        },
        {
          "type": "array",
          "items": {
            "type": "number",
            "maximum": 1,
            "exclusiveMinimum": 0
          },
          "minItems": 1,
          "description": "Tuning search values."
        }
      ],
      "default": 0.623,
      "description": "Fraction of cases sampled per tree (bagging fraction)."
    },
    "lambda_l1": {
      "oneOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "array",
          "items": {
            "type": "number",
            "minimum": 0
          },
          "minItems": 1,
          "description": "Tuning search values."
        }
      ],
      "default": 0,
      "description": "L1 regularization."
    },
    "lambda_l2": {
      "oneOf": [
        {
          "type": "number",
          "minimum": 0
        },
        {
          "type": "array",
          "items": {
            "type": "number",
            "minimum": 0
          },
          "minItems": 1,
          "description": "Tuning search values."
        }
      ],
      "default": 0,
      "description": "L2 regularization."
    },
    "max_cat_threshold": {
      "oneOf": [
        {
          "type": "integer",
          "minimum": 1
        },
        {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1
          },
          "minItems": 1,
          "description": "Tuning search values."
        }
      ],
      "default": 32,
      "description": "Maximum number of split points for categorical features."
    },
    "min_data_per_group": {
      "oneOf": [
        {
          "type": "integer",
          "minimum": 1
        },
        {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1
          },
          "minItems": 1,
          "description": "Tuning search values."
        }
      ],
      "default": 32,
      "description": "Minimum number of cases per categorical group."
    },
    "linear_tree": {
      "oneOf": [
        {
          "type": "boolean"
        },
        {
          "type": "array",
          "items": {
            "type": "boolean"
          },
          "minItems": 1,
          "description": "Tuning search values."
        }
      ],
      "default": false,
      "description": "Fit linear models at leaves."
    },
    "ifw": {
      "oneOf": [
        {
          "type": "boolean"
        },
        {
          "type": "array",
          "items": {
            "type": "boolean"
          },
          "minItems": 1,
          "description": "Tuning search values."
        }
      ],
      "default": false,
      "description": "Inverse frequency weighting of outcome classes."
    },
    "objective": {
      "type": ["string", "null"],
      "default": null,
      "description": "LightGBM objective. NULL = set from outcome type."
    },
    "device_type": {
      "type": "string",
      "enum": ["cpu", "gpu", "cuda"],
      "default": "cpu",
      "description": "Compute device."
    },
    "tree_learner": {
      "type": "string",
      "enum": ["serial", "feature", "data", "voting"],
      "default": "serial",
      "description": "Tree learner type."
    },
    "force_col_wise": {
      "type": "boolean",
      "default": true,
      "description": "Force column-wise histogram building (CPU only)."
    }
  }
}
