File size: 9,218 Bytes
2770544 |
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 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 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
## IMPORTING LIBS
import pandas as pd
import plotly.express as px
from sklearn.metrics import f1_score, precision_score, recall_score, confusion_matrix
import pickle
import gradio as gr
## CREATING FUNCTION
def predict_credit_worthiness(name, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22):
path = 'german_credit_risk/model/model.pickle'
greet = 'Hey, ' + name + '!'
with open(path, 'rb') as file:
model = pickle.load(file)
inputs = {'Account Balance_1': int(x1),
'Account Balance_2': int(x2),
'Account Balance_3': int(x3),
'Payment Status of Previous Credit_1': int(x4),
'Payment Status of Previous Credit_3': int(x5),
'Purpose_1': int(x6),
'Purpose_4': int(x7),
'Value Savings/Stocks_1': int(x8),
'Value Savings/Stocks_3': int(x9),
'Value Savings/Stocks_5': int(x10),
'Length of current employment_1': int(x11),
'Length of current employment_4': int(x12),
'Instalment per cent_4': int(x13),
'Guarantors_1': int(x14),
'Duration in Current address_1': int(x15),
'Duration in Current address_2': int(x16),
'Most valuable available asset_1': int(x17),
'Most valuable available asset_4': int(x18),
'Concurrent Credits_3': int(x19),
'Type of apartment_1': int(x20),
'No of Credits at this Bank_1': int(x21),
'Occupation_1': int(x22)
}
prediction = model.predict([list(inputs.values())])
y_test = pd.read_parquet('german_credit_risk/data/processed/y_test.parquet')
y_test = y_test.squeeze()
yhat = pd.read_parquet('german_credit_risk/data/processed/yhat.parquet')
yhat = yhat.squeeze()
precision = precision_score(y_test, yhat).round(2)
recall = recall_score(y_test, yhat).round(2)
f1 = f1_score(y_test, yhat).round(2)
features_names = ['No account', 'No balance', 'Some balance', 'No credit problems',
'Some credit problems', 'New car', 'Other purpose', 'No savings',
'DM betwenn [100, 1000]', 'DM >= 1000', 'Employment: <1 year (or unemployed)', 'Employment: 4<x<7 years',
'Installment smaller than 20%', 'No guarantors', 'Less than a year in same address', '1<x<4 years in address',
'Not available / no assets', 'Ownership of house or land', 'No further running credits', 'Free ap',
'One credit at thins bank','Unemployed or unskilled']
importance = model.feature_importances_
data = pd.DataFrame()
data['Feature Importance'] = importance
data['Feature'] = features_names
p = px.bar(data, y='Feature Importance', x='Feature', width=1200, height=500)
cfm = confusion_matrix(y_test, yhat)
cfm_plot = px.imshow(cfm,
x=['Predicted 0', 'Predicted 1'],
y=['Actual 0', 'Actual 1'],
color_continuous_scale='Blues',
labels=dict(x="Predicted", y="Actual", color="Count"),
text_auto=True)
if prediction == 1:
return (greet + ' According to our model, your client is eligible for the loan.',
'Precision: '+ str(precision),
'Recall: '+ str(recall),
'F1 Score: '+ str(f1),
p,
cfm_plot)
else:
return (greet + ' Unfortunately, according to our model, your client is not eligible for the loan for now :(.',
'Precision: '+ str(precision),
'Recall: '+ str(recall),
'F1 Score: '+ str(f1),
p,
cfm_plot)
## creating the interface
with gr.Blocks() as demo:
gr.Markdown('# Credit Worthiness Prediction')
gr.Markdown("""
To predict our clients' creditworthiness, please use this application as follows:
1. Enter your name and navigate through the client's information tabs. Select the boxes that best match your client's characteristics. Leave blank if none apply.
2. Once completed, click 'Predict' to determine if the client is creditworthy.
""")
with gr.Accordion('Name'):
name = gr.Textbox(lines=1, label='Your name')
with gr.Accordion("Enter your client's information"):
with gr.Tab('Account Balance'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x1 = gr.Checkbox(1, label='No account')
x2 = gr.Checkbox(0, label='No balance')
x3 = gr.Checkbox(0, label='Some balance')
with gr.Tab('Payment status of previous credit'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x4 = gr.Checkbox(1, label='Some problems')
x5 = gr.Checkbox(0, label='No problems in this bank')
with gr.Tab('Purpose'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x6 = gr.Checkbox(1, label='New car')
x7 = gr.Checkbox(0, label='Other')
with gr.Tab('Value savings/stocks'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x8 = gr.Checkbox(1, label='No savings')
x9 = gr.Checkbox(0, label='DM betwenn [100, 1000]')
x10 = gr.Checkbox(0, label='DM >= 1000')
with gr.Tab('Length of current employment'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x11 = gr.Checkbox(1, label='Below 1 year (or unemployed)')
x12 = gr.Checkbox(0, label='Between 4 and 7 years')
with gr.Tab('Instalment per cent'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x13 = gr.Checkbox(0, label='Smaller than 20%')
with gr.Tab('Guarantors'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x14 = gr.Checkbox(0, label='No guarantors')
with gr.Tab('Duration in current address'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x15 = gr.Checkbox(1, label='Less than a year')
x16 = gr.Checkbox(0, label='Between 1 and 4 years')
with gr.Tab('Most valuable available asset'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x17 = gr.Checkbox(1, label='Not available / no assets')
x18 = gr.Checkbox(0, label='Ownership of house or land')
with gr.Tab('Concurrent credits'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x19 = gr.Checkbox(0, label='No further running credits')
with gr.Tab('Type of apartment'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x20 = gr.Checkbox(0, label='Free apartment')
with gr.Tab('Number of credits at this Bank'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x21 = gr.Checkbox(0, label='One credit')
with gr.Tab('Occupation'):
gr.Markdown('Select only one option. Leave all boxes blank if none of the options fits the client.')
x22 = gr.Checkbox(0, label='Unemployed or unskilled with no permanent')
predict_button = gr.Button('Predict')
prediction_output = gr.Label(num_top_classes=2)
with gr.Accordion('Metrics and plots'):
with gr.Tab('Metrics'):
with gr.Row():
precision_output = gr.Label()
with gr.Row():
recall_output = gr.Label()
with gr.Row():
f1_output = gr.Label()
with gr.Tab('Feature Importances'):
fimp_output = gr.Plot()
with gr.Tab('Confusion Matrix'):
cfm_output = gr.Plot()
predict_button.click(fn=predict_credit_worthiness,
inputs=[name, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22],
outputs=[prediction_output,precision_output, recall_output, f1_output, fimp_output, cfm_output])
gr.Markdown('''
Want to work in a project together or have interest in my services? Reach me:
[Linkedin](https://www.linkedin.com/in/marcilioduarte98/)
[Github](https://github.com/marcilioduarte)
@marcilioduarte | Economics and Data Science
''')
demo.launch() |