# Evaluate a model

Model / evaluate

performance metrics, confusion matrix, ROC, lift, cross-validation

Page: <https://meridian.online/operations/evaluate-a-model>

## Status

Runs as a SQL step.

arcform carries it as a `sql:` step today.

## The DuckDB step

a confusion matrix and accuracy from predictions

```sql
CREATE TEMP TABLE scored AS SELECT * FROM (VALUES ('y','y'),('y','n'),('n','n'),('n','n'),('y','y'),('n','y')) t(actual, predicted);
SELECT actual, predicted, count(*) AS n FROM scored GROUP BY ALL ORDER BY ALL;
CREATE TEMP TABLE result AS
SELECT round(avg((actual = predicted)::INT), 3) AS accuracy,
       round(count(*) FILTER (WHERE actual = 'y' AND predicted = 'y') / count(*) FILTER (WHERE predicted = 'y'), 3) AS precision_y,
       round(count(*) FILTER (WHERE actual = 'y' AND predicted = 'y') / count(*) FILTER (WHERE actual = 'y'), 3) AS recall_y
FROM scored;
SELECT * FROM result;
SELECT CASE WHEN ((SELECT accuracy = 0.667 AND precision_y = 0.667 AND recall_y = 0.667 FROM result)) THEN 'as expected' ELSE error('four right of six did not give 0.667') END AS verdict;
```

The statement builds its own data.

It needs nothing installed beyond DuckDB itself.

## Variants

