Skip to content

Visualization

uncertainty_flow.viz

Interactive visualization dashboard for uncertainty analysis.

launch_dashboard(model, data, target=None, port=8050, title=None)

Launch interactive Streamlit dashboard for uncertainty exploration.

Provides visualizations for calibration, prediction intervals, residual analysis, feature-uncertainty relationships, and more.

Parameters

model : BaseUncertaintyModel Fitted uncertainty model with predict() method data : pl.DataFrame Dataset for analysis (features + target) target : str, optional Target column name. If None, will be inferred from model port : int, default=8050 Port for Streamlit server title : str, optional Dashboard title. If None, uses model name

Examples

import polars as pl from uncertainty_flow.models import QuantileForestForecaster from uncertainty_flow.viz import launch_dashboard

model = QuantileForestForecaster(targets="demand", horizon=7) model.fit(train_data)

Launch dashboard

launch_dashboard(model, test_data, port=8050)

Notes

Requires streamlit as an optional dependency: pip install uncertainty-flow[ml]

The dashboard includes
  • Calibration curves (coverage vs. confidence)
  • Interval width distribution
  • Residual analysis plots
  • Feature-uncertainty relationships
  • Time series fan charts
  • Leverage analysis reports
Source code in uncertainty_flow/viz/dashboard.py
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
def launch_dashboard(
    model: "BaseUncertaintyModel",
    data: pl.DataFrame,
    target: str | None = None,
    port: int = 8050,
    title: str | None = None,
) -> None:
    """
    Launch interactive Streamlit dashboard for uncertainty exploration.

    Provides visualizations for calibration, prediction intervals,
    residual analysis, feature-uncertainty relationships, and more.

    Parameters
    ----------
    model : BaseUncertaintyModel
        Fitted uncertainty model with predict() method
    data : pl.DataFrame
        Dataset for analysis (features + target)
    target : str, optional
        Target column name. If None, will be inferred from model
    port : int, default=8050
        Port for Streamlit server
    title : str, optional
        Dashboard title. If None, uses model name

    Examples
    --------
    >>> import polars as pl
    >>> from uncertainty_flow.models import QuantileForestForecaster
    >>> from uncertainty_flow.viz import launch_dashboard
    >>>
    >>> model = QuantileForestForecaster(targets="demand", horizon=7)
    >>> model.fit(train_data)
    >>>
    >>> # Launch dashboard
    >>> launch_dashboard(model, test_data, port=8050)

    Notes
    -----
    Requires streamlit as an optional dependency:
        pip install uncertainty-flow[ml]

    The dashboard includes:
        - Calibration curves (coverage vs. confidence)
        - Interval width distribution
        - Residual analysis plots
        - Feature-uncertainty relationships
        - Time series fan charts
        - Leverage analysis reports
    """
    if model is None:
        raise ValueError("model is required")
    if data.is_empty():
        raise ValueError("data must contain at least one row")

    try:
        import streamlit as st
    except ImportError:
        raise ImportError(
            "streamlit is required for the dashboard. Install with: pip install streamlit"
        )

    # Set page config
    if title is None:
        title = f"Uncertainty Analysis Dashboard - {model.__class__.__name__}"

    st.set_page_config(
        page_title="Uncertainty Analysis",
        layout="wide",
        initial_sidebar_state="expanded",
    )

    st.title(title)

    # Sidebar controls
    st.sidebar.header("Configuration")

    # Confidence level slider
    confidence = st.sidebar.slider(
        "Confidence Level",
        min_value=0.5,
        max_value=0.99,
        value=0.9,
        step=0.01,
        help="Confidence level for prediction intervals",
    )

    # Sample size for plots
    max_samples = st.sidebar.slider(
        "Max Samples for Plots",
        min_value=50,
        max_value=5000,
        value=1000,
        step=50,
        help="Maximum number of samples to display in plots",
    )

    # Infer target if not provided
    if target is None and hasattr(model, "_targets"):
        targets = model._targets
        if targets and len(targets) == 1:
            target = targets[0]

    if target is None:
        st.error("Could not infer target column. Please specify 'target' parameter.")
        return

    # Separate features and target
    feature_cols = [col for col in data.columns if col != target]
    features = data.select(feature_cols)
    y_true = data[target]

    # Downsample if needed
    if len(features) > max_samples:
        indices = np.linspace(0, len(features) - 1, max_samples, dtype=int)
        features = features[indices]
        y_true = y_true[indices]

    # Generate predictions
    with st.spinner("Generating predictions..."):
        predictions = model.predict(features)

    # Main content tabs
    tab1, tab2, tab3, tab4, tab5 = st.tabs(
        ["Calibration", "Intervals", "Residuals", "Feature Analysis", "Summary"]
    )

    with tab1:
        _render_calibration_tab(predictions, y_true, confidence)

    with tab2:
        _render_intervals_tab(predictions, y_true, confidence)

    with tab3:
        _render_residuals_tab(predictions, y_true, features, confidence)

    with tab4:
        _render_feature_analysis_tab(predictions, y_true, features, confidence)

    with tab5:
        _render_summary_tab(model, predictions, y_true, confidence)