pkiage's picture
Initial commit
232e5e5
raw
history blame
No virus
3.68 kB
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,
)