- Time a model: Measure how long a model takes to train, read data or predict.
- [Evaluate a clustering](https://meridian.online/operations/evaluate-a-model/evaluate-a-clustering): Score a clustering by density, distance, entropy or agreement with known labels.
- Combine performance results: Average, weight or convert several performance results into one result or a table.
- [Draw ROC and lift curves](https://meridian.online/operations/evaluate-a-model/draw-roc-and-lift-curves): Rank rows by score and report gain, lift or ROC points at each cut-off.
- Backtest a forecast: Validate a forecasting model over sliding windows or holdout periods of a time series.
- Compute performance metrics: Compare actual and predicted values to give accuracy, error measures or a confusion matrix.
- [Cross-validate a model](https://meridian.online/operations/evaluate-a-model/cross-validate-a-model): Train and test a model repeatedly over folds, hold-out splits or bootstrap samples and pool the scores.
- Read the evaluation made in training: Return the out-of-bag, validation or per-iteration metrics recorded while the model trained.

## What other tools call it

Meridian's classification; an independent blind rating agreed on 86.2% of 312 rows (exact class, version 2).

- Alteryx Designer: [`Cross-Validation`](https://help.alteryx.com/current/en/designer/tools/predictive/cross-validation-tool.html) (read 2026-09-27)
- Alteryx Designer: [`K-Centroids Diagnostics`](https://help.alteryx.com/current/en/designer/tools/predictive-grouping/k-centroids-diagnostics-tool.html) (read 2026-09-27)
- Alteryx Designer: [`Lift Chart`](https://help.alteryx.com/current/en/designer/tools/predictive/lift-chart-tool.html) (read 2026-09-27)
- Alteryx Designer: [`Model Comparison`](https://help.alteryx.com/current/en/designer/tools/predictive/model-comparison-tool.html) (read 2026-09-27)
- Alteryx Designer: [`TS Compare`](https://help.alteryx.com/current/en/designer/tools/time-series/ts-compare-tool.html) (read 2026-09-27)
- KNIME Analytics Platform: [`Enrichment Plotter (legacy)`](https://api.hub.knime.com/nodes/*GxxcUkRZEsQRVicB?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`Entropy Scorer`](https://api.hub.knime.com/nodes/*ViVacy0amF1ou_Oq?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`KNIME Giskard Extension (extension)`](https://api.hub.knime.com/extensions/org.knime.python.features.giskard) (read 2026-09-27)
- KNIME Analytics Platform: [`Lift Chart (JavaScript) (legacy)`](https://api.hub.knime.com/nodes/*QKVni78elpxYcMm0?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`Lift Chart (legacy)`](https://api.hub.knime.com/nodes/*4DFM_cH5wpBaPN9o?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`Numeric Scorer`](https://api.hub.knime.com/nodes/*ZqcMbr00jkoQ1av4?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`ROC Curve`](https://api.hub.knime.com/nodes/*fXnxzvmq51oIA9Ou?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`ROC Curve (JavaScript) (legacy)`](https://api.hub.knime.com/nodes/*OKRvXgFKIQmsm76N?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`ROC Curve (legacy)`](https://api.hub.knime.com/nodes/*e3rnMYIl5BZphzl1?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`Scorer`](https://api.hub.knime.com/nodes/*5tsiYT6vDKM7YChN?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`X-Aggregator`](https://api.hub.knime.com/nodes/*AwzC_JyEuicS9pXC?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`X-Partitioner`](https://api.hub.knime.com/nodes/*BKpS2Ow-rnvw2TSf?details=full) (read 2026-09-27)
- mlpack: [`Cross-validation`](https://www.mlpack.org/doc/user/cv.html) (read 2026-09-27)
- mlpack: [`Performance measures`](https://www.mlpack.org/doc/user/cv.html) (read 2026-09-27)
- RapidMiner Studio: [`Average`](https://docs.rapidminer.com/latest/studio/operators/utility/process_control/collections/average.html) (read 2026-09-27)
- RapidMiner Studio: [`Bootstrapping Validation`](https://docs.rapidminer.com/latest/studio/operators/validation/bootstrapping_validation.html) (read 2026-09-27)
- RapidMiner Studio: [`Cluster Count Performance`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/segmentation/cluster_count_performance.html) (read 2026-09-27)
- RapidMiner Studio: [`Cluster Density Performance`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/segmentation/cluster_density_performance.html) (read 2026-09-27)
- RapidMiner Studio: [`Cluster Distance Performance`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/segmentation/cluster_distance_performance.html) (read 2026-09-27)
- RapidMiner Studio: [`Combine Performances`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/combine_performances.html) (read 2026-09-27)
- RapidMiner Studio: [`Compare ROCs`](https://docs.rapidminer.com/latest/studio/operators/validation/visual/compare_rocs.html) (read 2026-09-27)
- RapidMiner Studio: [`Create Lift Chart`](https://docs.rapidminer.com/latest/studio/operators/validation/visual/create_lift_chart.html) (read 2026-09-27)
- RapidMiner Studio: [`Cross Validation`](https://docs.rapidminer.com/latest/studio/operators/validation/cross_validation.html) (read 2026-09-27)
- RapidMiner Studio: [`Extract Performance`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/extract_performance.html) (read 2026-09-27)
- RapidMiner Studio: [`Forecast Validation`](https://docs.rapidminer.com/latest/studio/operators/modeling/time_series/validation/forecast_validation.html) (read 2026-09-27)
- RapidMiner Studio: [`Item Distribution Performance`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/segmentation/item_distribution_performance.html) (read 2026-09-27)
- RapidMiner Studio: [`Lift Chart (Simple)`](https://docs.rapidminer.com/latest/studio/operators/validation/visual/lift_chart.html) (read 2026-09-27)
- RapidMiner Studio: [`Map Clustering on Labels`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/segmentation/map_clustering_on_labels.html) (read 2026-09-27)
- RapidMiner Studio: [`Multi Horizon Performance`](https://docs.rapidminer.com/latest/studio/operators/modeling/time_series/validation/multi_horizon_performance_evaluator.html) (read 2026-09-27)
- RapidMiner Studio: [`Multi Label Performance`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/multi_label_performance_evaluator.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/performance.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance (AUPRC)`](https://docs.rapidminer.com/latest/studio/operators/extensions/Operator%20Toolbox/performance/performance_auprc.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance (Attribute Count)`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/predictive/performance_attribute_count.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance (Binominal Classification)`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/predictive/performance_binominal_classification.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance (Classification)`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/predictive/performance_classification.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance (Costs)`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/predictive/performance_costs.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance (Min-Max)`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/performance_min_max.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance (Ranking)`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/predictive/performance_ranking.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance (Regression)`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/predictive/performance_regression.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance (Support Vector Count)`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/predictive/performance_support_vector_count.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance (User-Based)`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/performance_user_based.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance Average (Robust)`](https://docs.rapidminer.com/latest/studio/operators/utility/process_control/collections/robust_performance_average.html) (read 2026-09-27)
- RapidMiner Studio: [`Performance to Data`](https://docs.rapidminer.com/latest/studio/operators/validation/performance/performance_to_data.html) (read 2026-09-27)
- RapidMiner Studio: [`Sliding Window Validation`](https://docs.rapidminer.com/latest/studio/operators/modeling/time_series/validation/sliding_window_validation.html) (read 2026-09-27)
- RapidMiner Studio: [`Split Validation`](https://docs.rapidminer.com/latest/studio/operators/validation/split_validation.html) (read 2026-09-27)
- RapidMiner Studio: [`Wrapper Split Validation`](https://docs.rapidminer.com/latest/studio/operators/validation/wrapper_split_validation.html) (read 2026-09-27)
- RapidMiner Studio: [`Wrapper-X-Validation`](https://docs.rapidminer.com/latest/studio/operators/validation/wrapper_x_validation.html) (read 2026-09-27)
- Yggdrasil Decision Forests: [`Evaluation`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/port/python/ydf/metric/metric.py) (read 2026-09-27)
- Yggdrasil Decision Forests: [`Go benchmark_inference`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/port/go/cli/benchmark_inference/benchmark_inference.go) (read 2026-09-27)
- Yggdrasil Decision Forests: [`benchmark`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/port/python/ydf/model/generic_model.py) (read 2026-09-27)
- Yggdrasil Decision Forests: [`benchmark_inference`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/cli/benchmark_inference.cc) (read 2026-09-27)
- Yggdrasil Decision Forests: [`benchmark_training`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/cli/monitoring/benchmark_training.cc) (read 2026-09-27)
- Yggdrasil Decision Forests: [`compare_benchmark`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/cli/monitoring/compare_benchmark.py) (read 2026-09-27)
- Yggdrasil Decision Forests: [`cross_validation`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/port/python/ydf/learner/generic_learner.py) (read 2026-09-27)
- Yggdrasil Decision Forests: [`evaluate`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/port/python/ydf/model/generic_model.py) (read 2026-09-27)
- Yggdrasil Decision Forests: [`evaluate`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/cli/evaluate.cc) (read 2026-09-27)
- Yggdrasil Decision Forests: [`evaluate_predictions`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/port/python/ydf/metric/evaluate.py) (read 2026-09-27)
- Yggdrasil Decision Forests: [`out_of_bag_evaluations`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/port/python/ydf/model/random_forest_model/random_forest_model.py) (read 2026-09-27)
- Yggdrasil Decision Forests: [`self_evaluation`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/port/python/ydf/model/generic_model.py) (read 2026-09-27)
- Yggdrasil Decision Forests: [`training_logs`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/port/python/ydf/model/generic_model.py) (read 2026-09-27)
- Yggdrasil Decision Forests: [`validation_loss / validation_evaluation`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/port/python/ydf/model/gradient_boosted_trees_model/gradient_boosted_trees_model.py) (read 2026-09-27)
- Yggdrasil Decision Forests: [`ydf.internal.benchmark_io_speed`](https://github.com/google/yggdrasil-decision-forests/blob/0a54b57c95ff0cf42ecf0310ace0513a4f32cb65/yggdrasil_decision_forests/port/python/ydf/monitoring/benchmark_io_speed.py) (read 2026-09-27)
