Paul Kiage
Hugging Face Deployment Setup (#11)
7d861ad unverified
from common.data import SplitDataset
import streamlit as st
import pandas as pd
import plotly.express as px
from views.threshold import logistic_threshold_view
from views.evaluation import logistic_evaluation_view
from common.util import (
test_variables_logistic,
print_coeff_logistic,
model_probability_values_df,
apply_threshold_to_probability_values,
)
from common.views import (
streamlit_2columns_metrics_df,
streamlit_2columns_metrics_pct_df,
)
from views.typing import ModelView
def logistic_view(split_dataset: SplitDataset, currency: str) -> ModelView:
# ### Test and create variables logically
st.header("Logistic Regression")
clf_logistic_model = test_variables_logistic(
split_dataset.X_train, split_dataset.y_train
)
st.metric(
label="# of Coefficients in Logistic Regression",
value=clf_logistic_model.n_features_in_,
delta=None,
delta_color="normal",
)
coef_dict = print_coeff_logistic(clf_logistic_model, split_dataset)
st.subheader("Logistic Regression Coefficient Values")
coef_dict_sorted = dict(
sorted(coef_dict.items(), key=lambda item: item[1], reverse=False)
)
data_items = coef_dict_sorted.items()
data_list = list(data_items)
df = pd.DataFrame(data_list, columns=["Coefficient", "Value"])
fig1 = px.bar(data_frame=df, x="Value", y="Coefficient", orientation="h")
fig1.update_layout(
title="Logistic Regression Coefficients",
xaxis_title="Value",
yaxis_title="Coefficient",
)
st.plotly_chart(fig1)
st.subheader("Classification Probability Threshold")
st.write(
"""
The logistic regression model (obtained using training data) is applied on testing data to predict the loans probabilities of defaulting.\n
Probabilities of defaulting of the loans are compared to a probability threshold.\n
A loan is predicted to default if its predicted probability of defaulting is greater than the probability threshold.
"""
)
threshold = st.slider(
label="Default Probability Threshold:",
min_value=0.0,
max_value=1.0,
value=0.7,
key="key_threshold",
)
clf_prediction_prob_df_log = model_probability_values_df(
clf_logistic_model,
split_dataset.X_test,
)
clf_thresh_predicted_default_status_user = (
apply_threshold_to_probability_values(
clf_prediction_prob_df_log,
threshold,
)
)
streamlit_2columns_metrics_df(
"# of Predicted Defaults",
"# of Predicted Non-Default",
clf_thresh_predicted_default_status_user,
)
streamlit_2columns_metrics_pct_df(
"% of Loans Predicted to Default",
"% of Loans Predicted not to Default",
clf_thresh_predicted_default_status_user,
)
threshold = logistic_threshold_view(clf_logistic_model, split_dataset)
df_trueStatus_probabilityDefault_threshStatus_loanAmount = (
logistic_evaluation_view(
clf_logistic_model,
split_dataset,
currency,
threshold.probability_threshold_selected,
threshold.predicted_default_status,
)
)
return ModelView(
model=clf_logistic_model,
trueStatus_probabilityDefault_threshStatus_loanAmount_df=df_trueStatus_probabilityDefault_threshStatus_loanAmount,
probability_threshold_selected=threshold.probability_threshold_selected,
predicted_default_status=threshold.predicted_default_status,
prediction_probability_df=threshold.prediction_probability_df,
)