# `Latu.ML.TrainValidationSplitModel`
[🔗](https://github.com/zero-one-group/latu_ml/blob/v0.4.2/lib/latu/ml/train_validation_split_model.ex#L1)

What a train/validation split found: the winning model, and one metric per param map.

`validation_metrics` is a single score per param map rather than a mean over folds, which is
the only real difference from `Latu.ML.CrossValidatorModel` — there is nothing to average, so
there is no standard deviation either.

`best_model` is refit on the whole frame, and `sub_models` is `nil` unless the search was
asked to `collect_sub_models: true`. `Latu.ML.delete/1` releases everything this holds.

# `t`

```elixir
@type t() :: %Latu.ML.TrainValidationSplitModel{
  best_model: Latu.ML.CrossValidatorModel.fitted(),
  owned: [Latu.ML.Model.t()] | nil,
  session: Latu.Session.t(),
  sub_models: [Latu.ML.CrossValidatorModel.fitted()] | nil,
  uid: String.t(),
  validation_metrics: [float()],
  validator: Latu.ML.TrainValidationSplit.t()
}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
