File size: 2,498 Bytes
232e5e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
from typing import OrderedDict
import streamlit as st
from sklearn.metrics import roc_auc_score
from common.data import SplitDataset
from common.views import (
    roc_auc_compare_n_models,
    streamlit_chart_setting_height_width,
    calibration_curve_report_commented_n,
)
from views.typing import ModelView


def roc_auc_for_model(split_dataset: SplitDataset, model_view: ModelView):
    roc_auc_model = roc_auc_score(
        split_dataset.y_test, model_view.predicted_default_status
    )

    if roc_auc_model > 0.9:
        roc_auc_lvl = f'Very good {"{:.2f}".format(roc_auc_model)} > 0.9)'
    elif 0.8 < roc_auc_model < 0.9:
        roc_auc_lvl = f'Good (0.8 < {"{:.2f}".format(roc_auc_model)} <0.9)'
    elif 0.7 < roc_auc_model < 0.8:
        roc_auc_lvl = f'Fair (0.7 <  {"{:.2f}".format(roc_auc_model)} < 0.8)'
    elif 0.6 < roc_auc_model < 0.7:
        roc_auc_lvl = f'Poor (0.6 <  {"{:.2f}".format(roc_auc_model)} < 0.7)'
    else:
        roc_auc_lvl = f'Fail ( {"{:.2f}".format(roc_auc_model)} < 0.6)'

    return roc_auc_model, roc_auc_lvl


def model_comparison_view(
    split_dataset: SplitDataset,
    model_views: OrderedDict[str, ModelView],
):
    st.header("Model Comparison")

    for model_name, model_view in model_views.items():
        roc_auc_model, roc_auc_lvl = roc_auc_for_model(
            split_dataset, model_view
        )
        st.subheader(
            f"Receiver Operating Characteristic (ROC) Curve - {model_name}"
        )
        st.markdown(
            f'Area Under the Receiver Operating Characteristic Curve from prediction scores from "{model_name}" model is {roc_auc_model}.\n'
        )
        st.markdown(
            f'The score of {"{:.2f}".format(roc_auc_model)} is in the {roc_auc_lvl} ROC AUC score category.'
        )
    fig1 = roc_auc_compare_n_models(
        split_dataset.y_test,
        model_views,
    )

    fig1 = fig1.figure

    (xsize_roc, ysize_roc) = streamlit_chart_setting_height_width(
        "Chart Settings", 7, 7, "xsize_roc", "ysize_roc"
    )

    fig1.set_size_inches(xsize_roc, ysize_roc)

    st.pyplot(fig1)

    st.subheader("Models Calibration Curve")

    fig2 = calibration_curve_report_commented_n(
        split_dataset.y_test,
        model_views,
        10,
    )
    fig2 = fig2.figure

    (xsize_cal, ysize_cal) = streamlit_chart_setting_height_width(
        "Chart Settings", 7, 7, "xsize_cal", "ysize_cal"
    )

    fig2.set_size_inches(xsize_cal, ysize_cal)

    st.pyplot(fig2.figure)